[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.
This commit is contained in:
Holger Freyther 2009-02-14 22:51:10 +00:00
parent 053e09d102
commit e4b3fa3633
4 changed files with 16 additions and 8 deletions

View File

@ -32,6 +32,7 @@
struct signal_data { struct signal_data {
int area;
}; };
@ -48,10 +49,10 @@ struct paging_signal_data {
/* Management */ /* Management */
void register_signal_handler(int areas, int (*sig)(struct signal_data *, void *data), void *data); 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 */ /* Dispatch */
void dispatch_signal(int area, struct signal_data *data); void dispatch_signal(struct signal_data *data);
#endif #endif

View File

@ -701,11 +701,14 @@ static int gsm48_rr_rx_pag_resp(struct msgb *msg)
subscr->name ? subscr->name : subscr->imsi); subscr->name ? subscr->name : subscr->imsi);
struct paging_signal_data sig_data = { struct paging_signal_data sig_data = {
.data = {
.area = S_PAGING,
},
.subscr = subscr, .subscr = subscr,
.bts = msg->lchan->ts->trx->bts, .bts = msg->lchan->ts->trx->bts,
.lchan = msg->lchan, .lchan = msg->lchan,
}; };
dispatch_signal(S_PAGING, &sig_data.data); dispatch_signal(&sig_data.data);
paging_request_stop(msg->trx->bts, subscr); paging_request_stop(msg->trx->bts, subscr);
if (!msg->lchan->subscr) if (!msg->lchan->subscr)

View File

@ -185,12 +185,15 @@ static void paging_T3113_expired(void *data)
req, req->subscr->imsi); req, req->subscr->imsi);
struct paging_signal_data sig_data = { struct paging_signal_data sig_data = {
.data = {
.area = S_PAGING,
},
.subscr = req->subscr, .subscr = req->subscr,
.bts = req->bts, .bts = req->bts,
.lchan = NULL, .lchan = NULL,
}; };
dispatch_signal(S_PAGING, &sig_data.data); dispatch_signal(&sig_data.data);
paging_remove_request(&req->bts->paging, req); paging_remove_request(&req->bts->paging, req);
} }

View File

@ -48,12 +48,13 @@ void register_signal_handler(int areas,
llist_add_tail(&signal_handler_list, &sig_data->entry); 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; struct signal_handler *handler;
llist_for_each_entry(handler, &signal_handler_list, entry) { 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); llist_del(&handler->entry);
free(handler); free(handler);
break; 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; struct signal_handler *handler;
llist_for_each_entry(handler, &signal_handler_list, entry) { llist_for_each_entry(handler, &signal_handler_list, entry) {
if (handler->areas & area) { if (handler->areas & data->area) {
(*handler->sig_handler)(data, handler->data); (*handler->sig_handler)(data, handler->data);
} }
} }