aboutsummaryrefslogtreecommitdiffstats
path: root/src/signal.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2009-02-16 22:05:44 +0000
committerHarald Welte <laforge@gnumonks.org>2009-02-16 22:05:44 +0000
commit595ad7b7625645e798b80fb9e0f5bef18b8881f7 (patch)
treea44447fd8af3e0c4a3f59ffaf771d9b72b8064b5 /src/signal.c
parent75099266149b78193854e84f73910074680191fa (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.c39
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);
}
}