00001
00002
00003
00004
00005
00006
00007
00008 #include <sys/types.h>
00009 #include <sys/ipc.h>
00010
00011 #include <sys/shm.h>
00012
00013 #include "ComPlusPlus/ShMem.h"
00014 #include "SysPlusPlus/ComException.h"
00015 #include "SysPlusPlus/syscall.h"
00016
00017
00018 compp::ShMem::ShMem( const int key, const int size, const int mode, bool exclusive ) {
00019
00020 Addr = NULL;
00021 DestroyInDestructor = false;
00022 int locmodes = mode | IPC_CREAT;
00023 if ( exclusive ) {
00024 locmodes = locmodes | IPC_EXCL;
00025 }
00026
00027 if ( -1 == ( ShMemId = syspp::Call::ShmGet( key, size, locmodes ) ) )
00028 throw syspp::ComException ( "Cannot create shared memory segment");
00029
00030 }
00031
00032 compp::ShMem::ShMem( const int key, const int size, const int mode ) {
00033
00034 Addr = NULL;
00035 DestroyInDestructor = false;
00036 if ( -1 == ( ShMemId = syspp::Call::ShmGet( key, size, mode ) ) )
00037 throw syspp::ComException ( "Cannot create shared memory segment");
00038
00039 }
00040
00041 compp::ShMem::~ShMem() {
00042
00043 Detach();
00044 if ( DestroyInDestructor )
00045 Destroy ();
00046 }
00047
00048 int compp::ShMem::getId() {
00049 return ShMemId;
00050 }
00051
00052 void* compp::ShMem::getStartAddr ( ) {
00053
00054 return Addr;
00055 }
00056
00057
00058 void compp::ShMem::Attach() {
00059
00060 Addr = syspp::Call::ShmAt(ShMemId, NULL, 0 );
00061 if ( Addr == (void *) -1 ) {
00062 throw syspp::ComException ( "Cannot attache shared memory segment");
00063 }
00064
00065 }
00066
00067 void compp::ShMem::Detach() {
00068
00069 if ( -1 == syspp::Call::ShmDt(Addr) ) {
00070 throw syspp::ComException ( "Cannot detach shared memory segment");
00071 }
00072
00073 Addr = NULL;
00074
00075 }
00076
00077 void compp::ShMem::Destroy() {
00078 struct shmid_ds buffer;
00079
00080 if ( -1 == shmctl(ShMemId, IPC_RMID, &buffer) ) {
00081 throw syspp::ComException ( "Cannot mark shared memory segment for deletion.");
00082 }
00083
00084 }
00085
00086
00087
00088 void compp::ShMem::AutoDestroy( const bool on ) {
00089
00090 if ( on )
00091 DestroyInDestructor = true;
00092 else
00093 DestroyInDestructor = false;
00094 }