From 7906ffc84be587b861c936bdb3fd1f91f4252aa3 Mon Sep 17 00:00:00 2001 From: Alexander Mohr Date: Wed, 11 Sep 2024 10:42:18 +0200 Subject: [PATCH] trace-load: protect settings with rwlock Signed-off-by: Alexander Mohr --- src/daemon/dlt-daemon.c | 2 ++ src/lib/dlt_user.c | 14 ++++++-------- src/shared/dlt_common.c | 4 ---- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/daemon/dlt-daemon.c b/src/daemon/dlt-daemon.c index 02ed79a07..1209022c8 100644 --- a/src/daemon/dlt-daemon.c +++ b/src/daemon/dlt-daemon.c @@ -3978,9 +3978,11 @@ bool trace_load_keep_message(DltDaemonApplication *app, app->apid, msg->extendedheader->ctid); if (trace_load_settings != NULL) { + pthread_rwlock_wrlock(&trace_load_rw_lock); keep_message = dlt_check_trace_load( trace_load_settings, mtin, msg->headerextra.tmsp, size, dlt_daemon_output_internal_msg, (void *)(¶ms)); + pthread_rwlock_unlock(&trace_load_rw_lock); } else { dlt_vlog( diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c index 2ad33e7f4..5fc8255da 100644 --- a/src/lib/dlt_user.c +++ b/src/lib/dlt_user.c @@ -229,7 +229,7 @@ static DltReturnValue dlt_unregister_app_util(bool force_sending_messages); static DltReturnValue dlt_user_output_internal_msg(DltLogLevelType loglevel, const char *text, void* params); DltTraceLoadSettings* trace_load_settings = NULL; uint32_t trace_load_settings_count = 0; -pthread_rwlock_t trace_load_rw_lock; +pthread_rwlock_t trace_load_rw_lock = PTHREAD_RWLOCK_INITIALIZER; #endif DltReturnValue dlt_user_check_library_version(const char *user_major_version, const char *user_minor_version) @@ -513,9 +513,6 @@ DltReturnValue dlt_init(void) #endif #ifdef DLT_TRACE_LOAD_CTRL_ENABLE - /* initialize for trace load check */ - - pthread_rwlock_init(&trace_load_rw_lock, NULL); pthread_rwlock_wrlock(&trace_load_rw_lock); trace_load_settings = malloc(sizeof(DltTraceLoadSettings)); @@ -4159,19 +4156,20 @@ DltReturnValue dlt_user_log_send_log(DltContextData *log, const int mtype, int * /* check trace load before output */ if (!sent_size) { + pthread_rwlock_wrlock(&trace_load_rw_lock); DltTraceLoadSettings* settings = dlt_find_runtime_trace_load_settings( trace_load_settings, trace_load_settings_count, dlt_user.appID, log->handle->contextID); - - if (!dlt_check_trace_load( + const bool trace_load_in_limits = dlt_check_trace_load( settings, log->log_level, time_stamp, sizeof(DltUserHeader) + msg.headersize - sizeof(DltStorageHeader) + log->size, dlt_user_output_internal_msg, - NULL)) - { + NULL); + pthread_rwlock_unlock(&trace_load_rw_lock); + if (!trace_load_in_limits){ return DLT_RETURN_LOAD_EXCEEDED; } } diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c index 362349642..7f6c6003d 100644 --- a/src/shared/dlt_common.c +++ b/src/shared/dlt_common.c @@ -4451,8 +4451,6 @@ bool dlt_check_trace_load( return false; } - pthread_rwlock_rdlock(&trace_load_rw_lock); - /* Switch window slot according to timestamp * If warning messages for hard/soft limit over are sent, * the message size will be returned. @@ -4474,8 +4472,6 @@ bool dlt_check_trace_load( */ const bool allow_output = !dlt_is_over_trace_load_hard_limit(tl_settings, size); - pthread_rwlock_unlock(&trace_load_rw_lock); - return allow_output; }