LCOV - code coverage report
Current view: top level - zephyr/logging - log_instance.h Coverage Total Hit
Test: new.info Lines: 63.6 % 11 7
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            0 : /*
       2              :  * Copyright (c) 2018 Nordic Semiconductor ASA
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : #ifndef ZEPHYR_INCLUDE_LOGGING_LOG_INSTANCE_H_
       7              : #define ZEPHYR_INCLUDE_LOGGING_LOG_INSTANCE_H_
       8              : 
       9              : #include <zephyr/types.h>
      10              : #include <zephyr/sys/iterable_sections.h>
      11              : 
      12              : #ifdef __cplusplus
      13              : extern "C" {
      14              : #endif
      15              : 
      16              : /** @brief Constant data associated with the source of log messages. */
      17            1 : struct log_source_const_data {
      18            0 :         const char *name;
      19            0 :         uint8_t level;
      20              : };
      21              : 
      22              : /** @brief Dynamic data associated with the source of log messages. */
      23            1 : struct log_source_dynamic_data {
      24            0 :         uint32_t filters;
      25              : #if defined(CONFIG_64BIT)
      26              :         /* Workaround: Ensure that structure size is a multiple of 8 bytes. */
      27              :         uint32_t dummy_64;
      28              : #endif
      29              : };
      30              : 
      31              : /** @internal
      32              :  *
      33              :  * Creates name of variable and section for constant log data.
      34              :  *
      35              :  *  @param _name Name.
      36              :  */
      37              : #define Z_LOG_ITEM_CONST_DATA(_name) UTIL_CAT(log_const_, _name)
      38              : 
      39              : /** @internal
      40              :  *
      41              :  * Create static logging instance in read only memory.
      42              :  *
      43              :  * @param _name name of the module. With added prefix forms name of variable and
      44              :  * memory section.
      45              :  *
      46              :  * @param _str_name Name of the module that will be used when message is formatted.
      47              :  *
      48              :  * @param _level Messages up to this level are compiled in.
      49              :  */
      50              : #define Z_LOG_CONST_ITEM_REGISTER(_name, _str_name, _level)                    \
      51              :         const STRUCT_SECTION_ITERABLE_ALTERNATE(log_const,                     \
      52              :                 log_source_const_data,                                         \
      53              :                 Z_LOG_ITEM_CONST_DATA(_name)) =                                \
      54              :         {                                                                      \
      55              :                 .name = _str_name,                                             \
      56              :                 .level  = (_level),                                            \
      57              :         }
      58              : 
      59              : /** @brief Initialize pointer to logger instance with explicitly provided object.
      60              :  *
      61              :  * Macro can be used to initialized a pointer with object that is not unique to
      62              :  * the given instance, thus not created with @ref LOG_INSTANCE_REGISTER.
      63              :  *
      64              :  * @param _name Name of the structure element for holding logging object.
      65              :  * @param _object Pointer to a logging instance object.
      66              :  */
      67            1 : #define LOG_OBJECT_PTR_INIT(_name, _object) \
      68              :         IF_ENABLED(CONFIG_LOG, (._name = _object,))
      69              : 
      70              : /** @internal
      71              :  *
      72              :  * Create a name for which contains module and instance names.
      73              :  */
      74              : #define Z_LOG_INSTANCE_FULL_NAME(_module_name, _inst_name) \
      75              :         UTIL_CAT(_module_name, UTIL_CAT(_, _inst_name))
      76              : 
      77              : /** @internal
      78              :  *
      79              :  * Returns a pointer associated with given logging instance. When runtime filtering
      80              :  * is enabled then dynamic instance is returned.
      81              :  *
      82              :  * @param _name Name of the instance.
      83              :  *
      84              :  * @return Pointer to the instance object (static or dynamic).
      85              :  */
      86              : #define Z_LOG_OBJECT_PTR(_name) \
      87              :                 COND_CODE_1(CONFIG_LOG_RUNTIME_FILTERING, \
      88              :                         (&LOG_ITEM_DYNAMIC_DATA(_name)), \
      89              :                         (&Z_LOG_ITEM_CONST_DATA(_name))) \
      90              : 
      91              : /** @brief Get pointer to a logging instance.
      92              :  *
      93              :  * Instance is identified by @p _module_name and @p _inst_name.
      94              :  *
      95              :  * @param _module_name Module name.
      96              :  * @param _inst_name Instance name.
      97              :  *
      98              :  * @return Pointer to a logging instance.
      99              :  */
     100            1 : #define LOG_INSTANCE_PTR(_module_name, _inst_name) \
     101              :         Z_LOG_OBJECT_PTR(Z_LOG_INSTANCE_FULL_NAME(_module_name, _inst_name))
     102              : 
     103              : /** @brief Macro for initializing a pointer to the logger instance.
     104              :  *
     105              :  * @p _module_name and @p _inst_name are concatenated to form a name of the object.
     106              :  *
     107              :  * Macro is intended to be used in user structure initializer to initialize a field
     108              :  * in the structure that holds pointer to the logging instance. Structure field
     109              :  * should be declared using @p LOG_INSTANCE_PTR_DECLARE.
     110              :  *
     111              :  * @param _name Name of a structure element that have a pointer to logging instance object.
     112              :  * @param _module_name Module name.
     113              :  * @param _inst_name Instance name.
     114              :  */
     115            1 : #define LOG_INSTANCE_PTR_INIT(_name, _module_name, _inst_name)     \
     116              :         LOG_OBJECT_PTR_INIT(_name, LOG_INSTANCE_PTR(_module_name, _inst_name))
     117              : 
     118              : #define Z_LOG_INSTANCE_STRUCT \
     119              :         COND_CODE_1(CONFIG_LOG_RUNTIME_FILTERING, \
     120              :                     (struct log_source_dynamic_data), \
     121              :                     (const struct log_source_const_data))
     122              : 
     123              : /**
     124              :  * @brief Declare a logger instance pointer in the module structure.
     125              :  *
     126              :  * If logging is disabled then element in the structure is still declared to avoid
     127              :  * compilation issues. If compiler supports zero length arrays then it is utilized
     128              :  * to not use any space, else a byte array is created.
     129              :  *
     130              :  * @param _name Name of a structure element that will have a pointer to logging
     131              :  * instance object.
     132              :  */
     133            1 : #define LOG_INSTANCE_PTR_DECLARE(_name) \
     134              :         COND_CODE_1(CONFIG_LOG, (Z_LOG_INSTANCE_STRUCT * _name), \
     135              :                                 (int _name[TOOLCHAIN_HAS_ZLA ? 0 : 1]))
     136              : 
     137              : #define Z_LOG_RUNTIME_INSTANCE_REGISTER(_module_name, _inst_name) \
     138              :         STRUCT_SECTION_ITERABLE_ALTERNATE(log_dynamic, log_source_dynamic_data, \
     139              :                         LOG_INSTANCE_DYNAMIC_DATA(_module_name, _inst_name))
     140              : 
     141              : #define Z_LOG_INSTANCE_REGISTER(_module_name, _inst_name, _level) \
     142              :         Z_LOG_CONST_ITEM_REGISTER( \
     143              :                 Z_LOG_INSTANCE_FULL_NAME(_module_name, _inst_name), \
     144              :                 STRINGIFY(_module_name._inst_name), \
     145              :                 _level); \
     146              :         IF_ENABLED(CONFIG_LOG_RUNTIME_FILTERING, \
     147              :                    (Z_LOG_RUNTIME_INSTANCE_REGISTER(_module_name, _inst_name)))
     148              : 
     149              : /**
     150              :  * @brief Macro for registering instance for logging with independent filtering.
     151              :  *
     152              :  * Module instance provides filtering of logs on instance level instead of
     153              :  * module level. Instance create using this macro can later on be used with
     154              :  * @ref LOG_INSTANCE_PTR_INIT or referenced by @ref LOG_INSTANCE_PTR.
     155              :  *
     156              :  * @param _module_name Module name.
     157              :  * @param _inst_name Instance name.
     158              :  * @param _level Initial static filtering.
     159              :  */
     160            1 : #define LOG_INSTANCE_REGISTER(_module_name, _inst_name, _level) \
     161              :         IF_ENABLED(CONFIG_LOG, (Z_LOG_INSTANCE_REGISTER(_module_name, _inst_name, _level)))
     162              : 
     163              : #ifdef __cplusplus
     164              : }
     165              : #endif
     166              : 
     167              : #endif /* ZEPHYR_INCLUDE_LOGGING_LOG_INSTANCE_H_ */
        

Generated by: LCOV version 2.0-1