this patch will give more detailed debug information about subscriber usage.
when subcriber structure is allocated, it will be shown on debug output. subscr_get() and subscr_put() debug will also show the calling function for better understanding.
diff --git a/openbsc/include/openbsc/gsm_subscriber.h b/openbsc/include/openbsc/gsm_subscriber.h index d612ed5..02e193a 100644 --- a/openbsc/include/openbsc/gsm_subscriber.h +++ b/openbsc/include/openbsc/gsm_subscriber.h @@ -71,8 +71,10 @@ enum gsm_subscriber_update_reason { GSM_SUBSCRIBER_UPDATE_EQUIPMENT, };
-struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr); -struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr); +#define subscr_get(subscr) _subscr_get(__FUNCTION__, subscr) +struct gsm_subscriber *_subscr_get(const char *func, struct gsm_subscriber *subscr); +#define subscr_put(subscr) _subscr_put(__FUNCTION__, subscr) +struct gsm_subscriber *_subscr_put(const char *func, struct gsm_subscriber *subscr); struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net, u_int32_t tmsi); struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net, @@ -87,7 +89,8 @@ void subscr_get_channel(struct gsm_subscriber *subscr, int type, gsm_cbfn *cbfn, void *param);
/* internal */ -struct gsm_subscriber *subscr_alloc(void); +#define subscr_alloc() _subscr_alloc(__FUNCTION__) +struct gsm_subscriber *_subscr_alloc(const char *func); extern struct llist_head active_subscribers;
#endif /* _GSM_SUBSCR_H */ diff --git a/openbsc/src/gsm_subscriber_base.c b/openbsc/src/gsm_subscriber_base.c index bcf55d1..7fe2f21 100644 --- a/openbsc/src/gsm_subscriber_base.c +++ b/openbsc/src/gsm_subscriber_base.c @@ -113,7 +113,7 @@ static void subscr_send_paging_request(struct gsm_subscriber *subscr) } }
-struct gsm_subscriber *subscr_alloc(void) +struct gsm_subscriber *_subscr_alloc(const char *func) { struct gsm_subscriber *s;
@@ -123,6 +123,8 @@ struct gsm_subscriber *subscr_alloc(void)
memset(s, 0, sizeof(*s)); llist_add_tail(&s->entry, &active_subscribers); + DEBUGP(DCC, "(from %s) new subscr allocated, setting usage to: 1\n", + func); s->use_count = 1; s->tmsi = GSM_RESERVED_TMSI;
@@ -137,19 +139,19 @@ static void subscr_free(struct gsm_subscriber *subscr) talloc_free(subscr); }
-struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr) +struct gsm_subscriber *_subscr_get(const char *func, struct gsm_subscriber *subscr) { subscr->use_count++; - DEBUGP(DCC, "subscr %s usage increases usage to: %d\n", - subscr->extension, subscr->use_count); + DEBUGP(DCC, "(from %s) subscr %s usage increases usage to: %d\n", + func, subscr->extension, subscr->use_count); return subscr; }
-struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr) +struct gsm_subscriber *_subscr_put(const char *func, struct gsm_subscriber *subscr) { subscr->use_count--; - DEBUGP(DCC, "subscr %s usage decreased usage to: %d\n", - subscr->extension, subscr->use_count); + DEBUGP(DCC, "(from %s) subscr %s usage decreased usage to: %d\n", + func, subscr->extension, subscr->use_count); if (subscr->use_count <= 0) subscr_free(subscr); return NULL;
On Monday 16 November 2009 18:52:31 Andreas.Eversberg wrote:
this patch will give more detailed debug information about subscriber usage.
when subcriber structure is allocated, it will be shown on debug output. subscr_get() and subscr_put() debug will also show the calling function for better understanding.
I don't like this one. It is something one can do with a gdb script (help commands), use the backtrace function and print the first stack, or in the future with things like systemtap.
regards holger