summaryrefslogtreecommitdiff
path: root/src/lib/dlt_user.c
diff options
context:
space:
mode:
authorSaya Sugiura <ssugiura@jp.adit-jv.com>2021-03-26 02:52:13 +0000
committerSaya Sugiura <39760799+ssugiura@users.noreply.github.com>2021-10-05 11:19:26 +0900
commit3c3ead84aa51abc8d95c5ee974182194949f63c9 (patch)
tree116153d8ccb8ef32dedb1bc3cc6a808c14c6c0da /src/lib/dlt_user.c
parentcf79abb110c7ff8b5b75c6f48beeddd9d92dfbd3 (diff)
downloadDLT-daemon-3c3ead84aa51abc8d95c5ee974182194949f63c9.tar.gz
lib: Add new interfaces with given buffer
This commit adds new interfaces: - dlt_user_log_write_start_w_given_buffer(): accepts a log buffer as an input. - dlt_user_log_write_finish_w_given_buffer(): finalizes logging and send the message to corresponding output This is to reduce DLT API calls in DLT application as much as possible and avoid allocating dynamic memory within DLT library. The log buffer has to be prepared in DLT application in order to use these interfaces. Signed-off-by: Saya Sugiura <ssugiura@jp.adit-jv.com>
Diffstat (limited to 'src/lib/dlt_user.c')
-rw-r--r--src/lib/dlt_user.c122
1 files changed, 92 insertions, 30 deletions
diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c
index d2ef613..d29a7a0 100644
--- a/src/lib/dlt_user.c
+++ b/src/lib/dlt_user.c
@@ -1719,6 +1719,26 @@ int dlt_set_resend_timeout_atexit(uint32_t timeout_in_milliseconds)
/* ********************************************************************************************* */
+DltReturnValue dlt_user_log_write_start_init(DltContext *handle,
+ DltContextData *log,
+ DltLogLevelType loglevel,
+ bool is_verbose)
+{
+ DLT_LOG_FATAL_RESET_TRAP(loglevel);
+
+ /* initialize values */
+ if ((dlt_user_log_init(handle, log) < DLT_RETURN_OK) || (dlt_user.dlt_ll_ts == NULL))
+ return DLT_RETURN_ERROR;
+
+ log->args_num = 0;
+ log->log_level = loglevel;
+ log->size = 0;
+ log->use_timestamp = DLT_AUTO_TIMESTAMP;
+ log->verbose_mode = is_verbose;
+
+ return DLT_RETURN_TRUE;
+}
+
static DltReturnValue dlt_user_log_write_start_internal(DltContext *handle,
DltContextData *log,
DltLogLevelType loglevel,
@@ -1744,8 +1764,7 @@ DltReturnValue dlt_user_log_write_start_internal(DltContext *handle,
uint32_t messageid,
bool is_verbose)
{
- DLT_LOG_FATAL_RESET_TRAP(loglevel);
- DltReturnValue ret = DLT_RETURN_OK;
+ int ret = DLT_RETURN_TRUE;
/* check nullpointer */
if ((handle == NULL) || (log == NULL))
@@ -1758,47 +1777,78 @@ DltReturnValue dlt_user_log_write_start_internal(DltContext *handle,
/* check log levels */
ret = dlt_user_is_logLevel_enabled(handle, loglevel);
- if (ret == DLT_RETURN_WRONG_PARAMETER)
+ if (ret == DLT_RETURN_WRONG_PARAMETER) {
return DLT_RETURN_WRONG_PARAMETER;
- else if (ret == DLT_RETURN_LOGGING_DISABLED)
+ } else if (ret == DLT_RETURN_LOGGING_DISABLED) {
+ log->handle = NULL;
return DLT_RETURN_OK;
+ }
- /* initialize values */
- if ((dlt_user_log_init(handle, log) < DLT_RETURN_OK) || (dlt_user.dlt_ll_ts == NULL))
- return DLT_RETURN_ERROR;
+ ret = dlt_user_log_write_start_init(handle, log, loglevel, is_verbose);
+ if (ret == DLT_RETURN_TRUE) {
+ /* initialize values */
+ if (log->buffer == NULL) {
+ log->buffer = calloc(sizeof(unsigned char), dlt_user.log_buf_len);
- /* initialize values */
- if (log->buffer == NULL) {
- log->buffer = calloc(sizeof(unsigned char), dlt_user.log_buf_len);
+ if (log->buffer == NULL) {
+ dlt_vlog(LOG_ERR, "Cannot allocate buffer for DLT Log message\n");
+ return DLT_RETURN_ERROR;
+ }
+ }
- if (log->buffer == NULL) {
- dlt_vlog(LOG_ERR, "Cannot allocate buffer for DLT Log message\n");
- return DLT_RETURN_ERROR;
+ /* In non-verbose mode, insert message id */
+ if (!is_verbose_mode(dlt_user.verbose_mode, log)) {
+ if ((sizeof(uint32_t)) > dlt_user.log_buf_len) {
+ return DLT_RETURN_USER_BUFFER_FULL;
+ }
+
+ /* Write message id */
+ memcpy(log->buffer, &(messageid), sizeof(uint32_t));
+ log->size = sizeof(uint32_t);
+
+ /* as the message id is part of each message in non-verbose mode,
+ * it doesn't increment the argument counter in extended header (if used) */
}
}
- log->args_num = 0;
- log->log_level = loglevel;
- log->size = 0;
- log->use_timestamp = DLT_AUTO_TIMESTAMP;
- log->verbose_mode = is_verbose;
+ return ret;
+}
- /* In non-verbose mode, insert message id */
- if (!is_verbose_mode(dlt_user.verbose_mode, log)) {
- if ((sizeof(uint32_t)) > dlt_user.log_buf_len)
- return DLT_RETURN_USER_BUFFER_FULL;
+DltReturnValue dlt_user_log_write_start_w_given_buffer(DltContext *handle,
+ DltContextData *log,
+ DltLogLevelType loglevel,
+ char *buffer,
+ size_t size,
+ int32_t args_num)
+{
+ int ret = DLT_RETURN_TRUE;
- /* Write message id */
- memcpy(log->buffer, &(messageid), sizeof(uint32_t));
- log->size = sizeof(uint32_t);
+ /* check nullpointer */
+ if ((handle == NULL) || (log == NULL) || (buffer == NULL))
+ return DLT_RETURN_WRONG_PARAMETER;
- /* as the message id is part of each message in non-verbose mode,
- * it doesn't increment the argument counter in extended header (if used) */
- }
+ /* discard unexpected parameters */
+ if ((size <= 0) || (size > dlt_user.log_buf_len) || (args_num <= 0))
+ return DLT_RETURN_WRONG_PARAMETER;
- return DLT_RETURN_TRUE;
-}
+ /* forbid dlt usage in child after fork */
+ if (g_dlt_is_child)
+ return DLT_RETURN_ERROR;
+
+ /* discard non-verbose mode */
+ if (dlt_user.verbose_mode == 0)
+ return DLT_RETURN_ERROR;
+
+ ret = dlt_user_log_write_start_init(handle, log, loglevel, true);
+ if (ret == DLT_RETURN_TRUE) {
+ log->buffer = (unsigned char *)buffer;
+ log->size = size;
+ log->args_num = args_num;
+ }
+ return ret;
+ }
+
DltReturnValue dlt_user_log_write_finish(DltContextData *log)
{
int ret = DLT_RETURN_ERROR;
@@ -1813,6 +1863,18 @@ DltReturnValue dlt_user_log_write_finish(DltContextData *log)
return ret;
}
+DltReturnValue dlt_user_log_write_finish_w_given_buffer(DltContextData *log)
+{
+ int ret = DLT_RETURN_ERROR;
+
+ if (log == NULL)
+ return DLT_RETURN_WRONG_PARAMETER;
+
+ ret = dlt_user_log_send_log(log, DLT_TYPE_LOG);
+
+ return ret;
+}
+
static DltReturnValue dlt_user_log_write_raw_internal(DltContextData *log, const void *data, uint16_t length, DltFormatType type, const char *name, bool with_var_info)
{
/* check nullpointer */