aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Freyther <zecke@selfish.org>2009-02-14 22:51:10 +0000
committerHolger Freyther <zecke@selfish.org>2009-02-14 22:51:10 +0000
commite4b3fa3633d0d68c17d77f7d2669f8671332ff1f (patch)
treebf557b81da986b035e2d6c3e5bc261bf2e7b818c
parent053e09d102e07441974dd65b1a55e08991bf0857 (diff)
[signal] Move the area into the struct signal_data...
Remove the parameter and move the signal kind into the signal struct. Make register/deregister fully symmetric.
-rw-r--r--include/openbsc/signal.h5
-rw-r--r--src/gsm_04_08.c5
-rw-r--r--src/paging.c5
-rw-r--r--src/signal.c9
4 files changed, 16 insertions, 8 deletions
diff --git a/include/openbsc/signal.h b/include/openbsc/signal.h
index 6a0d6fb90..eb4fc8d8f 100644
--- a/include/openbsc/signal.h
+++ b/include/openbsc/signal.h
@@ -32,6 +32,7 @@
struct signal_data {
+ int area;
};
@@ -48,10 +49,10 @@ struct paging_signal_data {
/* Management */
void register_signal_handler(int areas, int (*sig)(struct signal_data *, void *data), void *data);
-void remove_signal_handler(int (*sig)(struct signal_data *, void *data), void *data);
+void remove_signal_handler(int areas, int (*sig)(struct signal_data *, void *data), void *data);
/* Dispatch */
-void dispatch_signal(int area, struct signal_data *data);
+void dispatch_signal(struct signal_data *data);
#endif
diff --git a/src/gsm_04_08.c b/src/gsm_04_08.c
index 67766321e..4d77d5dd8 100644
--- a/src/gsm_04_08.c
+++ b/src/gsm_04_08.c
@@ -701,11 +701,14 @@ static int gsm48_rr_rx_pag_resp(struct msgb *msg)
subscr->name ? subscr->name : subscr->imsi);
struct paging_signal_data sig_data = {
+ .data = {
+ .area = S_PAGING,
+ },
.subscr = subscr,
.bts = msg->lchan->ts->trx->bts,
.lchan = msg->lchan,
};
- dispatch_signal(S_PAGING, &sig_data.data);
+ dispatch_signal(&sig_data.data);
paging_request_stop(msg->trx->bts, subscr);
if (!msg->lchan->subscr)
diff --git a/src/paging.c b/src/paging.c
index 761facde8..c7fccad1e 100644
--- a/src/paging.c
+++ b/src/paging.c
@@ -185,12 +185,15 @@ static void paging_T3113_expired(void *data)
req, req->subscr->imsi);
struct paging_signal_data sig_data = {
+ .data = {
+ .area = S_PAGING,
+ },
.subscr = req->subscr,
.bts = req->bts,
.lchan = NULL,
};
- dispatch_signal(S_PAGING, &sig_data.data);
+ dispatch_signal(&sig_data.data);
paging_remove_request(&req->bts->paging, req);
}
diff --git a/src/signal.c b/src/signal.c
index d4a4a7ce2..ea0067256 100644
--- a/src/signal.c
+++ b/src/signal.c
@@ -48,12 +48,13 @@ void register_signal_handler(int areas,
llist_add_tail(&signal_handler_list, &sig_data->entry);
}
-void remove_signal_handler(int (*sig_handler)(struct signal_data *, void *), void *data)
+void remove_signal_handler(int areas, int (*sig_handler)(struct signal_data *, void *), void *data)
{
struct signal_handler *handler;
llist_for_each_entry(handler, &signal_handler_list, entry) {
- if (handler->sig_handler == sig_handler && handler->data == data) {
+ if (handler->sig_handler == sig_handler
+ && handler->data == data && areas == handler->areas) {
llist_del(&handler->entry);
free(handler);
break;
@@ -62,12 +63,12 @@ void remove_signal_handler(int (*sig_handler)(struct signal_data *, void *), voi
}
-void dispatch_signal(int area, struct signal_data *data)
+void dispatch_signal(struct signal_data *data)
{
struct signal_handler *handler;
llist_for_each_entry(handler, &signal_handler_list, entry) {
- if (handler->areas & area) {
+ if (handler->areas & data->area) {
(*handler->sig_handler)(data, handler->data);
}
}