# Event Notifier **Repository Path**: schips/event_notifier ## Basic Information - **Project Name**: Event Notifier - **Description**: 类似Linux内核的notifier,但以事件作为接口,作为一种观察者模式的跨平台实现。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-06-09 - **Last Updated**: 2023-11-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Event Notifier 事件通知器。类似Linux内核中的 通知链(notifier chains),但稍微有点不一样。 只需事先注册对应的事件以及对应的处理函数(函数参数可选),便可在简单地调用。 ## 如何使用 ### API 介绍 ```c int event_notifier_init(struct notifier_node *header, int size); ``` **描述:** 初始化事件通知器 **参数解析:** - header : 定义好的一组 事件通知节点,用于储存 注册的事件 - size : 事件的最大个数。 **返回值:** 成功返回0,失败返回对应的值。 > 你也使用这个函数来清除所有的注册事件。 ```c // 获取当前注册的事件数量 int event_notifier_get_cur_event_cnt(void); // 获取当前事件通知器的最大容量 int event_notifier_get_size(void); ``` **描述:** 分别用于 "获取当前事件通知器的最大容量" 与 "当前获取当前注册的事件数量" ```c // 注册一个事件(默认优先级) API int event_notifier_register_event(int event_type, void* (*event_callback)(void *event_callback_arg), void *event_callback_arg); // 注册一个事件,并指定注册事件的优先级(如果事件存在,则设置为新的优先级) API int event_notifier_register_event_with_priority(int event_type, int priority, void* (*event_callback)(void *event_callback_arg), void *event_callback_arg); ``` **描述:** 注册一个事件 **参数解析:** - `event_type` : 事件类型(不允许为-1) - `priority` : 优先级(0为默认优先级) - `event_callback` : 事件处理函数 - `event_callback_arg` : 事件处理函数的参数,可空 **返回值:** 成功返回0,失败返回对应的值。 下列情况会导致失败: 1、注册队列已满。 2、参数非法值:`event_type`(-1)或 `event_callback`(NULL) 3、对应的事件已经注册(只要是上述参数不同,便可以注册进通知中) ```c int event_notifier_unregister_event(int event_type, void* (*event_callback)(void *event_callback_arg), void *event_callback_arg); ``` **描述:** 反注册一个事件 > 参考`event_notifier_register_event`。 ```c int event_notify(int event_type); ``` **描述:** 通知事件发生,这会导致注册到事件通知上的处理函数依次执行。 **参数解析:** - `event_type` : 事件类型 ### 完整demo ```c #include // 1、引入头文件 #include "event_notifier.h" #define MAX_NOTIFIER_CNT 20 #define EVENT_DEMO 0 // 2、定义处理函数 void* demo_event_callback(void* arg) { printf(" [%s]%x\n", __func__, *((int*)arg)); return NULL; } int main(int argc, char *argv[]) { int ret; int a = 0xa; int b = 0xb; // 3、声明事件通知器实例 struct notifier_node notifier_head[MAX_NOTIFIER_CNT] = {0}; ret = event_notifier_init(notifier_head, MAX_NOTIFIER_CNT); ret = event_notifier_get_size(); printf("register_event max size is %d\n", ret); // 4、注册 ret = event_notifier_register_event(EVENT_DEMO, demo_event_callback, &a); printf("register_event ret is %d\n", ret); // (重设优先级) ret = event_notifier_register_event_with_priority(EVENT_DEMO, 1, demo_event_callback, &a); printf("register_event ret is %d\n", ret); // 注册事件,并指定优先级 ret = event_notifier_register_event_with_priority(EVENT_DEMO, 2, demo_event_callback, &a); // 获取当前注册的事件数量 ret = event_notifier_get_cur_event_cnt(); printf("register_event cnt is %d\n", ret); // 5、通知 ret = event_notify(0); printf("event_notify called %d event_fun\n", ret); // 6、反注册 ret = event_notifier_unregister_event(EVENT_DEMO, demo_event_callback, &a); printf("unregister_event ret is %d\n", ret); ret = event_notifier_get_cur_event_cnt(); printf("register_event cnt is %d\n", ret); ret = event_notify(0); printf("event_notify called %d event_fun\n", ret); ret = event_notifier_init(notifier_head, MAX_NOTIFIER_CNT); ret = event_notify(0); printf("event_notify called %d event_fun\n", ret); ret = event_notifier_unregister_event(EVENT_DEMO, demo_event_callback, &b); printf("unregister_event ret is %d\n", ret); return 0; } ```