--- a
+++ b/src/sysvshm.h
@@ -0,0 +1,70 @@
+/* Copyright (C) 2017-2018 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifndef _SYSVIPC_H_INCLUDED_
+#define _SYSVIPC_H_INCLUDED_
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <sys/sem.h>
+#include <sys/shm.h>
+
+class ShmSeg {
+public:
+    ShmSeg(key_t ky, size_t size, bool create = false, int perms = 0600);
+    ShmSeg(const char*pathname, int proj_id, size_t size,  bool create = false, int perms = 0600);
+    ShmSeg(int size) : ShmSeg(IPC_PRIVATE, size) {}
+    virtual ~ShmSeg();
+    virtual void setremove(bool onoff = true);
+    virtual void *getseg();
+    virtual size_t getsize();
+    virtual bool ok();
+
+    class Internal;
+protected:
+    Internal *m;
+};
+
+// Shm segment with integrated lock. Note that the lock initialization
+// is not protected, and that an external method is needed for the
+// creating process to be left alone while it is creating the segment
+// and initializing the lock.
+// 
+// You need to use an Accessor object to get to the segment. This
+// takes the lock on construction and releases it on deletion
+class LockableShmSeg : public ShmSeg {
+public:
+    LockableShmSeg(key_t ky, size_t size, bool create = false, int perms = 0600);
+    LockableShmSeg(const char*pathname, int proj_id, size_t size,
+                    bool create = false, int perms = 0600);
+    LockableShmSeg(int size) : LockableShmSeg(IPC_PRIVATE, size) {}
+    virtual ~LockableShmSeg();
+    class Accessor {
+    public:
+        Accessor(LockableShmSeg&);
+        ~Accessor();
+        void *getseg();
+    private:
+        LockableShmSeg& lss;
+    };
+    friend class Accessor;
+private:
+    virtual void *getseg();
+};
+
+#endif /* _SYSVIPC_H_INCLUDED_ */