LCOV - code coverage report
Current view: top level - zephyr/logging - log_instance.h Hit Total Coverage
Test: new.info Lines: 7 11 63.6 %
Date: 2024-12-22 00:14:23

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

Generated by: LCOV version 1.14