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