diff options
author | Alexander Wenzel <Alexander.AW.Wenzel@bmw.de> | 2011-10-18 15:21:39 +0200 |
---|---|---|
committer | Alexander Wenzel <Alexander.AW.Wenzel@bmw.de> | 2011-10-18 15:21:39 +0200 |
commit | bd907a3a892ab13d8d2f781a0536d46b4cf3b12b (patch) | |
tree | b41ccfe188ce92b92ecdf42085ed36c728afd6f5 /src/lib | |
parent | 30606fb6cfb984baf5782793effd70d07ce68195 (diff) | |
download | DLT-daemon-bd907a3a892ab13d8d2f781a0536d46b4cf3b12b.tar.gz |
[Reverted] Removed Ringbuffer implementation in Library.
Diffstat (limited to 'src/lib')
-rwxr-xr-x | src/lib/dlt_user.c | 81 | ||||
-rwxr-xr-x | src/lib/dlt_user_cfg.h | 3 |
2 files changed, 77 insertions, 7 deletions
diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c index 459a5d1..a031de3 100755 --- a/src/lib/dlt_user.c +++ b/src/lib/dlt_user.c @@ -320,6 +320,12 @@ int dlt_init_common(void) dlt_user.dlt_ll_ts_max_num_entries = 0; dlt_user.dlt_ll_ts_num_entries = 0; + if (dlt_ringbuffer_init(&(dlt_user.rbuf), DLT_USER_RINGBUFFER_SIZE)==-1) + { + dlt_user_initialised = 0; + return -1; + } + signal(SIGPIPE,SIG_IGN); /* ignore pipe signals */ atexit(dlt_user_atexit_handler); @@ -377,6 +383,9 @@ int dlt_free(void) /* Ignore return value */ dlt_receiver_free(&(dlt_user.receiver)); + /* Ignore return value */ + dlt_ringbuffer_free(&(dlt_user.rbuf)); + if (dlt_user.dlt_ll_ts) { for (i=0;i<dlt_user.dlt_ll_ts_max_num_entries;i++) @@ -876,8 +885,16 @@ int dlt_forward_msg(void *msgdata,size_t size) /* store message in ringbuffer, if an error has occured */ if (ret!=DLT_RETURN_OK) { - /* message could not be sent */ - /* in old implementation messages was saved in ringbuffer */ + DLT_SEM_LOCK(); + + if (dlt_ringbuffer_put3(&(dlt_user.rbuf), + &(userheader), sizeof(DltUserHeader), + msgdata, size, 0, 0)==-1) + { + dlt_log(LOG_ERR,"Storing message to history buffer failed! Message discarded.\n"); + } + + DLT_SEM_FREE(); } switch (ret) @@ -2185,8 +2202,17 @@ int dlt_user_log_send_log(DltContextData *log, int mtype) /* store message in ringbuffer, if an error has occured */ if (ret!=DLT_RETURN_OK) { - /* in old implementation message was stored in ringbuffer - * if it was not able to be sent. */ + DLT_SEM_LOCK(); + + if (dlt_ringbuffer_put3(&(dlt_user.rbuf), + &(userheader), sizeof(DltUserHeader), + msg.headerbuffer+sizeof(DltStorageHeader), msg.headersize-sizeof(DltStorageHeader), + log->buffer, log->size)==-1) + { + dlt_log(LOG_ERR,"Storing message to history buffer failed! Message discarded.\n"); + } + + DLT_SEM_FREE(); } switch (ret) @@ -2727,10 +2753,14 @@ int dlt_user_log_check_user_message(void) void dlt_user_log_reattach_to_daemon(void) { - int num, reregistered=0; + int num, count, reregistered=0; + + uint8_t buf[DLT_USER_RINGBUFFER_SIZE]; + size_t size; DltContext handle; DltContextData log_new; + DltReturnValue ret; if (dlt_user.dlt_log_handle<0) { @@ -2783,8 +2813,45 @@ void dlt_user_log_reattach_to_daemon(void) if (reregistered==1) { - /* In old implementation Send content of ringbuffer */ - } + /* Send content of ringbuffer */ + DLT_SEM_LOCK(); + count = dlt_user.rbuf.count; + DLT_SEM_FREE(); + + for (num=0;num<count;num++) + { + + DLT_SEM_LOCK(); + dlt_ringbuffer_get(&(dlt_user.rbuf),buf,&size); + DLT_SEM_FREE(); + + if (size>0) + { + dlt_shm_push(&dlt_user.dlt_shm,buf+sizeof(DltUserHeader),size-sizeof(DltUserHeader),0,0,0,0); + + /* log to FIFO */ + ret = dlt_user_log_out3(dlt_user.dlt_log_handle, buf,sizeof(DltUserHeader),0,0,0,0); + + /* in case of error, push message back to ringbuffer */ + if (ret!=DLT_RETURN_OK) + { + DLT_SEM_LOCK(); + if (dlt_ringbuffer_put(&(dlt_user.rbuf), buf, size)==-1) + { + dlt_log(LOG_ERR,"Error pushing back message to history buffer. Message discarded.\n"); + } + DLT_SEM_FREE(); + + /* In case of: data could not be written, set overflow flag */ + if (ret==DLT_RETURN_PIPE_FULL) + { + dlt_user.overflow = 1; + } + } + } + + } + } } } } diff --git a/src/lib/dlt_user_cfg.h b/src/lib/dlt_user_cfg.h index 419fbc2..5b1e71e 100755 --- a/src/lib/dlt_user_cfg.h +++ b/src/lib/dlt_user_cfg.h @@ -87,6 +87,9 @@ /* Size of receive buffer */
#define DLT_USER_RCVBUF_MAX_SIZE 10024
+/* Size of ring buffer */
+#define DLT_USER_RINGBUFFER_SIZE 10024
+
/* Temporary buffer length */
#define DLT_USER_BUFFER_LENGTH 255
|