36 char* SharedMemory::calcAddressPtr(
int pSlotId)
const {
37 return aSharedHeaderPtr->calcAddressPtr(aSharedBufferPtr,pSlotId);
41 void SharedMemory::cleanSlot(
int pSlotId) {
42 aSharedHeaderPtr->cleanSlot(aSharedBufferPtr,pSlotId);
45 SharedMemory::SharedMemory(
const string& pNameRef) :
HSEPObject(
"SharedMemory"){
49 aHeaderName =
"/" + pNameRef +
"-header";
50 aBufferName =
"/" + pNameRef +
"-buffer";
59 aSharedHeaderHandle = shm_open(
65 if (-1 != aSharedHeaderHandle) {
76 (PROT_READ | PROT_WRITE),
82 if (MAP_FAILED != aSharedHeaderPtr) {
84 aSharedBufferHandle = shm_open(
90 if (-1 != aSharedBufferHandle) {
92 aSharedBufferPtr = (
char*) mmap(
95 (PROT_READ | PROT_WRITE),
100 if (MAP_FAILED != aSharedBufferPtr) {
112 setLastError(
"Permission to shm_open object was denied.");
116 setLastError(
"Creation permission requested on an already created memory area.");
120 setLastError(
"The provided name on shm_open is invalid");
131 setLastError(
"shm_opentried to open an inexistent shm area or O_CREAT was not specified");
142 aHeaderName =
"/" + pNameRef +
"-header";
143 aBufferName =
"/" + pNameRef +
"-buffer";
145 aSharedHeaderHandle = shm_open(
147 O_CREAT | O_EXCL |O_RDWR,
152 if (-1 != aSharedHeaderHandle) {
163 aInitialized =
false;
168 (PROT_READ | PROT_WRITE),
174 if (MAP_FAILED != aSharedHeaderPtr) {
178 aSharedBufferHandle = shm_open(
180 O_CREAT|O_EXCL|O_RDWR,
185 if (-1 != aSharedBufferHandle) {
187 size_t vMemoryBlockSize = aSharedHeaderPtr->
dataSize();
189 ftruncate(aSharedBufferHandle,vMemoryBlockSize);
191 aSharedBufferPtr = (
char*) mmap(
194 (PROT_READ | PROT_WRITE),
199 if (MAP_FAILED != aSharedBufferPtr) {
201 memset(aSharedBufferPtr,0,vMemoryBlockSize);
214 setLastError(
"Permission to shm_open object was denied.");
218 setLastError(
"Creation permission requested on an already created memory area.");
222 setLastError(
"The provided name on shm_open is invalid");
233 setLastError(
"shm_opentried to open an inexistent shm area or O_CREAT was not specified");
246 msync(aSharedBufferPtr,aSharedHeaderPtr->
dataSize(),MS_SYNC);
251 munmap(aSharedBufferPtr,aSharedHeaderPtr->
dataSize());
259 shm_unlink(aBufferName.c_str());
260 shm_unlink(aHeaderName.c_str());
269 vResult = aSharedHeaderPtr->
popFree(aSharedBufferPtr);
277 aSharedHeaderPtr->
pushFree(aSharedBufferPtr,pSlotId);
288 else if (pSlotId >= aSharedHeaderPtr->
slotQty()) {
294 size_t vSlotSize = aSharedHeaderPtr->
slotSize();
296 if (pBufferSize > vSlotSize) {
297 vBufferSize = vSlotSize;
301 vBufferSize = pBufferSize;
302 vCleanArea = vSlotSize - vBufferSize;
304 char* vSlotPtr = calcAddressPtr(pSlotId);
306 strncpy(vSlotPtr,pSourcePtr,vBufferSize);
307 memset (vSlotPtr+vBufferSize,0,vCleanArea);
321 }
else if (pSlotId >= aSharedHeaderPtr->
slotQty()) {
327 size_t vSlotSize = aSharedHeaderPtr->
slotSize();
329 if (pBufferSize > vSlotSize) {
330 vBufferSize = vSlotSize;
334 vBufferSize = pBufferSize;
335 vCleanArea = pBufferSize - vBufferSize;
338 char* vSlotPtr = this->calcAddressPtr(pSlotId);
340 strncpy(pDestinationPtr,vSlotPtr,vBufferSize);
341 memset (pDestinationPtr+vBufferSize,0,vCleanArea);
350 return aSharedHeaderPtr->
wait();
355 aSharedHeaderPtr->
signal(pSlotId);