summaryrefslogtreecommitdiff
path: root/src/shared/dlt_shm.c
diff options
context:
space:
mode:
authorAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2011-11-09 13:56:55 +0100
committerAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2011-11-09 13:56:55 +0100
commita4b4599ea34d1abc6db0fedd0c8e612b7440736b (patch)
tree832aa87ccbc7d49f172ff1582129a8d92730c9b9 /src/shared/dlt_shm.c
parent4dce943dca5f9f9f49287819504c15ded49e7fc8 (diff)
downloadDLT-daemon-a4b4599ea34d1abc6db0fedd0c8e612b7440736b.tar.gz
Fixed Semaphore handling in SHM.
Diffstat (limited to 'src/shared/dlt_shm.c')
-rw-r--r--src/shared/dlt_shm.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/src/shared/dlt_shm.c b/src/shared/dlt_shm.c
index 2eecafe..74e448e 100644
--- a/src/shared/dlt_shm.c
+++ b/src/shared/dlt_shm.c
@@ -194,7 +194,6 @@ int dlt_shm_init_client(DltShm *buf,int key) {
perror("SHM: semget");
return -1; /* ERROR */
}
- DLT_SHM_SEM_FREE(buf->semid);
// Init pointers
buf->mem = (char*)(&(((int*)(buf->shm))[3]));
@@ -239,9 +238,11 @@ int dlt_shm_get_used_size(DltShm *buf)
{
int write, read, count;
+ DLT_SHM_SEM_GET(buf->semid);
write = ((int*)(buf->shm))[0];
read = ((int*)(buf->shm))[1];
count = ((int*)(buf->shm))[2];
+ DLT_SHM_SEM_FREE(buf->semid);
if(count == 0)
return 0;
@@ -329,9 +330,6 @@ int dlt_shm_push(DltShm *buf,const unsigned char *data1,unsigned int size1,const
*((unsigned char*)(buf->mem+write)) = 1; // set write status
*((int*)(buf->mem+write+sizeof(unsigned char))) = size1+size2+size3+sizeof(head); // set write size
- // free semaphore
- DLT_SHM_SEM_FREE(buf->semid);
-
// write data
memcpy(buf->mem+write+sizeof(unsigned char)+sizeof(int),head,sizeof(head));
if(data1)
@@ -344,6 +342,9 @@ int dlt_shm_push(DltShm *buf,const unsigned char *data1,unsigned int size1,const
// update write status
*((unsigned char*)(buf->mem+write)) = 2;
+ // free semaphore
+ DLT_SHM_SEM_FREE(buf->semid);
+
return 0; // OK
}
@@ -368,7 +369,6 @@ int dlt_shm_pull(DltShm *buf,unsigned char *data, int max_size)
write = ((int*)(buf->shm))[0];
read = ((int*)(buf->shm))[1];
count = ((int*)(buf->shm))[2];
- DLT_SHM_SEM_FREE(buf->semid);
// check if data is in there
if(count<=0) {
@@ -376,6 +376,7 @@ int dlt_shm_pull(DltShm *buf,unsigned char *data, int max_size)
{
dlt_shm_reset(buf);
}
+ DLT_SHM_SEM_FREE(buf->semid);
return -1; // ERROR
}
@@ -399,18 +400,21 @@ int dlt_shm_pull(DltShm *buf,unsigned char *data, int max_size)
// check status
if(status != 2 ) {
//printf("Buffer is not fully written\n");
+ DLT_SHM_SEM_FREE(buf->semid);
return -1; // ERROR
}
// plausibility check of buffer size
if( (read+size) > buf->size) {
printf("SHM: Buffers size bigger than shm buffer\n");
+ DLT_SHM_SEM_FREE(buf->semid);
return -1; // ERROR
}
// check max read size
if(size > max_size) {
printf("SHM: Buffer is bigger than max size\n");
+ DLT_SHM_SEM_FREE(buf->semid);
return -1; // ERROR
}
@@ -428,6 +432,8 @@ int dlt_shm_pull(DltShm *buf,unsigned char *data, int max_size)
((int*)(buf->shm))[1] = read+sizeof(unsigned char)+sizeof(int)+size; // set new read pointer
((int*)(buf->shm))[2] -= 1; // decrease counter
+ DLT_SHM_SEM_FREE(buf->semid);
+
return size-sizeof(head); // OK
}
@@ -445,7 +451,6 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size)
printf("SHM: SHM not initialised\n");
return -1; /* ERROR */
}
- DLT_SHM_SEM_FREE(buf->semid);
// get current write pointer
DLT_SHM_SEM_GET(buf->semid);
@@ -459,6 +464,7 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size)
{
dlt_shm_reset(buf);
}
+ DLT_SHM_SEM_FREE(buf->semid);
return -1; // ERROR
}
@@ -483,24 +489,29 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size)
// check status
if(status != 2 ) {
//printf("Buffer is not fully written\n");
+ DLT_SHM_SEM_FREE(buf->semid);
return -1; // ERROR
}
// plausibility check of buffer size
if( (read+size) > buf->size) {
printf("SHM: Buffers size bigger than shm buffer\n");
+ DLT_SHM_SEM_FREE(buf->semid);
return -1; // ERROR
}
// check max read size
if((size-sizeof(head)) > max_size) {
printf("SHM: Buffer is bigger than max size\n");
+ DLT_SHM_SEM_FREE(buf->semid);
return -1; // ERROR
}
// copy data
memcpy(data,buf->mem+read+sizeof(unsigned char)+sizeof(int)+sizeof(head),size-sizeof(head));
+ DLT_SHM_SEM_FREE(buf->semid);
+
return size-sizeof(head); // OK
}
@@ -520,7 +531,6 @@ int dlt_shm_remove(DltShm *buf)
write = ((int*)(buf->shm))[0];
read = ((int*)(buf->shm))[1];
count = ((int*)(buf->shm))[2];
- DLT_SHM_SEM_FREE(buf->semid);
// check if data is in there
if(count<=0) {
@@ -528,6 +538,7 @@ int dlt_shm_remove(DltShm *buf)
{
dlt_shm_reset(buf);
}
+ DLT_SHM_SEM_FREE(buf->semid);
return -1; // ERROR
}
@@ -552,12 +563,14 @@ int dlt_shm_remove(DltShm *buf)
// check status
if(status != 2 ) {
//printf("Buffer is not fully written\n");
+ DLT_SHM_SEM_FREE(buf->semid);
return -1; // ERROR
}
// plausibility check of buffer size
if( (read+size) > buf->size) {
printf("SHM: Buffers size bigger than shm buffer\n");
+ DLT_SHM_SEM_FREE(buf->semid);
return -1; // ERROR
}
@@ -565,6 +578,8 @@ int dlt_shm_remove(DltShm *buf)
((int*)(buf->shm))[1] = read+sizeof(unsigned char)+sizeof(int)+size; // set new read pointer
((int*)(buf->shm))[2] -= 1; // decrease counter
+ DLT_SHM_SEM_FREE(buf->semid);
+
return size; // OK
}