diff options
author | Harald Welte <laforge@gnumonks.org> | 2009-02-16 22:05:44 +0000 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2009-02-16 22:05:44 +0000 |
commit | 595ad7b7625645e798b80fb9e0f5bef18b8881f7 (patch) | |
tree | a44447fd8af3e0c4a3f59ffaf771d9b72b8064b5 /src/signal.c | |
parent | 75099266149b78193854e84f73910074680191fa (diff) |
modify the signal handler/dispatch code (sorry zecke, no offense, I just had some different ideas)
* introduce new notion of subsystem in addition to signal number
* no need for bitmasks of 'areas' (aka subsystems)
* pass subsystem/signal_nr/... per argument rather than by data structure
Diffstat (limited to 'src/signal.c')
-rw-r--r-- | src/signal.c | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/src/signal.c b/src/signal.c index 7eae4d975..a7fc28ec1 100644 --- a/src/signal.c +++ b/src/signal.c @@ -27,34 +27,39 @@ static LLIST_HEAD(signal_handler_list); struct signal_handler { struct llist_head entry; - int areas; - - int (*sig_handler)(struct signal_data *, void*); + unsigned int subsys; + signal_cbfn *cbfn; void *data; }; -void register_signal_handler(int areas, - int (*handler)(struct signal_data *, void *), void *data) +int register_signal_handler(unsigned int subsys, signal_cbfn *cbfn, void *data) { - struct signal_handler *sig_data = - (struct signal_handler *)malloc(sizeof(*sig_data)); - memset(sig_data, 0, sizeof(*sig_data)); + struct signal_handler *sig_data = malloc(sizeof(*sig_data)); + if (!sig_data) + return -ENOMEM; + + memset(sig_data, 0, sizeof(*sig_data)); - sig_data->areas = areas; + sig_data->subsys = subsys; sig_data->data = data; - sig_data->sig_handler = handler; + sig_data->cbfn = cbfn; + + /* FIXME: check if we already have a handler for this subsys/cbfn/data */ + llist_add_tail(&sig_data->entry, &signal_handler_list); + + return 0; } -void remove_signal_handler(int areas, int (*sig_handler)(struct signal_data *, void *), void *data) +void unregister_signal_handler(unsigned int subsys, signal_cbfn *cbfn, void *data) { struct signal_handler *handler; llist_for_each_entry(handler, &signal_handler_list, entry) { - if (handler->sig_handler == sig_handler - && handler->data == data && areas == handler->areas) { + if (handler->cbfn == cbfn && handler->data == data + && subsys == handler->subsys) { llist_del(&handler->entry); free(handler); break; @@ -63,13 +68,13 @@ void remove_signal_handler(int areas, int (*sig_handler)(struct signal_data *, v } -void dispatch_signal(struct signal_data *data) +void dispatch_signal(unsigned int subsys, unsigned int signal, void *signal_data) { struct signal_handler *handler; llist_for_each_entry(handler, &signal_handler_list, entry) { - if (handler->areas & data->area) { - (*handler->sig_handler)(data, handler->data); - } + if (handler->subsys != subsys) + continue; + (*handler->cbfn)(subsys, signal, handler->data, signal_data); } } |