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 static boost::interprocess::shared_memory_object *shm_obj = NULL;
00012 static boost::interprocess::mapped_region *mapped = NULL;
00013
00014 unsigned char *prepareServerSharedMemory() {
00015 char shm_name[1024];
00016 getResourceName(shm_name, shm_rname);
00017 shm_obj = new boost::interprocess::shared_memory_object(boost::interprocess::open_or_create, shm_name, boost::interprocess::read_write);
00018 boost::interprocess::offset_t size;
00019 if(shm_obj->get_size(size) && size==0) {
00020 shm_obj->truncate(SHMMAX);
00021 }
00022 mapped = new boost::interprocess::mapped_region(*shm_obj, boost::interprocess::read_write);
00023 unsigned char *shmBuf = (unsigned char *) mapped->get_address();
00024 return shmBuf;
00025 }
00026
00027 void detachSharedMemory() {
00028 delete mapped;
00029 delete shm_obj;
00030 }
00031
00032 int removeSharedMemory() {
00033 char shm_name[1024];
00034 getResourceName(shm_name, shm_rname);
00035 if(!boost::interprocess::shared_memory_object::remove(shm_name)) {
00036 return RE_SHM_UNLINK_ERROR;
00037 }
00038 return 0;
00039 }
00040
00041 unsigned char *prepareNonServerSharedMemory() {
00042 char shm_name[1024];
00043 getResourceName(shm_name, shm_rname);
00044 try {
00045 shm_obj = new boost::interprocess::shared_memory_object(boost::interprocess::open_only, shm_name, boost::interprocess::read_only);
00046 mapped = new boost::interprocess::mapped_region(*shm_obj, boost::interprocess::read_only);
00047 unsigned char *buf = (unsigned char *) mapped->get_address();
00048 return buf;
00049 } catch(boost::interprocess::interprocess_exception e) {
00050 return NULL;
00051 }
00052 }