00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "JackError.h"
00022 #include "JackShmMem.h"
00023 #include <stdio.h>
00024
00025 namespace Jack
00026 {
00027
00028 static unsigned int fSegmentNum = 0;
00029 static jack_shm_info_t gInfo;
00030 size_t JackMem::gSize = 0;
00031
00032 JackShmMem::JackShmMem()
00033 {
00034 JackShmMemAble::Init();
00035 }
00036
00037 void JackShmMemAble::Init()
00038 {
00039 fInfo.index = gInfo.index;
00040 fInfo.attached_at = gInfo.attached_at;
00041 fInfo.size = gInfo.size;
00042 }
00043
00044 void* JackShmMem::operator new(size_t size, void* memory)
00045 {
00046 jack_log("JackShmMem::new placement size = %ld", size);
00047 return memory;
00048 }
00049
00050 void* JackShmMem::operator new(size_t size)
00051 {
00052 jack_shm_info_t info;
00053 JackShmMem* obj;
00054 char name[64];
00055
00056 snprintf(name, sizeof(name), "/jack_shared%d", fSegmentNum++);
00057
00058 if (jack_shmalloc(name, size, &info)) {
00059 jack_error("cannot create shared memory segment of size = %d", size, strerror(errno));
00060 goto error;
00061 }
00062
00063 if (jack_attach_shm(&info)) {
00064 jack_error("cannot attach shared memory segment name = %s err = %s", name, strerror(errno));
00065 jack_destroy_shm(&info);
00066 goto error;
00067 }
00068
00069 obj = (JackShmMem*)jack_shm_addr(&info);
00070
00071
00072 gInfo.index = info.index;
00073 gInfo.size = size;
00074 gInfo.attached_at = info.attached_at;
00075
00076 jack_log("JackShmMem::new index = %ld attached = %x size = %ld ", info.index, info.attached_at, size);
00077 return obj;
00078
00079 error:
00080 jack_error("JackShmMem::new bad alloc", size);
00081 throw std::bad_alloc();
00082 }
00083
00084 void JackShmMem::operator delete(void* p, size_t size)
00085 {
00086 jack_shm_info_t info;
00087 JackShmMem* obj = (JackShmMem*)p;
00088 info.index = obj->fInfo.index;
00089 info.attached_at = obj->fInfo.attached_at;
00090
00091 jack_log("JackShmMem::delete size = %ld index = %ld", size, info.index);
00092
00093 jack_release_shm(&info);
00094 jack_destroy_shm(&info);
00095 }
00096
00097 void JackShmMem::operator delete(void* obj)
00098 {
00099 if (obj)
00100 JackShmMem::operator delete(obj, 0);
00101 }
00102
00103 void LockMemoryImp(void* ptr, size_t size)
00104 {
00105 if (CHECK_MLOCK((char*)ptr, size)) {
00106 jack_log("Succeeded in locking %u byte memory area", size);
00107 } else {
00108 jack_error("Cannot lock down memory area (%s)", strerror(errno));
00109 }
00110 }
00111
00112 void InitLockMemoryImp(void* ptr, size_t size)
00113 {
00114 if (CHECK_MLOCK((char*)ptr, size)) {
00115 memset(ptr, 0, size);
00116 jack_log("Succeeded in locking %u byte memory area", size);
00117 } else {
00118 jack_error("Cannot lock down memory area (%s)", strerror(errno));
00119 }
00120 }
00121
00122 void UnlockMemoryImp(void* ptr, size_t size)
00123 {
00124 if (CHECK_MUNLOCK((char*)ptr, size)) {
00125 jack_log("Succeeded in unlocking %u byte memory area", size);
00126 } else {
00127 jack_error("Cannot unlock down memory area (%s)", strerror(errno));
00128 }
00129 }
00130
00131 void LockAllMemory()
00132 {
00133 if (CHECK_MLOCKALL()) {
00134 jack_log("Succeeded in locking all memory");
00135 } else {
00136 jack_error("Cannot lock all memory (%s)", strerror(errno));
00137 }
00138 }
00139
00140 void UnlockAllMemory()
00141 {
00142 if (CHECK_MUNLOCKALL()) {
00143 jack_log("Succeeded in unlocking all memory");
00144 } else {
00145 jack_error("Cannot unlock all memory (%s)", strerror(errno));
00146 }
00147 }
00148
00149
00150 }
00151