1 #include <linux/mutex.h>
2 #include <linux/list.h>
3 #include <linux/slab.h>
4 #include <linux/module.h>
7 static LIST_HEAD(cbs_list);
8 static DEFINE_MUTEX(cbs_mutex);
9 static int cur_handle = 0;
12 struct list_head list;
18 static inline void __lock_cbs_list(void)
20 mutex_lock(&cbs_mutex);
23 static inline void __unlock_cbs_list(void)
25 mutex_unlock(&cbs_mutex);
28 static inline int __get_new_handle(void)
33 static inline void __free_cb(struct cb_item *cb)
39 static struct cb_item *__get_cb_by_handle(int handle)
43 list_for_each_entry(cb, &cbs_list, list)
44 if (cb->handle == handle)
52 * @brief Executes callbacks on start/stop
54 * @param cbt Callback type
57 void exec_cbs(enum callback_t cbt)
63 list_for_each_entry(cb, &cbs_list, list)
71 * @brief Removes all callbacks from list
75 void remove_all_cbs(void)
77 struct cb_item *cb, *n;
81 list_for_each_entry_safe(cb, n, &cbs_list, list)
88 * @brief Registers callback on event
90 * @param cbt Callback type
91 * @param func Callback function
92 * @return Handle on succes, error code on error
94 int us_manager_reg_cb(enum callback_t cbt, void (*func)(void))
99 cb = kmalloc(sizeof(*cb), GFP_KERNEL);
103 handle = __get_new_handle();
105 INIT_LIST_HEAD(&cb->list);
111 list_add_tail(&cb->list, &cbs_list);
116 EXPORT_SYMBOL_GPL(us_manager_reg_cb);
119 * @brief Unegisters callback by handle
121 * @param handle Callback handle
124 void us_manager_unreg_cb(int handle)
130 cb = __get_cb_by_handle(handle);
132 goto handle_not_found;
139 EXPORT_SYMBOL_GPL(us_manager_unreg_cb);