Skip to content

Commit d4b2bf7

Browse files
committed
trace-load: improve trace load lookup
store trace load in context instead of doing a search on each message Signed-off-by: Alexander Mohr <[email protected]>
1 parent 4e7ecb4 commit d4b2bf7

9 files changed

+135
-109
lines changed

include/dlt/dlt_user.h.in

+3
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@ typedef struct
180180
/* Log Level changed callback */
181181
void (*log_level_changed_callback)(char context_id[DLT_ID_SIZE], uint8_t log_level, uint8_t trace_status);
182182

183+
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
184+
DltTraceLoadSettings *trace_load_settings; /**< trace load setting for the context */
185+
#endif
183186
} dlt_ll_ts_type;
184187

185188
/**

src/daemon/dlt-daemon.c

+17-21
Original file line numberDiff line numberDiff line change
@@ -1636,6 +1636,13 @@ int main(int argc, char *argv[])
16361636
dlt_gateway_deinit(&daemon_local.pGateway, daemon_local.flags.vflag);
16371637

16381638
dlt_daemon_free(&daemon, daemon_local.flags.vflag);
1639+
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
1640+
if (daemon.preconfigured_trace_load_settings != NULL) {
1641+
free(daemon.preconfigured_trace_load_settings);
1642+
daemon.preconfigured_trace_load_settings = NULL;
1643+
}
1644+
pthread_rwlock_destroy(&trace_load_rw_lock);
1645+
#endif
16391646

16401647
dlt_log(LOG_NOTICE, "Leaving DLT daemon\n");
16411648

@@ -2747,11 +2754,6 @@ int dlt_daemon_process_client_connect(DltDaemon *daemon,
27472754
/* send new log state to all applications */
27482755
daemon->connectionState = 1;
27492756
dlt_daemon_user_send_all_log_state(daemon, verbose);
2750-
2751-
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
2752-
/* Reset number of received bytes from FIFO */
2753-
daemon->bytes_recv = 0;
2754-
#endif
27552757
}
27562758

27572759
return 0;
@@ -3143,14 +3145,6 @@ int dlt_daemon_process_user_messages(DltDaemon *daemon,
31433145
return -1;
31443146
}
31453147

3146-
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
3147-
/* Count up number of received bytes from FIFO */
3148-
if (receiver->bytesRcvd > receiver->lastBytesRcvd)
3149-
{
3150-
daemon->bytes_recv += receiver->bytesRcvd - receiver->lastBytesRcvd;
3151-
}
3152-
#endif
3153-
31543148
/* look through buffer as long as data is in there */
31553149
while ((receiver->bytesRcvd >= min_size) && run_loop) {
31563150
dlt_daemon_process_user_message_func func = NULL;
@@ -3976,24 +3970,26 @@ bool trace_load_keep_message(DltDaemonApplication *app,
39763970
app->apid,
39773971
};
39783972

3979-
DltTraceLoadSettings *trace_load_settings =
3980-
dlt_find_runtime_trace_load_settings(
3981-
app->trace_load_settings, app->trace_load_settings_count,
3982-
app->apid, msg->extendedheader->ctid);
3973+
DltDaemonContext *context = dlt_daemon_context_find(
3974+
daemon,
3975+
app->apid,
3976+
msg->extendedheader->ctid,
3977+
daemon->ecuid,
3978+
verbose);
39833979

3984-
if (trace_load_settings != NULL) {
3980+
if (context != NULL) {
39853981
pthread_rwlock_wrlock(&trace_load_rw_lock);
39863982
keep_message = dlt_check_trace_load(
3987-
trace_load_settings, mtin, msg->headerextra.tmsp, size,
3983+
context->trace_load_settings, mtin, msg->headerextra.tmsp, size,
39883984
dlt_daemon_output_internal_msg, (void *)(&params));
39893985
pthread_rwlock_unlock(&trace_load_rw_lock);
39903986
}
39913987
else {
39923988
dlt_vlog(
39933989
LOG_ERR,
3994-
"Failed to lookup trace load limits for %s, "
3990+
"Failed to find context for app %.4s and context %.4s "
39953991
"dropping message, likely app was not registered properly\n",
3996-
app->apid);
3992+
app->apid, msg->extendedheader->ctid);
39973993
keep_message = false;
39983994
}
39993995

src/daemon/dlt_daemon_client.c

-8
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,6 @@ static int dlt_daemon_client_send_all_multiple(DltDaemon *daemon,
158158
sent = 1;
159159
} /* for */
160160

161-
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
162-
if (sent)
163-
{
164-
const uint32_t serial_header = daemon->sendserialheader ? sizeof(dltSerialHeader) : 0;
165-
daemon->bytes_sent += size1 + size2 + serial_header;
166-
}
167-
#endif
168-
169161
return sent;
170162
}
171163

