00001
00002
00003
00004 #include <fcntl.h>
00005 #include "debug.h"
00006 #include "sharedmemory.h"
00007 #include "utils.h"
00008 #include "filesystem.h"
00009
00010 #undef USE_BOOST
00011
00012 #ifdef USE_BOOST
00013 static boost::interprocess::shared_memory_object *shm_obj = NULL;
00014 static boost::interprocess::mapped_region *mapped = NULL;
00015 #else
00016 int shmid = - 1;
00017 void *shmBuf = NULL;
00018 #endif
00019
00020 unsigned char *prepareServerSharedMemory() {
00021 char shm_name[1024];
00022 getResourceName(shm_name, shm_rname);
00023 #ifdef USE_BOOST
00024 shm_obj = new boost::interprocess::shared_memory_object(boost::interprocess::open_or_create, shm_name, boost::interprocess::read_write);
00025 boost::interprocess::offset_t size;
00026 if(shm_obj->get_size(size) && size==0) {
00027 shm_obj->truncate(SHMMAX);
00028 }
00029 mapped = new boost::interprocess::mapped_region(*shm_obj, boost::interprocess::read_write);
00030 unsigned char *shmBuf = (unsigned char *) mapped->get_address();
00031 return shmBuf;
00032 #else
00033 shmid = shm_open(shm_name, O_RDWR | O_CREAT, 0600);
00034 if(shmid!= -1) {
00035 if(ftruncate(shmid, SHMMAX) == -1) {
00036 close(shmid);
00037 shm_unlink(shm_name);
00038 return NULL;
00039 }
00040 shmBuf = mmap(SHM_BASE_ADDR, SHMMAX, PROT_READ | PROT_WRITE, MAP_SHARED, shmid , 0);
00041 if(shmBuf == MAP_FAILED) {
00042 close(shmid);
00043 shm_unlink(shm_name);
00044 return NULL;
00045 }
00046 return (unsigned char *) shmBuf;
00047 } else {
00048 return NULL;
00049 }
00050 #endif
00051 }
00052
00053 void detachSharedMemory() {
00054 #ifdef USE_BOOST
00055 delete mapped;
00056 delete shm_obj;
00057 #else
00058 munmap(shmBuf, SHMMAX);
00059 close(shmid);
00060 #endif
00061 }
00062
00063 int removeSharedMemory() {
00064 char shm_name[1024];
00065 getResourceName(shm_name, shm_rname);
00066 #ifdef USE_BOOST
00067 if(!boost::interprocess::shared_memory_object::remove(shm_name)) {
00068 return RE_SHM_UNLINK_ERROR;
00069 }
00070
00071 #else
00072 if(shm_unlink(shm_name) == -1) {
00073 return RE_SHM_UNLINK_ERROR;
00074 }
00075 #endif
00076 return 0;
00077 }
00078
00079 unsigned char *prepareNonServerSharedMemory() {
00080 char shm_name[1024];
00081 getResourceName(shm_name, shm_rname);
00082 #ifdef USE_BOOST
00083
00084 try {
00085 shm_obj = new boost::interprocess::shared_memory_object(boost::interprocess::open_only, shm_name, boost::interprocess::read_only);
00086 mapped = new boost::interprocess::mapped_region(*shm_obj, boost::interprocess::read_only);
00087 unsigned char *buf = (unsigned char *) mapped->get_address();
00088 return buf;
00089 } catch(boost::interprocess::interprocess_exception e) {
00090 return NULL;
00091 }
00092 #else
00093 shmid = shm_open(shm_name, O_RDONLY, 0400);
00094 if(shmid!= -1) {
00095 shmBuf = mmap(SHM_BASE_ADDR, SHMMAX, PROT_READ, MAP_SHARED, shmid, 0);
00096 if(shmBuf == MAP_FAILED) {
00097 close(shmid);
00098 return NULL;
00099 }
00100 return (unsigned char *) shmBuf;
00101 } else {
00102 return NULL;
00103 }
00104 #endif
00105 }