@@ -269,39 +269,47 @@ int log_printk(const char *fmt, va_list ap);
269
269
*/
270
270
char * log_strdup (const char * str );
271
271
272
- #define __DYNAMIC_MODULE_REGISTER (_name )\
273
- struct log_source_dynamic_data LOG_ITEM_DYNAMIC_DATA(_name) \
274
- __attribute__ ((section("." STRINGIFY( \
275
- LOG_ITEM_DYNAMIC_DATA(_name)))) \
276
- ) \
277
- __attribute__((used)); \
278
- static inline const struct log_source_dynamic_data * \
279
- __log_current_dynamic_data_get(void) \
280
- { \
281
- return &LOG_ITEM_DYNAMIC_DATA(_name); \
282
- }
272
+ /* Macro expects that optionally on second argument local log level is provided.
273
+ * If provided it is returned, otherwise default log level is returned.
274
+ */
275
+ #if defined(LOG_LEVEL ) && defined(CONFIG_LOG )
276
+ #define _LOG_LEVEL_RESOLVE (...) \
277
+ __LOG_ARG_2(__VA_ARGS__, LOG_LEVEL)
278
+ #else
279
+ #define _LOG_LEVEL_RESOLVE (...) \
280
+ __LOG_ARG_2(__VA_ARGS__, CONFIG_LOG_DEFAULT_LEVEL)
281
+ #endif
283
282
284
- #define _LOG_RUNTIME_MODULE_REGISTER (_name ) \
285
- _LOG_EVAL( \
286
- CONFIG_LOG_RUNTIME_FILTERING, \
287
- (; __DYNAMIC_MODULE_REGISTER(_name)), \
288
- () \
289
- )
283
+ /* Return first argument */
284
+ #define _LOG_ARG1 (arg1 , ...) arg1
290
285
291
- #define _LOG_MODULE_REGISTER (_name , _level ) \
286
+
287
+ #define _LOG_MODULE_CONST_DATA_CREATE (_name , _level ) \
292
288
const struct log_source_const_data LOG_ITEM_CONST_DATA(_name) \
293
289
__attribute__ ((section("." STRINGIFY(LOG_ITEM_CONST_DATA(_name))))) \
294
290
__attribute__((used)) = { \
295
291
.name = STRINGIFY(_name), \
296
292
.level = _level \
297
- } \
298
- _LOG_RUNTIME_MODULE_REGISTER(_name); \
299
- static inline const struct log_source_const_data * \
300
- __log_current_const_data_get(void) \
301
- { \
302
- return &LOG_ITEM_CONST_DATA(_name); \
303
293
}
304
294
295
+ #define _LOG_MODULE_DYNAMIC_DATA_CREATE (_name ) \
296
+ struct log_source_dynamic_data LOG_ITEM_DYNAMIC_DATA(_name) \
297
+ __attribute__ ((section("." STRINGIFY( \
298
+ LOG_ITEM_DYNAMIC_DATA(_name)))) \
299
+ ) \
300
+ __attribute__((used))
301
+
302
+ #define _LOG_MODULE_DYNAMIC_DATA_COND_CREATE (_name ) \
303
+ _LOG_EVAL( \
304
+ IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING), \
305
+ (_LOG_MODULE_DYNAMIC_DATA_CREATE(_name);), \
306
+ () \
307
+ )
308
+
309
+ #define _LOG_MODULE_DATA_CREATE (_name , _level ) \
310
+ _LOG_MODULE_CONST_DATA_CREATE(_name, _level); \
311
+ _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name)
312
+
305
313
/**
306
314
* @brief Create module-specific state and register the module with Logger.
307
315
*
@@ -313,44 +321,36 @@ char *log_strdup(const char *str);
313
321
* - The module consists of more than one file, and another file
314
322
* invokes this macro. (LOG_MODULE_DECLARE() should be used instead
315
323
* in all of the module's other files.)
316
- * - Instance logging is used and there is no need to create module entry.
324
+ * - Instance logging is used and there is no need to create module entry. In
325
+ * that case LOG_LEVEL_SET() should be used to set log level used within the
326
+ * file.
327
+ *
328
+ * Macro accepts one or two parameters:
329
+ * - module name
330
+ * - optional log level. If not provided then default log level is used in
331
+ * the file.
332
+ *
333
+ * Example usage:
334
+ * - LOG_MODULE_REGISTER(foo, CONFIG_FOO_LOG_LEVEL)
335
+ * - LOG_MODULE_REGISTER(foo)
336
+ *
317
337
*
318
338
* @note The module's state is defined, and the module is registered,
319
339
* only if LOG_LEVEL for the current source file is non-zero or
320
340
* it is not defined and CONFIG_LOG_DEFAULT_LOG_LEVEL is non-zero.
321
341
* In other cases, this macro has no effect.
322
342
* @see LOG_MODULE_DECLARE
323
343
*/
324
- #define LOG_MODULE_REGISTER (log_module_name ) \
325
- _LOG_EVAL( \
326
- _LOG_LEVEL(), \
327
- (_LOG_MODULE_REGISTER(log_module_name, _LOG_LEVEL())), \
328
- ()/*Empty*/ \
329
- )
330
-
331
- #define __DYNAMIC_MODULE_DECLARE (_name ) \
332
- extern struct log_source_dynamic_data LOG_ITEM_DYNAMIC_DATA(_name);\
333
- static inline struct log_source_dynamic_data * \
334
- __log_current_dynamic_data_get(void) \
335
- { \
336
- return &LOG_ITEM_DYNAMIC_DATA(_name); \
337
- }
338
344
339
- #define _LOG_RUNTIME_MODULE_DECLARE (_name ) \
340
- _LOG_EVAL( \
341
- CONFIG_LOG_RUNTIME_FILTERING, \
342
- (; __DYNAMIC_MODULE_DECLARE(_name)), \
343
- () \
344
- )
345
345
346
- #define _LOG_MODULE_DECLARE ( _name , _level ) \
347
- extern const struct log_source_const_data LOG_ITEM_CONST_DATA(_name) \
348
- _LOG_RUNTIME_MODULE_DECLARE(_name); \
349
- static inline const struct log_source_const_data * \
350
- __log_current_const_data_get(void) \
351
- { \
352
- return &LOG_ITEM_CONST_DATA(_name); \
353
- }
346
+ #define LOG_MODULE_REGISTER (... ) \
347
+ _LOG_EVAL( \
348
+ _LOG_LEVEL_RESOLVE(__VA_ARGS__), \
349
+ (_LOG_MODULE_DATA_CREATE(_LOG_ARG1(__VA_ARGS__), \
350
+ _LOG_LEVEL_RESOLVE(__VA_ARGS__))), \
351
+ () /*Empty*/ \
352
+ ) \
353
+ LOG_MODULE_DECLARE ( __VA_ARGS__ )
354
354
355
355
/**
356
356
* @brief Macro for declaring a log module (not registering it).
@@ -363,18 +363,50 @@ char *log_strdup(const char *str);
363
363
* declare that same state. (Otherwise, LOG_INF() etc. will not be
364
364
* able to refer to module-specific state variables.)
365
365
*
366
+ * Macro accepts one or two parameters:
367
+ * - module name
368
+ * - optional log level. If not provided then default log level is used in
369
+ * the file.
370
+ *
371
+ * Example usage:
372
+ * - LOG_MODULE_DECLARE(foo, CONFIG_FOO_LOG_LEVEL)
373
+ * - LOG_MODULE_DECLARE(foo)
374
+ *
366
375
* @note The module's state is declared only if LOG_LEVEL for the
367
376
* current source file is non-zero or it is not defined and
368
377
* CONFIG_LOG_DEFAULT_LOG_LEVEL is non-zero. In other cases,
369
378
* this macro has no effect.
370
379
* @see LOG_MODULE_REGISTER
371
380
*/
372
- #define LOG_MODULE_DECLARE (log_module_name ) \
373
- _LOG_EVAL( \
374
- _LOG_LEVEL(), \
375
- (_LOG_MODULE_DECLARE(log_module_name, _LOG_LEVEL())), \
376
- () \
377
- ) \
381
+ #define LOG_MODULE_DECLARE (...) \
382
+ extern const struct log_source_const_data \
383
+ LOG_ITEM_CONST_DATA(_LOG_ARG1(__VA_ARGS__)); \
384
+ extern struct log_source_dynamic_data \
385
+ LOG_ITEM_DYNAMIC_DATA(_LOG_ARG1(__VA_ARGS__)); \
386
+ \
387
+ static const struct log_source_const_data * \
388
+ __log_current_const_data __attribute__((unused)) = \
389
+ _LOG_LEVEL_RESOLVE(__VA_ARGS__) ? \
390
+ &LOG_ITEM_CONST_DATA(_LOG_ARG1(__VA_ARGS__)) : NULL; \
391
+ \
392
+ static struct log_source_dynamic_data * \
393
+ __log_current_dynamic_data __attribute__((unused)) = \
394
+ (_LOG_LEVEL_RESOLVE(__VA_ARGS__) && \
395
+ IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING)) ? \
396
+ &LOG_ITEM_DYNAMIC_DATA(_LOG_ARG1(__VA_ARGS__)) : NULL;\
397
+ \
398
+ static const u32_t __log_level __attribute__((unused)) = \
399
+ _LOG_LEVEL_RESOLVE(__VA_ARGS__)
400
+
401
+ /**
402
+ * @brief Macro for setting log level in the file or function where instance
403
+ * logging API is used.
404
+ *
405
+ * @param level Level used in file or in function.
406
+ *
407
+ */
408
+ #define LOG_LEVEL_SET (level ) \
409
+ static const u32_t __log_level __attribute__((unused)) = level
378
410
379
411
/**
380
412
* @}
0 commit comments