From 0b78edd4b27365f508d79c8dcbe431e6c0f947cc Mon Sep 17 00:00:00 2001 From: Christian Muck Date: Fri, 13 Jan 2012 09:12:22 +0100 Subject: [PATCH] [GSW-138] API Extension to resend the log messages in the user buffer fixed. --- include/dlt/dlt_user.h | 8 ++++++++ src/lib/dlt_user.c | 35 +++++++++++++++++++++++++++++++++++ src/lib/dlt_user_cfg.h | 7 +++++++ 3 files changed, 50 insertions(+) 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! */ /************************/ -- 2.7.4