src/daemon/dlt_daemon_common.c

+18-9
Original file line numberDiff line numberDiff line change
@@ -388,8 +388,6 @@ int dlt_daemon_init(DltDaemon *daemon,
388388

389389
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
390390
daemon->preconfigured_trace_load_settings = NULL;
391-
daemon->bytes_sent = 0;
392-
daemon->bytes_recv = 0;
393391
#endif
394392

395393
daemon->sendserialheader = 0;
@@ -442,13 +440,6 @@ int dlt_daemon_free(DltDaemon *daemon, int verbose)
442440
free(daemon->app_id_log_level_settings);
443441
}
444442
#endif
445-
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
446-
if (daemon->preconfigured_trace_load_settings != NULL) {
447-
free(daemon->preconfigured_trace_load_settings);
448-
daemon->preconfigured_trace_load_settings = NULL;
449-
}
450-
pthread_rwlock_destroy(&trace_load_rw_lock);
451-
#endif
452443

453444
if (app_recv_buffer)
454445
free(app_recv_buffer);
@@ -1133,6 +1124,9 @@ DltDaemonContext *dlt_daemon_context_add(DltDaemon *daemon,
11331124

11341125
dlt_set_id(context->apid, apid);
11351126
dlt_set_id(context->ctid, ctid);
1127+
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
1128+
context->trace_load_settings = NULL;
1129+
#endif
11361130

11371131
application->num_contexts++;
11381132
new_context = 1;
@@ -1213,6 +1207,21 @@ DltDaemonContext *dlt_daemon_context_add(DltDaemon *daemon,
12131207
context->log_level_pos = log_level_pos;
12141208
context->user_handle = user_handle;
12151209

1210+
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
1211+
DltTraceLoadSettings* tl_settings = dlt_find_runtime_trace_load_settings(
1212+
application->trace_load_settings,
1213+
application->trace_load_settings_count,
1214+
application->apid,
1215+
context->ctid);
1216+
if (tl_settings == NULL) {
1217+
dlt_vlog(LOG_WARNING, "failed to find trace load settings for application %s context %s\n",
1218+
application->apid, context->ctid);
1219+
} else {
1220+
context->trace_load_settings = tl_settings;
1221+
}
1222+
#endif
1223+
1224+
12161225
/* In case a context is loaded from runtime config file,
12171226
* the user_handle is 0 and we mark that context as predefined.
12181227
*/

src/daemon/dlt_daemon_common.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,9 @@ typedef struct
163163
char *context_description; /**< context description */
164164
int8_t storage_log_level; /**< log level set for offline logstorage */
165165
bool predefined; /**< set to true if this context is predefined by runtime configuration file */
166+
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
167+
DltTraceLoadSettings* trace_load_settings; /**< trace load setting for the context */
168+
#endif
166169
} DltDaemonContext;
167170

168171
/*
@@ -215,8 +218,6 @@ typedef struct
215218
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
216219
DltTraceLoadSettings *preconfigured_trace_load_settings; /**< Settings for trace load */
217220
int preconfigured_trace_load_settings_count; /** < count of trace load settings */
218-
int bytes_sent;
219-
int bytes_recv;
220221
#endif
221222
} DltDaemon;
222223

src/lib/dlt_user.c

+43-42
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,6 @@ static DltReturnValue dlt_unregister_app_util(bool force_sending_messages);
229229
static DltReturnValue dlt_user_output_internal_msg(DltLogLevelType loglevel, const char *text, void* params);
230230
DltTraceLoadSettings* trace_load_settings = NULL;
231231
uint32_t trace_load_settings_count = 0;
232-
pthread_rwlock_t trace_load_rw_lock = PTHREAD_RWLOCK_INITIALIZER;
233232
#endif
234233

235234
DltReturnValue dlt_user_check_library_version(const char *user_major_version, const char *user_minor_version)
@@ -513,8 +512,8 @@ DltReturnValue dlt_init(void)
513512

514513
#endif
515514
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
516-
pthread_rwlock_wrlock(&trace_load_rw_lock);
517515

