merge new MTDM code from Fons' latest release.
[jack2.git] / common / JackShmMem.h
blob1905b321d01221d490bd7370328a39f3cebb2d7f
1 /*
2 Copyright (C) 2004-2008 Grame
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as published by
6 the Free Software Foundation; either version 2.1 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 #ifndef __JackShmMem__
21 #define __JackShmMem__
23 #include "shm.h"
24 #include "JackError.h"
25 #include "JackCompilerDeps.h"
27 #include <new> // GCC 4.0
28 #include <errno.h>
29 #include <stdlib.h>
31 #include "JackShmMem_os.h"
33 namespace Jack
36 void LockMemoryImp(void* ptr, size_t size);
37 void InitLockMemoryImp(void* ptr, size_t size);
38 void UnlockMemoryImp(void* ptr, size_t size);
39 void LockAllMemory();
40 void UnlockAllMemory();
42 class JackMem
44 private:
46 size_t fSize;
47 static size_t gSize;
49 protected:
51 JackMem(): fSize(gSize)
53 ~JackMem()
56 public:
58 void* operator new(size_t size)
60 gSize = size;
61 return calloc(1, size);
64 void operator delete(void* ptr, size_t size)
66 free(ptr);
69 void LockMemory()
71 LockMemoryImp(this, fSize);
74 void UnlockMemory()
76 UnlockMemoryImp(this, fSize);
81 /*!
82 \brief
84 A class which objects possibly want to be allocated in shared memory derives from this class.
87 class JackShmMemAble
89 protected:
91 jack_shm_info_t fInfo;
93 public:
95 void Init();
97 int GetShmIndex()
99 return fInfo.index;
102 char* GetShmAddress()
104 return (char*)fInfo.ptr.attached_at;
107 void LockMemory()
109 LockMemoryImp(this, fInfo.size);
112 void UnlockMemory()
114 UnlockMemoryImp(this, fInfo.size);
120 \brief The base class for shared memory management.
122 A class which objects need to be allocated in shared memory derives from this class.
125 class SERVER_EXPORT JackShmMem : public JackShmMemAble
128 protected:
130 JackShmMem();
131 ~JackShmMem();
133 public:
135 void* operator new(size_t size);
136 void* operator new(size_t size, void* memory);
138 void operator delete(void* p, size_t size);
139 void operator delete(void* p);
144 \brief Pointer on shared memory segment in the client side.
147 template <class T>
148 class JackShmReadWritePtr
151 private:
153 jack_shm_info_t fInfo;
155 void Init(int index, const char* server_name = "default")
157 if (fInfo.index < 0 && index >= 0) {
158 jack_log("JackShmReadWritePtr::Init %ld %ld", index, fInfo.index);
159 if (jack_initialize_shm(server_name) < 0) {
160 throw std::bad_alloc();
162 fInfo.index = index;
163 if (jack_attach_lib_shm(&fInfo)) {
164 throw std::bad_alloc();
166 GetShmAddress()->LockMemory();
170 public:
172 JackShmReadWritePtr()
174 fInfo.index = -1;
175 fInfo.ptr.attached_at = (char*)NULL;
178 JackShmReadWritePtr(int index, const char* server_name)
180 Init(index, server_name);
183 ~JackShmReadWritePtr()
185 if (fInfo.index >= 0) {
186 jack_log("JackShmReadWritePtr::~JackShmReadWritePtr %ld", fInfo.index);
187 GetShmAddress()->UnlockMemory();
188 jack_release_lib_shm(&fInfo);
189 fInfo.index = -1;
193 T* operator->() const
195 return (T*)fInfo.ptr.attached_at;
198 operator T*() const
200 return (T*)fInfo.ptr.attached_at;
203 JackShmReadWritePtr& operator=(int index)
205 Init(index);
206 return *this;
209 void SetShmIndex(int index, const char* server_name)
211 Init(index, server_name);
214 int GetShmIndex()
216 return fInfo.index;
219 T* GetShmAddress()
221 return (T*)fInfo.ptr.attached_at;
226 \brief Pointer on shared memory segment in the client side: destroy the segment (used client control)
229 template <class T>
230 class JackShmReadWritePtr1
233 private:
235 jack_shm_info_t fInfo;
237 void Init(int index, const char* server_name = "default")
239 if (fInfo.index < 0 && index >= 0) {
240 jack_log("JackShmReadWritePtr1::Init %ld %ld", index, fInfo.index);
241 if (jack_initialize_shm(server_name) < 0) {
242 throw std::bad_alloc();
244 fInfo.index = index;
245 if (jack_attach_lib_shm(&fInfo)) {
246 throw std::bad_alloc();
248 GetShmAddress()->LockMemory();
250 nobody else needs to access this shared memory any more, so
251 destroy it. because we have our own attachment to it, it won't
252 vanish till we exit (and release it).
254 jack_destroy_shm(&fInfo);
258 public:
260 JackShmReadWritePtr1()
262 fInfo.index = -1;
263 fInfo.ptr.attached_at = NULL;
266 JackShmReadWritePtr1(int index, const char* server_name)
268 Init(index, server_name);
271 ~JackShmReadWritePtr1()
273 if (fInfo.index >= 0) {
274 jack_log("JackShmReadWritePtr1::~JackShmReadWritePtr1 %ld", fInfo.index);
275 GetShmAddress()->UnlockMemory();
276 jack_release_lib_shm(&fInfo);
277 fInfo.index = -1;
281 T* operator->() const
283 return (T*)fInfo.ptr.attached_at;
286 operator T*() const
288 return (T*)fInfo.ptr.attached_at;
291 JackShmReadWritePtr1& operator=(int index)
293 Init(index);
294 return *this;
297 void SetShmIndex(int index, const char* server_name)
299 Init(index, server_name);
302 int GetShmIndex()
304 return fInfo.index;
307 T* GetShmAddress()
309 return (T*)fInfo.ptr.attached_at;
314 \brief Pointer on shared memory segment in the client side.
317 template <class T>
318 class JackShmReadPtr
321 private:
323 jack_shm_info_t fInfo;
325 void Init(int index, const char* server_name = "default")
327 if (fInfo.index < 0 && index >= 0) {
328 jack_log("JackShmPtrRead::Init %ld %ld", index, fInfo.index);
329 if (jack_initialize_shm(server_name) < 0) {
330 throw std::bad_alloc();
332 fInfo.index = index;
333 if (jack_attach_lib_shm_read(&fInfo)) {
334 throw std::bad_alloc();
336 GetShmAddress()->LockMemory();
340 public:
342 JackShmReadPtr()
344 fInfo.index = -1;
345 fInfo.ptr.attached_at = NULL;
348 JackShmReadPtr(int index, const char* server_name)
350 Init(index, server_name);
353 ~JackShmReadPtr()
355 if (fInfo.index >= 0) {
356 jack_log("JackShmPtrRead::~JackShmPtrRead %ld", fInfo.index);
357 GetShmAddress()->UnlockMemory();
358 jack_release_lib_shm(&fInfo);
359 fInfo.index = -1;
363 T* operator->() const
365 return (T*)fInfo.ptr.attached_at;
368 operator T*() const
370 return (T*)fInfo.ptr.attached_at;
373 JackShmReadPtr& operator=(int index)
375 Init(index);
376 return *this;
379 void SetShmIndex(int index, const char* server_name)
381 Init(index, server_name);
384 int GetShmIndex()
386 return fInfo.index;
389 T* GetShmAddress()
391 return (T*)fInfo.ptr.attached_at;
396 } // end of namespace
398 #endif