summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/dlt/dlt_shm.h6
-rwxr-xr-xsrc/lib/dlt_user.c2
-rw-r--r--src/shared/dlt_shm.c22
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
}