20 #include "JackError.h"
21 #include "JackShmMem.h"
27 static unsigned int fSegmentNum = 0;
29 size_t JackMem::gSize = 0;
31 JackShmMem::JackShmMem()
33 JackShmMemAble::Init();
37 JackShmMem::~JackShmMem()
42 void JackShmMemAble::Init()
44 fInfo.index = gInfo.index;
45 fInfo.ptr.attached_at = gInfo.ptr.attached_at;
46 fInfo.size = gInfo.size;
49 void* JackShmMem::operator
new(
size_t size,
void* memory)
51 jack_log(
"JackShmMem::new placement size = %ld", size);
55 void* JackShmMem::operator
new(
size_t size)
61 snprintf(name,
sizeof(name),
"/jack_shared%d", fSegmentNum++);
63 if (jack_shmalloc(name, size, &info)) {
64 jack_error(
"Cannot create shared memory segment of size = %d", size, strerror(errno));
68 if (jack_attach_shm(&info)) {
69 jack_error(
"Cannot attach shared memory segment name = %s err = %s", name, strerror(errno));
70 jack_destroy_shm(&info);
74 obj = (JackShmMem*)jack_shm_addr(&info);
77 gInfo.index = info.index;
79 gInfo.ptr.attached_at = info.ptr.attached_at;
81 jack_log(
"JackShmMem::new index = %ld attached = %x size = %ld ", info.index, info.ptr.attached_at, size);
86 throw std::bad_alloc();
89 void JackShmMem::operator
delete(
void* p,
size_t size)
92 JackShmMem* obj = (JackShmMem*)p;
93 info.index = obj->fInfo.index;
94 info.ptr.attached_at = obj->fInfo.ptr.attached_at;
96 jack_log(
"JackShmMem::delete size = %ld index = %ld", size, info.index);
98 jack_release_shm(&info);
99 jack_destroy_shm(&info);
102 void JackShmMem::operator
delete(
void* obj)
105 JackShmMem::operator
delete(obj, 0);
109 void LockMemoryImp(
void* ptr,
size_t size)
111 if (CHECK_MLOCK((
char*)ptr, size)) {
112 jack_log(
"Succeeded in locking %u byte memory area", size);
114 jack_error(
"Cannot lock down %u byte memory area (%s)", size, strerror(errno));
118 void InitLockMemoryImp(
void* ptr,
size_t size)
120 if (CHECK_MLOCK((
char*)ptr, size)) {
121 memset(ptr, 0, size);
122 jack_log(
"Succeeded in locking %u byte memory area", size);
124 jack_error(
"Cannot lock down %u byte memory area (%s)", size, strerror(errno));
128 void UnlockMemoryImp(
void* ptr,
size_t size)
130 if (CHECK_MUNLOCK((
char*)ptr, size)) {
131 jack_log(
"Succeeded in unlocking %u byte memory area", size);
133 jack_error(
"Cannot unlock down %u byte memory area (%s)", size, strerror(errno));
139 if (CHECK_MLOCKALL()) {
140 jack_log(
"Succeeded in locking all memory");
142 jack_error(
"Cannot lock all memory (%s)", strerror(errno));
146 void UnlockAllMemory()
148 if (CHECK_MUNLOCKALL()) {
149 jack_log(
"Succeeded in unlocking all memory");
151 jack_error(
"Cannot unlock all memory (%s)", strerror(errno));
SERVER_EXPORT void jack_error(const char *fmt,...)
SERVER_EXPORT void jack_log(const char *fmt,...)