summaryrefslogtreecommitdiff
path: root/src/shared/dlt_shm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/dlt_shm.c')
-rw-r--r--src/shared/dlt_shm.c60
1 files changed, 38 insertions, 22 deletions
diff --git a/src/shared/dlt_shm.c b/src/shared/dlt_shm.c
index 5859af1..5ad4775 100644
--- a/src/shared/dlt_shm.c
+++ b/src/shared/dlt_shm.c
@@ -184,29 +184,28 @@ int dlt_shm_init_client(DltShm *buf,int key) {
// get the size of shm
if (shmctl(buf->shmid, IPC_STAT, &shm_buf))
{
- dlt_log(LOG_ERR,"SHM: shmctl");
- return -1; /* ERROR */
+ dlt_log(LOG_ERR,"SHM: shmctl");
+ return -1; /* ERROR */
}
- // Now we attach the segment to our data space.
- if ((buf->shm = shmat(buf->shmid, NULL, 0)) == (char *) -1) {
- dlt_log(LOG_ERR,"shmat");
- return -1; /* ERROR */
- }
+ // Now we attach the segment to our data space.
+ if ((buf->shm = shmat(buf->shmid, NULL, 0)) == (char *) -1) {
+ dlt_log(LOG_ERR,"shmat");
+ return -1; /* ERROR */
+ }
// Init semaphore
if( (buf->semid = semget(DLT_SHM_SEM,0,0)) == -1 ) {
- dlt_log(LOG_ERR,"SHM: semget");
- return -1; /* ERROR */
+ dlt_log(LOG_ERR,"SHM: semget");
+ return -1; /* ERROR */
}
- DLT_SHM_SEM_FREE(buf->semid);
// Init pointers
- buf->mem = (char*)(&(((int*)(buf->shm))[3]));
- buf->size = shm_buf.shm_segsz - (buf->mem - buf->shm);
+ buf->mem = (char*)(&(((int*)(buf->shm))[3]));
+ buf->size = shm_buf.shm_segsz - (buf->mem - buf->shm);
//dlt_shm_status(buf);
- //dlt_shm_info(buf);
+ //dlt_shm_info(buf);
return 0; /* OK */
}
@@ -252,9 +251,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;
@@ -342,9 +343,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)
@@ -357,6 +355,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
}
@@ -381,7 +382,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) {
@@ -389,6 +389,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
}
@@ -411,12 +412,15 @@ 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);
dlt_log(LOG_ERR,"Buffer is not fully written\n");
return -1; // ERROR
}
// plausibility check of buffer size
if( (read+size) > buf->size) {
+ DLT_SHM_SEM_FREE(buf->semid);
dlt_log(LOG_ERR,"SHM: Buffers size bigger than shm buffer\n");
dlt_shm_reset(buf);
return -1; // ERROR
@@ -424,6 +428,7 @@ int dlt_shm_pull(DltShm *buf,unsigned char *data, int max_size)
// check max read size
if(size > max_size) {
+ DLT_SHM_SEM_FREE(buf->semid);
dlt_log(LOG_ERR,"SHM: Buffer is bigger than max size\n");
dlt_shm_reset(buf);
return -1; // ERROR
@@ -443,6 +448,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
}
@@ -460,7 +467,6 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size)
dlt_log(LOG_ERR,"SHM: SHM not initialised\n");
return -1; /* ERROR */
}
- DLT_SHM_SEM_FREE(buf->semid);
// get current write pointer
DLT_SHM_SEM_GET(buf->semid);
@@ -474,6 +480,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
}
@@ -497,12 +504,14 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size)
// check status
if(status != 2 ) {
+ DLT_SHM_SEM_FREE(buf->semid);
dlt_log(LOG_ERR,"Buffer is not fully written\n");
return -1; // ERROR
}
// plausibility check of buffer size
if( (read+size) > buf->size) {
+ DLT_SHM_SEM_FREE(buf->semid);
dlt_log(LOG_ERR,"SHM: Buffers size bigger than shm buffer\n");
dlt_shm_reset(buf);
return -1; // ERROR
@@ -510,6 +519,7 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size)
// check max read size
if((size-sizeof(head)) > max_size) {
+ DLT_SHM_SEM_FREE(buf->semid);
dlt_log(LOG_ERR,"SHM: Buffer is bigger than max size\n");
dlt_shm_reset(buf);
return -1; // ERROR
@@ -518,6 +528,8 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size)
// 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
}
@@ -537,7 +549,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) {
@@ -545,6 +556,7 @@ int dlt_shm_remove(DltShm *buf)
{
dlt_shm_reset(buf);
}
+ DLT_SHM_SEM_FREE(buf->semid);
return -1; // ERROR
}
@@ -568,12 +580,14 @@ int dlt_shm_remove(DltShm *buf)
// check status
if(status != 2 ) {
+ DLT_SHM_SEM_FREE(buf->semid);
dlt_log(LOG_ERR,"Buffer is not fully written\n");
return -1; // ERROR
}
// plausibility check of buffer size
if( (read+size) > buf->size) {
+ DLT_SHM_SEM_FREE(buf->semid);
dlt_log(LOG_ERR,"SHM: Buffers size bigger than shm buffer\n");
dlt_shm_reset(buf);
return -1; // ERROR
@@ -583,6 +597,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
}
@@ -592,9 +608,9 @@ int dlt_shm_reset(DltShm *buf) {
/* reset pointers and counters */
DLT_SHM_SEM_GET(buf->semid);
- ((int*)(buf->shm))[0] = 0; // pointer to write memory
- ((int*)(buf->shm))[1] = 0; // pointer to read memory
- ((int*)(buf->shm))[2] = 0; // number of packets
+ ((int*)(buf->shm))[0] = 0; // pointer to write memory
+ ((int*)(buf->shm))[1] = 0; // pointer to read memory
+ ((int*)(buf->shm))[2] = 0; // number of packets
DLT_SHM_SEM_FREE(buf->semid);
return 0; /* OK */