summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Lipka <clipka@jp.adit-jv.com>2016-05-11 12:13:58 +0900
committerAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2016-09-23 15:37:23 +0200
commit53cd25f1e37c65d465493df6e7e3ebb0270bd651 (patch)
tree855fdb70d6996d96defa7491ae454fccdb2effee
parentb2326c879612f35e6fcacdf4c9957e942a1d5741 (diff)
downloadDLT-daemon-53cd25f1e37c65d465493df6e7e3ebb0270bd651.tar.gz
Add dlt_user_is_logLevel_enabled API
This function allows an application developer to check if the DLT LogLevel is enabled before starting any log string creation. It can be used in application specific logging wrapper functions. Signed-off-by: Christoph Lipka <clipka@jp.adit-jv.com> Change-Id: I4c269b12bfdeae29a4e795385cdbc54a579ba621
-rw-r--r--include/dlt/dlt_types.h1
-rw-r--r--include/dlt/dlt_user.h23
-rw-r--r--include/dlt/dlt_user_macros.h25
-rw-r--r--src/lib/dlt_user.c2
-rw-r--r--src/tests/dlt-test-user.c50
-rw-r--r--tests/gtest_dlt_user.cpp28
6 files changed, 120 insertions, 9 deletions
diff --git a/include/dlt/dlt_types.h b/include/dlt/dlt_types.h
index cd12e77..03cd036 100644
--- a/include/dlt/dlt_types.h
+++ b/include/dlt/dlt_types.h
@@ -85,6 +85,7 @@ typedef unsigned int speed_t;
*/
typedef enum
{
+ DLT_RETURN_LOGGING_DISABLED = -7,
DLT_RETURN_USER_BUFFER_FULL = -6,
DLT_RETURN_WRONG_PARAMETER = -5,
DLT_RETURN_BUFFER_FULL = -4,
diff --git a/include/dlt/dlt_user.h b/include/dlt/dlt_user.h
index a24117e..792ebbe 100644
--- a/include/dlt/dlt_user.h
+++ b/include/dlt/dlt_user.h
@@ -769,6 +769,29 @@ int dlt_user_atexit_blow_out_user_buffer(void);
*/
DltReturnValue dlt_user_log_resend_buffer(void);
+/**
+ * Checks the log level passed by the log function if enabled for that context or not.
+ * This function can be called by applications before generating their logs.
+ * Also called before writing new log messages.
+ * @param handle pointer to an object containing information about one special logging context
+ * @param loglevel this is the current log level of the log message to be sent
+ * @return Value from DltReturnValue enum, DLT_RETURN_TRUE if log level is enabled
+ */
+static inline DltReturnValue dlt_user_is_logLevel_enabled(DltContext *handle,DltLogLevelType loglevel)
+{
+ if (handle == NULL || handle->log_level_ptr == NULL)
+ {
+ return DLT_RETURN_WRONG_PARAMETER;
+ }
+
+ if (loglevel <= (DltLogLevelType)(*(handle->log_level_ptr)) && loglevel != DLT_LOG_OFF)
+ {
+ return DLT_RETURN_TRUE;
+ }
+
+ return DLT_RETURN_LOGGING_DISABLED;
+}
+
#ifdef DLT_TEST_ENABLE
void dlt_user_test_corrupt_user_header(int enable);
void dlt_user_test_corrupt_message_size(int enable,int16_t size);
diff --git a/include/dlt/dlt_user_macros.h b/include/dlt/dlt_user_macros.h
index 919df7e..e1e9104 100644
--- a/include/dlt/dlt_user_macros.h
+++ b/include/dlt/dlt_user_macros.h
@@ -181,7 +181,7 @@
#else
#define DLT_LOG(CONTEXT,LOGLEVEL,ARGS...) \
do { \
- if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \
+ if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \
{ \
DltContextData log_local; \
int dlt_local; \
@@ -213,7 +213,7 @@
#else
#define DLT_LOG_ID(CONTEXT,LOGLEVEL,MSGID,ARGS...) \
do { \
- if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \
+ if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \
{ \
DltContextData log_local; \
int dlt_local; \
@@ -398,7 +398,7 @@
*/
#define DLT_LOG_STRING(CONTEXT,LOGLEVEL,TEXT) \
do { \
- if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \
+ if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \
{ \
(void)dlt_log_string(&(CONTEXT), LOGLEVEL, TEXT); \
} \
@@ -413,7 +413,7 @@
*/
#define DLT_LOG_STRING_INT(CONTEXT,LOGLEVEL,TEXT,INT_VAR) \
do { \
- if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \
+ if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \
{ \
(void)dlt_log_string_int(&(CONTEXT), LOGLEVEL, TEXT, INT_VAR); \
} \
@@ -428,7 +428,7 @@
*/
#define DLT_LOG_STRING_UINT(CONTEXT,LOGLEVEL,TEXT,UINT_VAR) \
do { \
- if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \
+ if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \
{ \
(void)dlt_log_string_uint(&(CONTEXT),LOGLEVEL,TEXT,UINT_VAR); \
} \
@@ -442,7 +442,7 @@
*/
#define DLT_LOG_UINT(CONTEXT,LOGLEVEL,UINT_VAR) \
do { \
- if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \
+ if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \
{ \
(void)dlt_log_uint(&(CONTEXT),LOGLEVEL,UINT_VAR); \
} \
@@ -456,7 +456,7 @@
*/
#define DLT_LOG_INT(CONTEXT,LOGLEVEL,INT_VAR) \
do { \
- if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \
+ if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \
{ \
(void)dlt_log_int(&(CONTEXT),LOGLEVEL,INT_VAR); \
} \
@@ -471,7 +471,7 @@
*/
#define DLT_LOG_RAW(CONTEXT,LOGLEVEL,BUF,LEN) \
do { \
- if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \
+ if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \
{ \
(void)dlt_log_raw(&(CONTEXT),LOGLEVEL,BUF,LEN); \
} \
@@ -523,6 +523,15 @@
(void)dlt_disable_local_print();} while(0)
/**
+ * Check if log level is enabled
+ *
+ * @param CONTEXT object containing information about one special logging context
+ * @param LOGLEVEL the log level of the log message
+ */
+#define DLT_IS_LOG_LEVEL_ENABLED(CONTEXT,LOGLEVEL) \
+ (dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL) == DLT_RETURN_TRUE)
+
+/**
\}
*/
diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c
index ef0f36f..ca7a56d 100644
--- a/src/lib/dlt_user.c
+++ b/src/lib/dlt_user.c
@@ -1371,7 +1371,7 @@ DltReturnValue dlt_user_log_write_start_id(DltContext *handle, DltContextData *l
log->size = 0;
/* check log levels */
- if (handle->log_level_ptr != NULL && (loglevel <= (int) *(handle->log_level_ptr)) && (loglevel != DLT_LOG_OFF))
+ if (dlt_user_is_logLevel_enabled(handle, loglevel) == DLT_RETURN_TRUE)
{
/* In non-verbose mode, insert message id */
if (dlt_user.verbose_mode == 0)
diff --git a/src/tests/dlt-test-user.c b/src/tests/dlt-test-user.c
index 16479a2..9a57573 100644
--- a/src/tests/dlt-test-user.c
+++ b/src/tests/dlt-test-user.c
@@ -78,6 +78,18 @@
#define DLT_TEST_NUM_CONTEXT 9
+/* LogLevel string representation */
+static const char *loglevelstr[DLT_LOG_MAX] =
+{
+ "DLT_LOG_OFF",
+ "DLT_LOG_FATAL",
+ "DLT_LOG_ERROR",
+ "DLT_LOG_WARN",
+ "DLT_LOG_INFO",
+ "DLT_LOG_DEBUG",
+ "DLT_LOG_VERBOSE"
+};
+
/* Test functions... */
/* for macro interface */
@@ -478,6 +490,7 @@ int test5m(void)
{
char buffer[32];
int num;
+ int i;
void *ptr = malloc(sizeof(int));
@@ -510,6 +523,26 @@ int test5m(void)
DLT_LOG(context_macro_test[4],DLT_LOG_INFO,DLT_STRING("Next line: DLT_LOG_PTR"));
DLT_LOG(context_macro_test[4],DLT_LOG_INFO,DLT_PTR(ptr));
+
+ DLT_LOG(context_macro_test[4],DLT_LOG_INFO,DLT_STRING("Next lines: DLT_IS_LOG_LEVEL_ENABLED"));
+ for (i = DLT_LOG_FATAL; i < DLT_LOG_MAX; i++)
+ {
+ if (DLT_IS_LOG_LEVEL_ENABLED(context_macro_test[4],i))
+ {
+ DLT_LOG(context_info,
+ DLT_LOG_INFO,
+ DLT_STRING("Loglevel is enabled: "),
+ DLT_STRING(loglevelstr[i]));
+ }
+ else
+ {
+ DLT_LOG(context_info,
+ DLT_LOG_INFO,
+ DLT_STRING("Loglevel is disabled: "),
+ DLT_STRING(loglevelstr[i]));
+ }
+ }
+
/* wait 2 second before next test */
sleep(2);
DLT_LOG(context_info,DLT_LOG_INFO,DLT_STRING("Test5: (Macro IF) finished"));
@@ -990,6 +1023,8 @@ int test5f(void)
{
char buffer[32];
int num;
+ int i;
+ char log[DLT_USER_BUF_MAX_SIZE];
for(num=0;num<32;num++)
{
@@ -1018,6 +1053,21 @@ int test5f(void)
dlt_log_string(&(context_function_test[4]),DLT_LOG_INFO,"Next line: dlt_log_string_uint()");
dlt_log_string_uint(&(context_function_test[4]), DLT_LOG_INFO,"String output: ", 42);
+ dlt_log_string(&(context_function_test[4]),DLT_LOG_INFO, "Next lines: dlt_user_is_logLevel_enabled");
+ for (i = DLT_LOG_FATAL; i < DLT_LOG_MAX; i++)
+ {
+ if (dlt_user_is_logLevel_enabled(&(context_function_test[4]),i) == DLT_RETURN_TRUE)
+ {
+ snprintf(log, DLT_USER_BUF_MAX_SIZE, "Loglevel is enabled: %s", loglevelstr[i]);
+ dlt_log_string(&(context_function_test[4]),DLT_LOG_INFO, log);
+ }
+ else
+ {
+ snprintf(log, DLT_USER_BUF_MAX_SIZE, "Loglevel is disabled: %s", loglevelstr[i]);
+ dlt_log_string(&(context_function_test[4]),DLT_LOG_INFO, log);
+ }
+ }
+
/* wait 2 second before next test */
sleep(2);
dlt_log_string(&context_info,DLT_LOG_INFO,"Test5: (Function IF) finished");
diff --git a/tests/gtest_dlt_user.cpp b/tests/gtest_dlt_user.cpp
index d4a44bc..c8bf2de 100644
--- a/tests/gtest_dlt_user.cpp
+++ b/tests/gtest_dlt_user.cpp
@@ -3008,6 +3008,34 @@ TEST(t_dlt_free, onetime)
}
/////////////////////////////////////////
+// dlt_user_is_logLevel_enabled
+TEST(t_dlt_user_is_logLevel_enabled, normal)
+{
+ DltContext context;
+ EXPECT_LE(DLT_RETURN_OK,dlt_register_app("TUSR", "dlt_user.c tests"));
+ EXPECT_LE(DLT_RETURN_OK,dlt_register_context_ll_ts(&context, "ILLE",
+ "t_dlt_user_is_logLevel_enabled context",
+ DLT_LOG_INFO,
+ -2)); /* DLT_USER_TRACE_STATUS_NOT_SET */
+
+ EXPECT_LE(DLT_RETURN_TRUE, dlt_user_is_logLevel_enabled(&context, DLT_LOG_FATAL));
+ EXPECT_LE(DLT_RETURN_TRUE, dlt_user_is_logLevel_enabled(&context, DLT_LOG_ERROR));
+ EXPECT_LE(DLT_RETURN_TRUE, dlt_user_is_logLevel_enabled(&context, DLT_LOG_WARN));
+ EXPECT_LE(DLT_RETURN_TRUE, dlt_user_is_logLevel_enabled(&context, DLT_LOG_INFO));
+ EXPECT_LE(DLT_RETURN_LOGGING_DISABLED, dlt_user_is_logLevel_enabled(&context, DLT_LOG_DEBUG));
+ EXPECT_LE(DLT_RETURN_LOGGING_DISABLED, dlt_user_is_logLevel_enabled(&context, DLT_LOG_VERBOSE));
+ EXPECT_LE(DLT_RETURN_LOGGING_DISABLED, dlt_user_is_logLevel_enabled(&context, DLT_LOG_OFF));
+
+ EXPECT_LE(DLT_RETURN_OK,dlt_unregister_context(&context));
+ EXPECT_LE(DLT_RETURN_OK,dlt_unregister_app());
+}
+
+TEST(t_dlt_user_is_logLevel_enabled, nullpointer)
+{
+ EXPECT_LE(DLT_RETURN_WRONG_PARAMETER, dlt_user_is_logLevel_enabled(NULL, DLT_LOG_FATAL));
+}
+
+/////////////////////////////////////////
// main
int main(int argc, char **argv)
{