summaryrefslogtreecommitdiff
path: root/src/lib/dlt_user.c
diff options
context:
space:
mode:
authorAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2014-07-28 13:33:23 +0200
committerAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2014-08-12 10:46:04 +0200
commit87936e5249b2c22eefac0acfc21696e209ee6d35 (patch)
tree1d9c39ff8ab4c101c21ffed1365800e9d58403a7 /src/lib/dlt_user.c
parent312e8742c7a650a113180bf0564a49de03dc29c8 (diff)
downloadDLT-daemon-87936e5249b2c22eefac0acfc21696e209ee6d35.tar.gz
New Callback function in DLT library, called when log level of context is changed
Signed-off-by: Alexander Wenzel <Alexander.AW.Wenzel@bmw.de>
Diffstat (limited to 'src/lib/dlt_user.c')
-rw-r--r--src/lib/dlt_user.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c
index a721f1c..bf63ed7 100644
--- a/src/lib/dlt_user.c
+++ b/src/lib/dlt_user.c
@@ -586,6 +586,7 @@ int dlt_free(void)
dlt_user.dlt_ll_ts[i].injection_table = 0;
}
dlt_user.dlt_ll_ts[i].nrcallbacks = 0;
+ dlt_user.dlt_ll_ts[i].log_level_changed_callback = 0;
}
free(dlt_user.dlt_ll_ts);
@@ -814,6 +815,8 @@ int dlt_register_context_ll_ts(DltContext *handle, const char *contextid, const
dlt_user.dlt_ll_ts[i].injection_table = 0;
dlt_user.dlt_ll_ts[i].nrcallbacks = 0;
+ dlt_user.dlt_ll_ts[i].log_level_changed_callback = 0;
+
}
}
else
@@ -858,6 +861,7 @@ int dlt_register_context_ll_ts(DltContext *handle, const char *contextid, const
dlt_user.dlt_ll_ts[i].injection_table = 0;
dlt_user.dlt_ll_ts[i].nrcallbacks = 0;
+ dlt_user.dlt_ll_ts[i].log_level_changed_callback = 0;
}
}
}
@@ -1036,6 +1040,7 @@ int dlt_unregister_context(DltContext *handle)
}
dlt_user.dlt_ll_ts[handle->log_level_pos].nrcallbacks = 0;
+ dlt_user.dlt_ll_ts[handle->log_level_pos].log_level_changed_callback = 0;
}
DLT_SEM_FREE();
@@ -2002,6 +2007,48 @@ int dlt_register_injection_callback(DltContext *handle, uint32_t service_id,
return 0;
}
+int dlt_register_log_level_changed_callback(DltContext *handle,
+ void (*dlt_log_level_changed_callback)(char context_id[DLT_ID_SIZE],uint8_t log_level, uint8_t trace_status))
+{
+ DltContextData log;
+ uint32_t i;
+
+ if (handle==0)
+ {
+ return -1;
+ }
+
+ if (dlt_user_log_init(handle, &log)==-1)
+ {
+ return -1;
+ }
+
+ /* This function doesn't make sense storing to local file is choosen;
+ so terminate this function */
+ if (dlt_user.dlt_is_file)
+ {
+ return 0;
+ }
+
+ DLT_SEM_LOCK();
+
+ if (dlt_user.dlt_ll_ts==0)
+ {
+ DLT_SEM_FREE();
+ return 0;
+ }
+
+ /* Insert callback in corresponding table */
+ i=handle->log_level_pos;
+
+ /* Store new callback function */
+ dlt_user.dlt_ll_ts[i].log_level_changed_callback = dlt_log_level_changed_callback;
+
+ DLT_SEM_FREE();
+
+ return 0;
+}
+
/**
* NW Trace related
*/
@@ -3570,12 +3617,14 @@ int dlt_user_log_check_user_message(void)
/* For delayed calling of injection callback, to avoid deadlock */
DltUserInjectionCallback delayed_injection_callback;
+ DltUserLogLevelChangedCallback delayed_log_level_changed_callback;
unsigned char *delayed_inject_buffer = 0;
uint32_t delayed_inject_data_length = 0;
/* Ensure that callback is null before searching for it */
delayed_injection_callback.injection_callback = 0;
delayed_injection_callback.service_id = 0;
+ delayed_log_level_changed_callback.log_level_changed_callback = 0;
if (dlt_user.dlt_user_handle!=DLT_FD_INIT)
{
@@ -3653,12 +3702,25 @@ int dlt_user_log_check_user_message(void)
*(dlt_user.dlt_ll_ts[usercontextll->log_level_pos].log_level_ptr) = usercontextll->log_level;
if(dlt_user.dlt_ll_ts[usercontextll->log_level_pos].trace_status_ptr)
*(dlt_user.dlt_ll_ts[usercontextll->log_level_pos].trace_status_ptr) = usercontextll->trace_status;
+
+ delayed_log_level_changed_callback.log_level_changed_callback = dlt_user.dlt_ll_ts[usercontextll->log_level_pos].log_level_changed_callback;
+ memcpy(delayed_log_level_changed_callback.contextID,dlt_user.dlt_ll_ts[usercontextll->log_level_pos].contextID,DLT_ID_SIZE);
+ delayed_log_level_changed_callback.log_level = usercontextll->log_level;
+ delayed_log_level_changed_callback.trace_status = usercontextll->trace_status;
}
}
DLT_SEM_FREE();
}
+ /* call callback outside of semaphore */
+ if(delayed_log_level_changed_callback.log_level_changed_callback!=0)
+ {
+ delayed_log_level_changed_callback.log_level_changed_callback(delayed_log_level_changed_callback.contextID,
+ delayed_log_level_changed_callback.log_level,
+ delayed_log_level_changed_callback.trace_status);
+ }
+
/* keep not read data in buffer */
if (dlt_receiver_remove(receiver,sizeof(DltUserHeader)+sizeof(DltUserControlMsgLogLevel))==-1)
{