Rename PortSetDeviceMetadata to PortSetDefaultMetadata
[jack2.git] / common / JackShmMem.h
blob046412304c75342a7db924cfa5113d76817a25c1
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;
154 bool fInitDone;
156 void Init(int index, const char* server_name = JACK_DEFAULT_SERVER_NAME)
158 if (fInfo.index < 0 && index >= 0) {
159 jack_log("JackShmReadWritePtr::Init %ld %d", index, fInfo.index);
160 if (jack_initialize_shm(server_name) < 0) {
161 throw std::bad_alloc();
163 fInfo.index = index;
164 if (jack_attach_lib_shm(&fInfo)) {
165 throw std::bad_alloc();
167 GetShmAddress()->LockMemory();
168 fInitDone = true;
172 public:
174 JackShmReadWritePtr()
176 fInfo.index = -1;
177 fInitDone = false;
178 fInfo.ptr.attached_at = (char*)NULL;
181 JackShmReadWritePtr(int index, const char* server_name)
183 Init(index, server_name);
186 ~JackShmReadWritePtr()
188 if (!fInitDone) {
189 jack_error("JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for %d, skipping unlock", fInfo.index);
190 return;
192 if (fInfo.index >= 0) {
193 jack_log("JackShmReadWritePtr::~JackShmReadWritePtr %d", fInfo.index);
194 GetShmAddress()->UnlockMemory();
195 jack_release_lib_shm(&fInfo);
196 fInfo.index = -1;
200 T* operator->() const
202 return (T*)fInfo.ptr.attached_at;
205 operator T*() const
207 return (T*)fInfo.ptr.attached_at;
210 JackShmReadWritePtr& operator=(int index)
212 Init(index);
213 return *this;
216 void SetShmIndex(int index, const char* server_name)
218 Init(index, server_name);
221 int GetShmIndex()
223 return fInfo.index;
226 T* GetShmAddress()
228 return (T*)fInfo.ptr.attached_at;
233 \brief Pointer on shared memory segment in the client side: destroy the segment (used client control)
236 template <class T>
237 class JackShmReadWritePtr1
240 private:
242 jack_shm_info_t fInfo;
243 bool fInitDone;
245 void Init(int index, const char* server_name = JACK_DEFAULT_SERVER_NAME)
247 if (fInfo.index < 0 && index >= 0) {
248 jack_log("JackShmReadWritePtr1::Init %ld %d", index, fInfo.index);
249 if (jack_initialize_shm(server_name) < 0) {
250 throw std::bad_alloc();
252 fInfo.index = index;
253 if (jack_attach_lib_shm(&fInfo)) {
254 throw std::bad_alloc();
256 GetShmAddress()->LockMemory();
257 fInitDone = true;
259 nobody else needs to access this shared memory any more, so
260 destroy it. because we have our own attachment to it, it won't
261 vanish till we exit (and release it).
263 jack_destroy_shm(&fInfo);
267 public:
269 JackShmReadWritePtr1()
271 fInfo.index = -1;
272 fInitDone = false;
273 fInfo.ptr.attached_at = NULL;
276 JackShmReadWritePtr1(int index, const char* server_name)
278 Init(index, server_name);
281 ~JackShmReadWritePtr1()
283 if (!fInitDone) {
284 jack_error("JackShmReadWritePtr1::~JackShmReadWritePtr1 - Init not done for %d, skipping unlock", fInfo.index);
285 return;
287 if (fInfo.index >= 0) {
288 jack_log("JackShmReadWritePtr1::~JackShmReadWritePtr1 %d", fInfo.index);
289 GetShmAddress()->UnlockMemory();
290 jack_release_lib_shm(&fInfo);
291 fInfo.index = -1;
295 T* operator->() const
297 return (T*)fInfo.ptr.attached_at;
300 operator T*() const
302 return (T*)fInfo.ptr.attached_at;
305 JackShmReadWritePtr1& operator=(int index)
307 Init(index);
308 return *this;
311 void SetShmIndex(int index, const char* server_name)
313 Init(index, server_name);
316 int GetShmIndex()
318 return fInfo.index;
321 T* GetShmAddress()
323 return (T*)fInfo.ptr.attached_at;
328 \brief Pointer on shared memory segment in the client side.
331 template <class T>
332 class JackShmReadPtr
335 private:
337 jack_shm_info_t fInfo;
338 bool fInitDone;
340 void Init(int index, const char* server_name = JACK_DEFAULT_SERVER_NAME)
342 if (fInfo.index < 0 && index >= 0) {
343 jack_log("JackShmPtrRead::Init %ld %d", index, fInfo.index);
344 if (jack_initialize_shm(server_name) < 0) {
345 throw std::bad_alloc();
347 fInfo.index = index;
348 if (jack_attach_lib_shm_read(&fInfo)) {
349 throw std::bad_alloc();
351 GetShmAddress()->LockMemory();
352 fInitDone = true;
356 public:
358 JackShmReadPtr()
360 fInfo.index = -1;
361 fInitDone = false;
362 fInfo.ptr.attached_at = NULL;
365 JackShmReadPtr(int index, const char* server_name)
367 Init(index, server_name);
370 ~JackShmReadPtr()
372 if (!fInitDone) {
373 jack_error("JackShmReadPtr::~JackShmReadPtr - Init not done for %ld, skipping unlock", fInfo.index);
374 return;
376 if (fInfo.index >= 0) {
377 jack_log("JackShmPtrRead::~JackShmPtrRead %ld", fInfo.index);
378 GetShmAddress()->UnlockMemory();
379 jack_release_lib_shm(&fInfo);
380 fInfo.index = -1;
384 T* operator->() const
386 return (T*)fInfo.ptr.attached_at;
389 operator T*() const
391 return (T*)fInfo.ptr.attached_at;
394 JackShmReadPtr& operator=(int index)
396 Init(index);
397 return *this;
400 void SetShmIndex(int index, const char* server_name)
402 Init(index, server_name);
405 int GetShmIndex()
407 return fInfo.index;
410 T* GetShmAddress()
412 return (T*)fInfo.ptr.attached_at;
417 } // end of namespace
419 #endif