516+
DLT_SEM_LOCK();
518517
trace_load_settings = malloc(sizeof(DltTraceLoadSettings));
519518
if (trace_load_settings == NULL) {
520519
dlt_vlog(LOG_ERR, "Failed to allocate memory for trace load settings\n");
@@ -526,8 +525,7 @@ DltReturnValue dlt_init(void)
526525
trace_load_settings[0].hard_limit = DLT_TRACE_LOAD_CLIENT_HARD_LIMIT_DEFAULT;
527526
strncpy(trace_load_settings[0].apid, dlt_user.appID, DLT_ID_SIZE);
528527
trace_load_settings_count = 1;
529-
530-
pthread_rwlock_unlock(&trace_load_rw_lock);
528+
DLT_SEM_FREE();
531529

532530
#endif
533531
#ifdef DLT_LIB_USE_UNIX_SOCKET_IPC
@@ -958,10 +956,6 @@ void dlt_user_atexit_handler(void)
958956
/* Cleanup */
959957
/* Ignore return value */
960958
dlt_free();
961-
962-
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
963-
pthread_rwlock_destroy(&trace_load_rw_lock);
964-
#endif
965959
}
966960

967961
int dlt_user_atexit_blow_out_user_buffer(void)
@@ -1543,8 +1537,20 @@ DltReturnValue dlt_register_context_ll_ts_llccb(DltContext *handle,
15431537

15441538
dlt_user.dlt_ll_ts_num_entries++;
15451539

1546-
DLT_SEM_FREE();
1540+
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
1541+
DltTraceLoadSettings* settings = dlt_find_runtime_trace_load_settings(
1542+
trace_load_settings,
1543+
trace_load_settings_count,
1544+
dlt_user.appID,
1545+
ctx_entry->contextID);
1546+
if (settings == NULL) {
1547+
dlt_vlog(LOG_WARNING, "No trace load settings found for %s.%s\n", dlt_user.appID, log.handle->contextID);
1548+
} else {
1549+
ctx_entry->trace_load_settings = settings;
1550+
}
15471551

1552+
#endif
1553+
DLT_SEM_FREE();
15481554
return dlt_user_log_send_register_context(&log);
15491555
}
15501556

@@ -4169,19 +4175,16 @@ DltReturnValue dlt_user_log_send_log(DltContextData *log, const int mtype, int *
41694175
/* check trace load before output */
41704176
if (!sent_size)
41714177
{
4172-
pthread_rwlock_wrlock(&trace_load_rw_lock);
4173-
DltTraceLoadSettings* settings =
4174-
dlt_find_runtime_trace_load_settings(
4175-
trace_load_settings, trace_load_settings_count, dlt_user.appID, log->handle->contextID);
4178+
DLT_SEM_LOCK();
41764179
const bool trace_load_in_limits = dlt_check_trace_load(
4177-
settings,
4180+
dlt_user.dlt_ll_ts[log->handle->log_level_pos].trace_load_settings,
41784181
log->log_level, time_stamp,
41794182
sizeof(DltUserHeader)
41804183
+ msg.headersize - sizeof(DltStorageHeader)
41814184
+ log->size,
41824185
dlt_user_output_internal_msg,
41834186
NULL);
4184-
pthread_rwlock_unlock(&trace_load_rw_lock);
4187+
DLT_SEM_FREE();
41854188
if (!trace_load_in_limits){
41864189
return DLT_RETURN_LOAD_EXCEEDED;
41874190
}
@@ -4403,7 +4406,6 @@ DltReturnValue dlt_user_log_send_register_context(DltContextData *log)
44034406
usercontext.description_length);
44044407

44054408
return DLT_RETURN_OK;
4406-
44074409
}
44084410

44094411
DltReturnValue dlt_user_log_send_unregister_context(DltContextData *log)
@@ -4882,18 +4884,16 @@ DltReturnValue dlt_user_log_check_user_message(void)
48824884
trace_load_settings_user_messages =
48834885
(DltUserControlMsgTraceSettingMsg *)(receiver->buf + sizeof(DltUserHeader) + sizeof(uint32_t));
48844886

4885-
pthread_rwlock_wrlock(&trace_load_rw_lock);
4887+
DLT_SEM_LOCK();
48864888

48874889
// Remove the default created at startup
48884890
if (trace_load_settings != NULL) {
48894891
free(trace_load_settings);
48904892
}
48914893

