20 #ifndef __JackShmMem__
21 #define __JackShmMem__
24 #include "JackError.h"
25 #include "JackCompilerDeps.h"
31 #include "JackShmMem_os.h"
36 void LockMemoryImp(
void* ptr,
size_t size);
37 void InitLockMemoryImp(
void* ptr,
size_t size);
38 void UnlockMemoryImp(
void* ptr,
size_t size);
40 void UnlockAllMemory();
58 void*
operator new(
size_t size)
61 return calloc(1, size);
64 void operator delete(
void* ptr,
size_t size)
71 LockMemoryImp(
this, fSize);
76 UnlockMemoryImp(
this, fSize);
102 char* GetShmAddress()
104 return (
char*)fInfo.ptr.attached_at;
109 LockMemoryImp(
this, fInfo.size);
114 UnlockMemoryImp(
this, fInfo.size);
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);
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();
164 if (jack_attach_lib_shm(&fInfo)) {
165 throw std::bad_alloc();
167 GetShmAddress()->LockMemory();
178 fInfo.ptr.attached_at = (
char*)NULL;
183 Init(index, server_name);
189 jack_error(
"JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for %d, skipping unlock", fInfo.index);
192 if (fInfo.index >= 0) {
193 jack_log(
"JackShmReadWritePtr::~JackShmReadWritePtr %d", fInfo.index);
194 GetShmAddress()->UnlockMemory();
195 jack_release_lib_shm(&fInfo);
200 T* operator->()
const
202 return (T*)fInfo.ptr.attached_at;
207 return (T*)fInfo.ptr.attached_at;
216 void SetShmIndex(
int index,
const char* server_name)
218 Init(index, server_name);
228 return (T*)fInfo.ptr.attached_at;
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();
253 if (jack_attach_lib_shm(&fInfo)) {
254 throw std::bad_alloc();
256 GetShmAddress()->LockMemory();
263 jack_destroy_shm(&fInfo);
273 fInfo.ptr.attached_at = NULL;
278 Init(index, server_name);
284 jack_error(
"JackShmReadWritePtr1::~JackShmReadWritePtr1 - Init not done for %d, skipping unlock", fInfo.index);
287 if (fInfo.index >= 0) {
288 jack_log(
"JackShmReadWritePtr1::~JackShmReadWritePtr1 %d", fInfo.index);
289 GetShmAddress()->UnlockMemory();
290 jack_release_lib_shm(&fInfo);
295 T* operator->()
const
297 return (T*)fInfo.ptr.attached_at;
302 return (T*)fInfo.ptr.attached_at;
311 void SetShmIndex(
int index,
const char* server_name)
313 Init(index, server_name);
323 return (T*)fInfo.ptr.attached_at;
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();
348 if (jack_attach_lib_shm_read(&fInfo)) {
349 throw std::bad_alloc();
351 GetShmAddress()->LockMemory();
362 fInfo.ptr.attached_at = NULL;
367 Init(index, server_name);
373 jack_error(
"JackShmReadPtr::~JackShmReadPtr - Init not done for %ld, skipping unlock", fInfo.index);
376 if (fInfo.index >= 0) {
377 jack_log(
"JackShmPtrRead::~JackShmPtrRead %ld", fInfo.index);
378 GetShmAddress()->UnlockMemory();
379 jack_release_lib_shm(&fInfo);
384 T* operator->()
const
386 return (T*)fInfo.ptr.attached_at;
391 return (T*)fInfo.ptr.attached_at;
400 void SetShmIndex(
int index,
const char* server_name)
402 Init(index, server_name);
412 return (T*)fInfo.ptr.attached_at;