XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_init_registry.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_init_registry.h"
15
16#if XF_INIT_IMPL_METHOD == XF_INIT_IMPL_BY_REGISTRY || XF_INIT_IMPL_METHOD == XF_INIT_IMPL_BY_CONSTRUCTOR
17
18/* ==================== [Defines] =========================================== */
19
20#define TAG "registry"
21
22/* ==================== [Typedefs] ========================================== */
23
24/* ==================== [Static Prototypes] ================================= */
25
26#if XF_INIT_IMPL_METHOD == XF_INIT_IMPL_BY_REGISTRY
27static void xf_init_explicit_call_registry(void);
28#endif
29
30/* ==================== [Static Variables] ================================== */
31
42#define s_head(x) s_init_head[x]
43
44/* ==================== [Macros] ============================================ */
45
46/* ==================== [Global Functions] ================================== */
47
49{
50 if (unlikely((NULL == s_head(type).prev)
51 || (NULL == s_head(type).next))) {
52 xf_list_init(&s_head(type));
53 }
54 if (unlikely((NULL == p_desc_node->node.prev)
55 || (NULL == p_desc_node->node.next))) {
56 xf_list_init(&p_desc_node->node);
57 }
58 xf_list_add_tail(&p_desc_node->node, &s_head(type));
59}
60
62{
64 int result = 0;
65 UNUSED(result);
66 xf_init_registry_desc_node_t *p_desc_node = NULL;
67
68#if XF_INIT_IMPL_METHOD == XF_INIT_IMPL_BY_REGISTRY
69 xf_init_explicit_call_registry();
70#endif
71
72 for (init_type = XF_INIT_REGISTRY_TYPE_SETUP; init_type < XF_INIT_REGISTRY_TYPE_MAX; ++init_type) {
73 xf_list_for_each_entry(p_desc_node, &s_head(init_type), xf_init_registry_desc_node_t, node) {
74 if ((p_desc_node) && (p_desc_node->p_desc) && (p_desc_node->p_desc->func)) {
75 result = p_desc_node->p_desc->func();
76 XF_LOGD(TAG, "initialize [ret: %d] %s done.", result, p_desc_node->p_desc->func_name);
77 }
78 }
79 }
80}
81
82/* ==================== [Static Functions] ================================== */
83
84#if XF_INIT_IMPL_METHOD == XF_INIT_IMPL_BY_REGISTRY
85static void xf_init_explicit_call_registry(void)
86{
87#define XF_INIT_REGISTRY_ACTION_DECLARE
89#define XF_INIT_REGISTRY_ACTION_CALL
91}
92#endif
93
94#endif
#define unlikely(x)
分支预测,优化条件为 假 的可能性更大的情况。
Definition xf_attr.h:113
static void xf_list_init(xf_list_t *list)
动态初始化链表.
Definition xf_list.h:97
static void xf_list_add_tail(xf_list_t *new_node, xf_list_t *head)
xf_list_add_tail - 在指定节点之前添加一个 new_node.
Definition xf_list.h:168
#define XF_LIST_HEAD_INIT(name)
静态定义时初始化链表。
Definition xf_list.h:82
#define xf_list_for_each_entry(pos, head, type, member)
list_for_each_entry - 迭代给定类型的链表。
Definition xf_list.h:732
初始化函数链表结构体.
const xf_init_registry_desc_t *const p_desc
const xf_init_fn_t func
双向链表结构体.
Definition xf_list.h:64
struct xf_list_head * next
Definition xf_list.h:65
struct xf_list_head * prev
Definition xf_list.h:65
void xf_init_registry_register_desc_node(xf_init_registry_desc_node_t *p_desc_node, xf_init_registry_type_t type)
(内部函数)注册初始化函数,无需直接调用,使用宏调用
static xf_list_t s_init_head[XF_INIT_REGISTRY_TYPE_MAX]
#define s_head(x)
void xf_init_from_registry(void)
注册函数收集后,统一在此调用初始化函数
#define TAG
使用注册表实现初始化。
enum _xf_init_registry_type_t xf_init_registry_type_t
初始化功能类型。
@ XF_INIT_REGISTRY_TYPE_SETUP
@ XF_INIT_REGISTRY_TYPE_APP
@ XF_INIT_REGISTRY_TYPE_MAX
@ XF_INIT_REGISTRY_TYPE_DEVICE
@ XF_INIT_REGISTRY_TYPE_PREV
@ XF_INIT_REGISTRY_TYPE_BOARD
@ XF_INIT_REGISTRY_TYPE_CLEANUP
@ XF_INIT_REGISTRY_TYPE_ENV
@ XF_INIT_REGISTRY_TYPE_COMPONENT
xf_init 注册表规则。
#define XF_LOGD(tag, format,...)
#define UNUSED(_x)