summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2011-10-18 15:21:39 +0200
committerAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2011-10-18 15:21:39 +0200
commitbd907a3a892ab13d8d2f781a0536d46b4cf3b12b (patch)
treeb41ccfe188ce92b92ecdf42085ed36c728afd6f5 /src/lib
parent30606fb6cfb984baf5782793effd70d07ce68195 (diff)
downloadDLT-daemon-bd907a3a892ab13d8d2f781a0536d46b4cf3b12b.tar.gz
[Reverted] Removed Ringbuffer implementation in Library.
Diffstat (limited to 'src/lib')
-rwxr-xr-xsrc/lib/dlt_user.c81
-rwxr-xr-xsrc/lib/dlt_user_cfg.h3
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