4892-
char msg[255];
48934894
trace_load_settings_alloc_size = sizeof(DltTraceLoadSettings) * trace_load_settings_user_messages_count;
48944895
trace_load_settings = malloc(trace_load_settings_alloc_size);
48954896
if (trace_load_settings == NULL) {
4896-
pthread_rwlock_unlock(&trace_load_rw_lock);
48974897
dlt_log(LOG_ERR, "Failed to allocate memory for trace load settings\n");
48984898
return DLT_RETURN_ERROR;
48994899
}
@@ -4904,29 +4904,33 @@ DltReturnValue dlt_user_log_check_user_message(void)
49044904
trace_load_settings[i].soft_limit = trace_load_settings_user_messages[i].soft_limit;
49054905
trace_load_settings[i].hard_limit = trace_load_settings_user_messages[i].hard_limit;
49064906
}
4907+
49074908
trace_load_settings_count = trace_load_settings_user_messages_count;
4908-
pthread_rwlock_unlock(&trace_load_rw_lock);
4909+
for (i = 0; i < dlt_user.dlt_ll_ts_num_entries; ++i) {
4910+
dlt_ll_ts_type* ctx_entry = &dlt_user.dlt_ll_ts[i];
4911+
ctx_entry->trace_load_settings = dlt_find_runtime_trace_load_settings(
4912+
trace_load_settings, trace_load_settings_count, dlt_user.appID, ctx_entry->contextID);
4913+
}
4914+
DLT_SEM_FREE();
49094915

4910-
// must be sent with unlocked trace_load_rw_lock
4911-
for (i = 0; i < trace_load_settings_user_messages_count; i++) {
4912-
if (trace_load_settings[i].ctid[0] == '\0') {
4913-
snprintf(
4914-
msg, sizeof(msg),
4915-
"Received trace load settings: apid=%.4s, soft_limit=%u, hard_limit=%u\n",
4916-
trace_load_settings[i].apid,
4917-
trace_load_settings[i].soft_limit,
4918-
trace_load_settings[i].hard_limit);
4919-
} else {
4920-
snprintf(
4921-
msg, sizeof(msg),
4922-
"Received trace load settings: apid=%.4s, ctid=%.4s, soft_limit=%u, hard_limit=%u\n",
4923-
trace_load_settings[i].apid,
4924-
trace_load_settings[i].ctid,
4925-
trace_load_settings[i].soft_limit,
4926-
trace_load_settings[i].hard_limit);
4927-
}
4928-
dlt_user_output_internal_msg(DLT_LOG_INFO, msg, NULL);
4916+
// The log messages only can be produced safely when
4917+
// the trace load settings are set up fully.
4918+
char msg[255];
4919+
if (trace_load_settings[i].ctid[0] == '\0') {
4920+
snprintf(msg, sizeof(msg), "Received trace load settings: apid=%.4s, soft_limit=%u, hard_limit=%u\n",
4921+
trace_load_settings[i].apid,
4922+
trace_load_settings[i].soft_limit,
4923+
trace_load_settings[i].hard_limit);
4924+
} else {
4925+
snprintf(
4926+
msg, sizeof(msg),
4927+
"Received trace load settings: apid=%.4s, ctid=%.4s, soft_limit=%u, hard_limit=%u\n",
4928+
trace_load_settings[i].apid,
4929+
trace_load_settings[i].ctid,
4930+
trace_load_settings[i].soft_limit,
4931+
trace_load_settings[i].hard_limit);
49294932
}
4933+
dlt_user_output_internal_msg(DLT_LOG_INFO, msg, NULL);
49304934

49314935
/* keep not read data in buffer */
49324936
if (dlt_receiver_remove(receiver, trace_load_settings_user_message_bytes_required)
@@ -5349,9 +5353,6 @@ static void dlt_fork_child_fork_handler()
53495353
g_dlt_is_child = 1;
53505354
dlt_user_init_state = INIT_UNITIALIZED;
53515355
dlt_user.dlt_log_handle = -1;
5352-
#ifdef DLT_TRACE_LOAD_CTRL_ENABLE
5353-
pthread_rwlock_unlock(&trace_load_rw_lock);
5354-
#endif
53555356
}
53565357

53575358

src/shared/dlt_common.c

+6
Original file line numberDiff line numberDiff line change
@@ -4453,6 +4453,12 @@ bool dlt_check_trace_load(
44534453
return true;
44544454
}
44554455

4456+
if (tl_settings == NULL)
4457+
{
4458+
internal_dlt_log(DLT_LOG_ERROR, "tl_settings is NULL", internal_dlt_log_params);
4459+
return false;
4460+
}
4461+
44564462
if (size < 0)
44574463
{
44584464
dlt_vlog(LOG_ERR, "Invalid size: %d", size);

0 commit comments

Comments
 (0)