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 LockMemory();
00036 }
00037
00038 JackShmMem::~JackShmMem()
00039 {
00040 UnlockMemory();
00041 }
00042
00043 void JackShmMemAble::Init()
00044 {
00045 fInfo.index = gInfo.index;
00046 fInfo.ptr.attached_at = gInfo.ptr.attached_at;
00047 fInfo.size = gInfo.size;
00048 }
00049
00050 void* JackShmMem::operator new(size_t size, void* memory)
00051 {
00052 jack_log("JackShmMem::new placement size = %ld", size);
00053 return memory;
00054 }
00055
00056 void* JackShmMem::operator new(size_t size)
00057 {
00058 jack_shm_info_t info;
00059 JackShmMem* obj;
00060 char name[64];
00061
00062 snprintf(name, sizeof(name), "/jack_shared%d", fSegmentNum++);
00063
00064 if (jack_shmalloc(name, size, &info)) {
00065 jack_error("cannot create shared memory segment of size = %d", size, strerror(errno));
00066 goto error;
00067 }
00068
00069 if (jack_attach_shm(&info)) {
00070 jack_error("cannot attach shared memory segment name = %s err = %s", name, strerror(errno));
00071 jack_destroy_shm(&info);
00072 goto error;
00073 }
00074
00075 obj = (JackShmMem*)jack_shm_addr(&info);
00076
00077
00078 gInfo.index = info.index;
00079 gInfo.size = size;
00080 gInfo.ptr.attached_at = info.ptr.attached_at;
00081
00082 jack_log("JackShmMem::new index = %ld attached = %x size = %ld ", info.index, info.ptr.attached_at, size);
00083 return obj;
00084
00085 error:
00086 jack_error("JackShmMem::new bad alloc", size);
00087 throw std::bad_alloc();
00088 }
00089
00090 void JackShmMem::operator delete(void* p, size_t size)
00091 {
00092 jack_shm_info_t info;
00093 JackShmMem* obj = (JackShmMem*)p;
00094 info.index = obj->fInfo.index;
00095 info.ptr.attached_at = obj->fInfo.ptr.attached_at;
00096
00097 jack_log("JackShmMem::delete size = %ld index = %ld", size, info.index);
00098
00099 jack_release_shm(&info);
00100 jack_destroy_shm(&info);
00101 }
00102
00103 void JackShmMem::operator delete(void* obj)
00104 {
00105 if (obj) {
00106 JackShmMem::operator delete(obj, 0);
00107 }
00108 }
00109
00110 void LockMemoryImp(void* ptr, size_t size)
00111 {
00112 if (CHECK_MLOCK((char*)ptr, size)) {
00113 jack_log("Succeeded in locking %u byte memory area", size);
00114 } else {
00115 jack_error("Cannot lock down memory area (%s)", strerror(errno));
00116 }
00117 }
00118
00119 void InitLockMemoryImp(void* ptr, size_t size)
00120 {
00121 if (CHECK_MLOCK((char*)ptr, size)) {
00122 memset(ptr, 0, size);
00123 jack_log("Succeeded in locking %u byte memory area", size);
00124 } else {
00125 jack_error("Cannot lock down memory area (%s)", strerror(errno));
00126 }
00127 }
00128
00129 void UnlockMemoryImp(void* ptr, size_t size)
00130 {
00131 if (CHECK_MUNLOCK((char*)ptr, size)) {
00132 jack_log("Succeeded in unlocking %u byte memory area", size);
00133 } else {
00134 jack_error("Cannot unlock down memory area (%s)", strerror(errno));
00135 }
00136 }
00137
00138 void LockAllMemory()
00139 {
00140 if (CHECK_MLOCKALL()) {
00141 jack_log("Succeeded in locking all memory");
00142 } else {
00143 jack_error("Cannot lock all memory (%s)", strerror(errno));
00144 }
00145 }
00146
00147 void UnlockAllMemory()
00148 {
00149 if (CHECK_MUNLOCKALL()) {
00150 jack_log("Succeeded in unlocking all memory");
00151 } else {
00152 jack_error("Cannot unlock all memory (%s)", strerror(errno));
00153 }
00154 }
00155
00156
00157 }
00158