From 79d79ac84081e48972d3fc43f9c6ba8ff97b3eb6 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Thu, 13 Sep 2007 18:52:35 +0000 Subject: Merged revisions 82337 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r82337 | russell | 2007-09-13 13:45:59 -0500 (Thu, 13 Sep 2007) | 4 lines Only compile in tracking astobj2 statistics if dev-mode is enabled. Also, when dev mode is enabled, register the CLI command that can be used to run the astobj2 test and print out statistics. ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@82338 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- include/asterisk.h | 1 + main/asterisk.c | 2 ++ main/astobj2.c | 38 +++++++++++++++++++++++++++++++++----- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/include/asterisk.h b/include/asterisk.h index 7dd5897d3..4468754d2 100644 --- a/include/asterisk.h +++ b/include/asterisk.h @@ -88,6 +88,7 @@ int dnsmgr_reload(void); /*!< Provided by dnsmgr.c */ void threadstorage_init(void); /*!< Provided by threadstorage.c */ void ast_event_init(void); /*!< Provided by event.c */ int ast_device_state_engine_init(void); /*!< Provided by devicestate.c */ +int astobj2_init(void); /*! Provided by astobj2.c */ /* Many headers need 'ast_channel' to be defined */ struct ast_channel; diff --git a/main/asterisk.c b/main/asterisk.c index ce6cedf66..5cc0339d9 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -2869,6 +2869,8 @@ int main(int argc, char *argv[]) threadstorage_init(); + astobj2_init(); + if (load_modules(1)) { /* Load modules, pre-load only */ printf(term_quit()); exit(1); diff --git a/main/astobj2.c b/main/astobj2.c index 5050d8c2c..8a0d2ab4e 100644 --- a/main/astobj2.c +++ b/main/astobj2.c @@ -57,6 +57,11 @@ struct astobj2 { void *user_data[0]; }; +#ifdef AST_DEVMODE +#define AO2_DEBUG 1 +#endif + +#ifdef AO2_DEBUG struct ao2_stats { volatile int total_objects; volatile int total_mem; @@ -66,6 +71,7 @@ struct ao2_stats { }; static struct ao2_stats ao2; +#endif #ifndef HAVE_BKTR /* backtrace support */ void ao2_bt(void) {} @@ -126,7 +132,9 @@ int ao2_lock(void *user_data) if (p == NULL) return -1; +#ifdef AO2_DEBUG ast_atomic_fetchadd_int(&ao2.total_locked, 1); +#endif return ast_mutex_lock(&p->priv_data.lock); } @@ -138,7 +146,9 @@ int ao2_unlock(void *user_data) if (p == NULL) return -1; +#ifdef AO2_DEBUG ast_atomic_fetchadd_int(&ao2.total_locked, -1); +#endif return ast_mutex_unlock(&p->priv_data.lock); } @@ -161,9 +171,12 @@ int ao2_ref(void *user_data, const int delta) /* we modify with an atomic operation the reference counter */ ret = ast_atomic_fetchadd_int(&obj->priv_data.ref_counter, delta); - ast_atomic_fetchadd_int(&ao2.total_refs, delta); current_value = ret + delta; - + +#ifdef AO2_DEBUG + ast_atomic_fetchadd_int(&ao2.total_refs, delta); +#endif + /* this case must never happen */ if (current_value < 0) ast_log(LOG_ERROR, "refcount %d on object %p\n", current_value, user_data); @@ -173,13 +186,15 @@ int ao2_ref(void *user_data, const int delta) obj->priv_data.destructor_fn(user_data); ast_mutex_destroy(&obj->priv_data.lock); +#ifdef AO2_DEBUG ast_atomic_fetchadd_int(&ao2.total_mem, - obj->priv_data.data_size); + ast_atomic_fetchadd_int(&ao2.total_objects, -1); +#endif /* for safety, zero-out the astobj2 header and also the * first word of the user-data, which we make sure is always * allocated. */ bzero(obj, sizeof(struct astobj2 *) + sizeof(void *) ); free(obj); - ast_atomic_fetchadd_int(&ao2.total_objects, -1); } return ret; @@ -207,9 +222,12 @@ void *ao2_alloc(size_t data_size, ao2_destructor_fn destructor_fn) obj->priv_data.data_size = data_size; obj->priv_data.ref_counter = 1; obj->priv_data.destructor_fn = destructor_fn; /* can be NULL */ + +#ifdef AO2_DEBUG ast_atomic_fetchadd_int(&ao2.total_objects, 1); ast_atomic_fetchadd_int(&ao2.total_mem, data_size); ast_atomic_fetchadd_int(&ao2.total_refs, 1); +#endif /* return a pointer to the user data */ return EXTERNAL_OBJ(obj); @@ -289,8 +307,11 @@ ao2_container_alloc(const uint n_buckets, ao2_hash_fn *hash_fn, c->n_buckets = n_buckets; c->hash_fn = hash_fn ? hash_fn : hash_zero; c->cmp_fn = cmp_fn; + +#ifdef AO2_DEBUG ast_atomic_fetchadd_int(&ao2.total_containers, 1); - +#endif + return c; } @@ -567,7 +588,10 @@ static void container_destruct(void *_c) struct ao2_container *c = _c; ao2_callback(c, OBJ_UNLINK, cd_cb, NULL); + +#ifdef AO2_DEBUG ast_atomic_fetchadd_int(&ao2.total_containers, -1); +#endif } static int print_cb(void *obj, void *arg, int flag) @@ -579,6 +603,7 @@ static int print_cb(void *obj, void *arg, int flag) return 0; } +#ifdef AO2_DEBUG /* * Print stats */ @@ -669,10 +694,13 @@ static struct ast_cli_entry cli_astobj2[] = { handle_astobj2_stats, "Print astobj2 statistics", }, { { "astobj2", "test", NULL } , handle_astobj2_test, "Test astobj2", }, }; +#endif /* AO2_DEBUG */ -int astobj2_init(void); int astobj2_init(void) { +#ifdef AO2_DEBUG ast_cli_register_multiple(cli_astobj2, ARRAY_LEN(cli_astobj2)); +#endif + return 0; } -- cgit v1.2.3