summaryrefslogtreecommitdiff
path: root/src/shared/dlt_shm.c
diff options
context:
space:
mode:
authorChristian Muck <christian.muck@bmw.de>2011-11-10 08:50:03 +0100
committerChristian Muck <christian.muck@bmw.de>2011-11-10 08:50:03 +0100
commit575fa86ef3181e4ade5a6c341f86bb83558eca93 (patch)
tree9602a49dce7f85e740ffee68aee7682646661579 /src/shared/dlt_shm.c
parentd34560e81667493a6c7d6a6254d88cf30804bb1c (diff)
parent8ecf985d996e8bf0241d75fddce3722f224e5014 (diff)
downloadDLT-daemon-575fa86ef3181e4ade5a6c341f86bb83558eca93.tar.gz
Merge branch 'master' of https://git.genivi.org/srv/git/DLT-daemon
Conflicts: src/shared/dlt_shm.c
Diffstat (limited to 'src/shared/dlt_shm.c')
-rw-r--r--src/shared/dlt_shm.c131
1 files changed, 75 insertions, 56 deletions
diff --git a/src/shared/dlt_shm.c b/src/shared/dlt_shm.c
index 74e448e..5ad4775 100644
--- a/src/shared/dlt_shm.c
+++ b/src/shared/dlt_shm.c
@@ -73,6 +73,11 @@
#include <stdio.h>
#include <string.h>
+#if !defined(_MSC_VER)
+#include <unistd.h>
+#include <syslog.h>
+#endif
+
#include <dlt_shm.h>
#include <dlt_common.h>
@@ -98,12 +103,13 @@ void dlt_shm_pv(int id,int operation)
semaphor.sem_flg = SEM_UNDO;
if(semop(id, &semaphor,1) == -1) {
- perror("SHM: semop");
+ dlt_log(LOG_ERR,"SHM: semop");
}
}
int dlt_shm_init_server(DltShm *buf,int key,int size) {
struct shmid_ds shm_buf;
+ char str[256];
// Init parameters
buf->shm = NULL;
@@ -114,32 +120,32 @@ int dlt_shm_init_server(DltShm *buf,int key,int size) {
// Create the segment.
if ((buf->shmid = shmget(key, size, IPC_CREAT | 0666)) < 0) {
- perror("SHM: shmget");
+ dlt_log(LOG_ERR,"SHM: shmget");
return -1; /* ERROR */
}
// get the size of shm
if (shmctl(buf->shmid, IPC_STAT, &shm_buf))
{
- perror("SHM: shmctl");
+ 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) {
- perror("SHM: shmat");
+ dlt_log(LOG_ERR,"SHM: shmat");
return -1; /* ERROR */
}
// Init semaphore
if( (buf->semid = semget(DLT_SHM_SEM,1,S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT|IPC_EXCL)) == -1 ) {
if( (buf->semid = semget(DLT_SHM_SEM,1,S_IRWXU|S_IRWXG|S_IRWXO|IPC_EXCL)) == -1 ) {
- perror("SHM: semget");
+ dlt_log(LOG_ERR,"SHM: semget");
return -1; /* ERROR */
}
}
if( semctl(buf->semid,0,SETVAL,(int)1) == -1 ) {
- perror("SHM: semctl");
+ dlt_log(LOG_ERR,"SHM: semctl");
return -1; /* ERROR */
}
@@ -153,9 +159,8 @@ int dlt_shm_init_server(DltShm *buf,int key,int size) {
// clear memory
memset(buf->mem,0,buf->size);
- //dlt_shm_status(buf);
- //dlt_shm_info(buf);
- printf("SHM: Size %d\n",buf->size);
+ snprintf(str,sizeof(str),"SHM: Size %d\n",buf->size);
+ dlt_log(LOG_INFO, str);
return 0; /* OK */
}
@@ -172,61 +177,69 @@ int dlt_shm_init_client(DltShm *buf,int key) {
// Create the segment.
if ((buf->shmid = shmget(key, 0, 0666)) < 0) {
- perror("SHM: shmget");
+ dlt_log(LOG_ERR,"SHM: shmget");
return -1; /* ERROR */
}
// get the size of shm
if (shmctl(buf->shmid, IPC_STAT, &shm_buf))
{
- perror("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) {
- perror("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 ) {
- perror("SHM: semget");
- return -1; /* ERROR */
+ dlt_log(LOG_ERR,"SHM: semget");
+ return -1; /* ERROR */
}
// 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 */
}
void dlt_shm_info(DltShm *buf)
{
+ char str[256];
- printf("SHM: SHM id: %d\n",buf->shmid);
- printf("SHM: Available size: %d\n",buf->size);
- printf("SHM: SHM full start address: %lX\n",(unsigned long)buf->shm);
- printf("SHM: SHM start address: %lX\n",(unsigned long)buf->mem);
+ snprintf(str,sizeof(str),"SHM: SHM id: %d\n",buf->shmid);
+ dlt_log(LOG_INFO, str);
+ snprintf(str,sizeof(str),"SHM: Available size: %d\n",buf->size);
+ dlt_log(LOG_INFO, str);
+ snprintf(str,sizeof(str),"SHM: SHM full start address: %lX\n",(unsigned long)buf->shm);
+ dlt_log(LOG_INFO, str);
+ snprintf(str,sizeof(str),"SHM: SHM start address: %lX\n",(unsigned long)buf->mem);
+ dlt_log(LOG_INFO, str);
}
void dlt_shm_status(DltShm *buf)
{
int write, read, count;
+ char str[256];
write = ((int*)(buf->shm))[0];
read = ((int*)(buf->shm))[1];
count = ((int*)(buf->shm))[2];
- printf("SHM: Write: %d\n",write);
- printf("SHM: Read: %d\n",read);
- printf("SHM: Count: %d\n",count);
-
+ snprintf(str,sizeof(str),"SHM: Write: %d\n",write);
+ dlt_log(LOG_INFO, str);
+ snprintf(str,sizeof(str),"SHM: Read: %d\n",read);
+ dlt_log(LOG_INFO, str);
+ snprintf(str,sizeof(str),"SHM: Count: %d\n",count);
+ dlt_log(LOG_INFO, str);
}
int dlt_shm_get_total_size(DltShm *buf)
@@ -268,7 +281,7 @@ int dlt_shm_push(DltShm *buf,const unsigned char *data1,unsigned int size1,const
if(!buf->mem) {
// shm not initialised
- //printf("SHM: SHM not initialised\n");
+ dlt_log(LOG_ERR,"SHM: SHM not initialised\n");
return -1; /* ERROR */
}
@@ -284,13 +297,13 @@ int dlt_shm_push(DltShm *buf,const unsigned char *data1,unsigned int size1,const
if(read==write && count) {
// shm buffer is full
DLT_SHM_SEM_FREE(buf->semid);
- //printf("SHM is totally full\n");
+ dlt_log(LOG_ERR,"SHM is totally full\n");
return -1; // ERROR
}
else if(write >= buf->size) {
if((size1+size2+size3+sizeof(head)+sizeof(unsigned char)+sizeof(int)) > read) {
DLT_SHM_SEM_FREE(buf->semid);
- //printf("SHM is full at start\n");
+ dlt_log(LOG_ERR,"SHM is full at start\n");
return -1; // ERROR
}
write = 0;
@@ -298,7 +311,7 @@ int dlt_shm_push(DltShm *buf,const unsigned char *data1,unsigned int size1,const
else if(read > write) {
if((write + size1+size2+size3+sizeof(head)+sizeof(unsigned char)+sizeof(int)) > read) {
DLT_SHM_SEM_FREE(buf->semid);
- //printf("SHM is full at end\n");
+ dlt_log(LOG_ERR,"SHM is full at end\n");
return -1; // ERROR
}
}
@@ -309,7 +322,7 @@ int dlt_shm_push(DltShm *buf,const unsigned char *data1,unsigned int size1,const
// try write at beginning
if((size1+size2+size3+sizeof(head)+sizeof(unsigned char)+sizeof(int)) > read) {
DLT_SHM_SEM_FREE(buf->semid);
- //printf("SHM is full at start\n");
+ dlt_log(LOG_ERR,"SHM is full at start\n");
return -1; // ERROR
}
// write zero status and size at end if possible
@@ -360,7 +373,7 @@ int dlt_shm_pull(DltShm *buf,unsigned char *data, int max_size)
if(!buf->mem) {
// shm not initialised
- printf("SHM: SHM not initialised\n");
+ dlt_log(LOG_ERR,"SHM: SHM not initialised\n");
return -1; /* ERROR */
}
@@ -401,20 +414,23 @@ int dlt_shm_pull(DltShm *buf,unsigned char *data, int max_size)
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) {
- printf("SHM: Buffers size bigger than shm buffer\n");
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
}
// check max read size
if(size > max_size) {
- printf("SHM: Buffer is bigger than max size\n");
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
}
@@ -448,7 +464,7 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size)
if(!buf->mem) {
// shm not initialised
- printf("SHM: SHM not initialised\n");
+ dlt_log(LOG_ERR,"SHM: SHM not initialised\n");
return -1; /* ERROR */
}
@@ -488,22 +504,24 @@ 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);
+ dlt_log(LOG_ERR,"Buffer is not fully written\n");
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);
+ dlt_log(LOG_ERR,"SHM: Buffers size bigger than shm buffer\n");
+ dlt_shm_reset(buf);
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);
+ dlt_log(LOG_ERR,"SHM: Buffer is bigger than max size\n");
+ dlt_shm_reset(buf);
return -1; // ERROR
}
@@ -522,7 +540,7 @@ int dlt_shm_remove(DltShm *buf)
if(!buf->mem) {
// shm not initialised
- printf("SHM: SHM not initialised\n");
+ dlt_log(LOG_ERR,"SHM: SHM not initialised\n");
return -1; /* ERROR */
}
@@ -562,15 +580,16 @@ int dlt_shm_remove(DltShm *buf)
// 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) {
- printf("SHM: Buffers size bigger than shm buffer\n");
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
}
@@ -585,13 +604,13 @@ int dlt_shm_remove(DltShm *buf)
int dlt_shm_reset(DltShm *buf) {
- printf("SHM: Pointer corrupted; reset triggered.\n");
+ dlt_log(LOG_ERR,"SHM: Pointer corrupted; reset triggered.\n");
/* 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 */
@@ -604,7 +623,7 @@ int dlt_shm_recover(DltShm *buf) {
// initialise head
head[3] = 0x01;
- printf("SHM: Head not found; try to recover.\n");
+ dlt_log(LOG_ERR,"SHM: Head not found; try to recover.\n");
/* try to find next valid message */
DLT_SHM_SEM_GET(buf->semid);
@@ -658,22 +677,22 @@ int dlt_shm_recover(DltShm *buf) {
int dlt_shm_free_server(DltShm *buf) {
if(!buf->shm) {
- printf("SHM: Shared memory segment not attached\n");
+ dlt_log(LOG_ERR,"SHM: Shared memory segment not attached\n");
return -1; /* ERROR */
}
if(shmdt(buf->shm)) {
- perror("SHM: shmdt");
+ dlt_log(LOG_ERR,"SHM: shmdt");
return -1; /* ERROR */
}
if(shmctl(buf->shmid,IPC_RMID,NULL) == -1) {
- perror("SHM: shmdt");
+ dlt_log(LOG_ERR,"SHM: shmdt");
return -1; /* ERROR */
}
if(semctl(buf->semid,0,IPC_RMID,(int)0) == -1) {
- perror("SHM: shmdt");
+ dlt_log(LOG_ERR,"SHM: shmdt");
return -1; /* ERROR */
}
@@ -690,12 +709,12 @@ int dlt_shm_free_server(DltShm *buf) {
int dlt_shm_free_client(DltShm *buf) {
if(!buf->shm) {
- printf("SHM: Shared memory segment not attached\n");
+ dlt_log(LOG_ERR,"SHM: Shared memory segment not attached\n");
return -1; /* ERROR */
}
if(shmdt(buf->shm)) {
- perror("SHM: shmdt");
+ dlt_log(LOG_ERR,"SHM: shmdt");
return -1; /* ERROR */
}