diff options
-rw-r--r-- | include/dlt/dlt_shm.h | 6 | ||||
-rwxr-xr-x | src/lib/dlt_user.c | 2 | ||||
-rw-r--r-- | src/shared/dlt_shm.c | 22 |
3 files changed, 19 insertions, 11 deletions
diff --git a/include/dlt/dlt_shm.h b/include/dlt/dlt_shm.h index 9727f4b..c660bb6 100644 --- a/include/dlt/dlt_shm.h +++ b/include/dlt/dlt_shm.h @@ -1,7 +1,7 @@ -#define DLT_SHM_KEY 10002 +#define DLT_SHM_KEY 11771 #define DLT_SHM_SIZE (1024*4000) -#define DLT_SHM_SEM 20013 +#define DLT_SHM_SEM 22771 typedef struct { @@ -15,7 +15,7 @@ typedef struct #define DLT_SHM_SEM_GET(id) dlt_shm_pv(id,-1) #define DLT_SHM_SEM_FREE(id) dlt_shm_pv(id,1) -extern int dlt_shm_init_client(DltShm *buf,int key,int size); +extern int dlt_shm_init_client(DltShm *buf,int key); extern int dlt_shm_init_server(DltShm *buf,int key,int size); extern int dlt_shm_push(DltShm *buf,const char *data1, int size1,const char *data2, int size2,const char *data3, int size3); diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c index ebba325..37f812c 100755 --- a/src/lib/dlt_user.c +++ b/src/lib/dlt_user.c @@ -160,7 +160,7 @@ int dlt_init(void) dlt_user.overflow = 0; /* init shared memory */ - if (dlt_shm_init_client(&dlt_user.dlt_shm,DLT_SHM_KEY,DLT_SHM_SIZE) < 0) + if (dlt_shm_init_client(&dlt_user.dlt_shm,DLT_SHM_KEY) < 0) { sprintf(str,"Loging disabled, Shared memory %d cannot be created!\n",DLT_SHM_KEY); dlt_log(LOG_WARNING, str); diff --git a/src/shared/dlt_shm.c b/src/shared/dlt_shm.c index b433648..bb8163e 100644 --- a/src/shared/dlt_shm.c +++ b/src/shared/dlt_shm.c @@ -80,7 +80,8 @@ int dlt_shm_init_server(DltShm *buf,int key,int size) { return 0; /* OK */ } -int dlt_shm_init_client(DltShm *buf,int key,int size) { +int dlt_shm_init_client(DltShm *buf,int key) { + struct shmid_ds shm_buf = { 0 }; // init parameters buf->shm = NULL; @@ -90,11 +91,18 @@ int dlt_shm_init_client(DltShm *buf,int key,int size) { buf->mem = 0; // Create the segment. - if ((buf->shmid = shmget(key, size, 0666)) < 0) { + if ((buf->shmid = shmget(key, 0, 0666)) < 0) { perror("shmget"); return -1; /* ERROR */ } + // get the size of shm + if (shmctl(buf->shmid, IPC_STAT, &shm_buf)) + { + perror("shmctl"); + return -1; /* ERROR */ + } + // Now we attach the segment to our data space. if ((buf->shm = shmat(buf->shmid, NULL, 0)) == (char *) -1) { perror("shmat"); @@ -110,7 +118,7 @@ int dlt_shm_init_client(DltShm *buf,int key,int size) { // Init pointers buf->mem = (char*)(&(((int*)(buf->shm))[3])); - buf->size = size - (buf->mem - buf->shm); + buf->size = shm_buf.shm_segsz - (buf->mem - buf->shm); return 0; /* OK */ } @@ -207,6 +215,9 @@ int dlt_shm_push(DltShm *buf,const char *data1, int size1,const char *data2, int *((unsigned char*)(buf->mem+write)) = 1; // set write status *((int*)(buf->mem+write+sizeof(unsigned char))) = size1+size2+size3; // set write size + // free semaphore + DLT_SHM_SEM_FREE(buf->semid); + // write data if(data1) memcpy(buf->mem+write+sizeof(unsigned char)+sizeof(int),data1,size1); @@ -218,9 +229,6 @@ int dlt_shm_push(DltShm *buf,const char *data1, int size1,const char *data2, int // update write status *((unsigned char*)(buf->mem+write)) = 2; - // free semaphore - DLT_SHM_SEM_FREE(buf->semid); - return 0; // OK } @@ -267,7 +275,7 @@ int dlt_shm_pull(DltShm *buf,char *data, int max_size) // check status if(status != 2 ) { - printf("Buffer is not fully written\n"); + //printf("Buffer is not fully written\n"); return -1; // ERROR } |