diff options
author | Christian Muck <christian.muck@bmw.de> | 2012-01-13 09:12:22 +0100 |
---|---|---|
committer | Christian Muck <christian.muck@bmw.de> | 2012-01-13 09:12:22 +0100 |
commit | 0b78edd4b27365f508d79c8dcbe431e6c0f947cc (patch) | |
tree | 2a14663bc59e7effb6e37f0717d364106db54e40 | |
parent | d5ae8f4c6354349fc047898122a50932a3cb608a (diff) | |
download | DLT-daemon-0b78edd4b27365f508d79c8dcbe431e6c0f947cc.tar.gz |
[GSW-138] API Extension to resend the log messages in the user buffer fixed.
-rwxr-xr-x | include/dlt/dlt_user.h | 8 | ||||
-rwxr-xr-x | src/lib/dlt_user.c | 35 | ||||
-rwxr-xr-x | src/lib/dlt_user_cfg.h | 7 |
3 files changed, 50 insertions, 0 deletions
diff --git a/include/dlt/dlt_user.h b/include/dlt/dlt_user.h index b128244..ac889c7 100755 --- a/include/dlt/dlt_user.h +++ b/include/dlt/dlt_user.h @@ -596,6 +596,14 @@ int dlt_forward_msg(void *msgdata,size_t size); */ int dlt_user_check_buffer(int *total_size, int *used_size); +/** + * Try to resend log message in the user buffer. Stops if the dlt_uptime is bigger than + * dlt_uptime() + DLT_USER_ATEXIT_RESEND_BUFFER_EXIT_TIMEOUT. A pause between the resending + * attempts can be defined with DLT_USER_ATEXIT_RESEND_BUFFER_SLEEP + * @return number of messages in the user buffer + */ +int dlt_user_atexit_blow_out_user_buffer(void); + #ifdef __cplusplus } #endif diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c index 8c82dd3..594fe39 100755 --- a/src/lib/dlt_user.c +++ b/src/lib/dlt_user.c @@ -331,6 +331,16 @@ int dlt_init_common(void) void dlt_user_atexit_handler(void) { + + /* Try to resend potential log messages in the user buffer */ + int count = dlt_user_atexit_blow_out_user_buffer(); + + if(count != 0){ + char tmp[256]; + sprintf(&tmp,"Lost log messages in user buffer when exiting: %i\n",count); + dlt_log(LOG_ERR, tmp); + } + /* Unregister app (this also unregisters all contexts in daemon) */ /* Ignore return value */ dlt_unregister_app(); @@ -340,6 +350,31 @@ void dlt_user_atexit_handler(void) dlt_free(); } +int dlt_user_atexit_blow_out_user_buffer(void){ + + int count,ret; + + uint32_t exitTime = dlt_uptime() + DLT_USER_ATEXIT_RESEND_BUFFER_EXIT_TIMEOUT; + + while(dlt_uptime() < exitTime ){ + + ret = dlt_user_log_resend_buffer(); + + if(ret == 0) + { + return 0; + } + + usleep(DLT_USER_ATEXIT_RESEND_BUFFER_SLEEP); + } + + DLT_SEM_LOCK(); + count = dlt_buffer_get_message_count(&(dlt_user.startup_buffer)); + DLT_SEM_FREE(); + + return count; +} + int dlt_free(void) { int i; diff --git a/src/lib/dlt_user_cfg.h b/src/lib/dlt_user_cfg.h index e3bb8a3..46e8c52 100755 --- a/src/lib/dlt_user_cfg.h +++ b/src/lib/dlt_user_cfg.h @@ -132,6 +132,13 @@ /* Name of environment variable for local print mode */
#define DLT_USER_ENV_LOCAL_PRINT_MODE "DLT_LOCAL_PRINT_MODE"
+/* Timeout offset for resending user buffer at exit in usec (1000 usec = 1ms)*/
+#define DLT_USER_ATEXIT_RESEND_BUFFER_EXIT_TIMEOUT 100000
+
+/* Sleeps between resending user buffer at exit in usec (1000 usec = 1ms)*/
+#define DLT_USER_ATEXIT_RESEND_BUFFER_SLEEP 1000
+
+
/************************/
/* Don't change please! */
/************************/
|