Fix a variety of memory leaks

This patch addresses the following memory/ref counting leaks:

 * main/devicestate.c - unsubscribe and join our devicestate message
   subscription
 * main/cel.c - clean up the datastore and config objects on exist
 * main/parking.c - cleanup memory leak of retriever snapshot on message
   payload destruction
 * res/parking/parking_bridge.c - cleanup memory leak of retrieve snapshot
   on message payload destruction
 * main/presencestate.c - unsubscribe and join the caching topic on exit
 * manager.c - properly unregister the manager action "BlindTransfer"
 * sorcery.c - shutdown the threadpool on exit and dispose of any wizards

(issue ASTERISK-21906)
Reported by: John Hardin
patches:
  cel.patch uploaded by jhardin (license #6512)
  devicestate.patch uploaded by jhardin (license #6512)
  manager.patch uploaded by jardin (license #6512)
  presencestate.patch uploaded by jhardin (license #6512)
  retriever-channel-snapshot.patch uploaded by jhardin (license #6512)
  sorcery.patch uploaded by jhardin (license #6512)



git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@392797 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Matthew Jordan
2013-06-24 23:56:54 +00:00
parent f33d074d1a
commit 91217ac3c1
8 changed files with 35 additions and 9 deletions

View File

@@ -253,6 +253,19 @@ static int sorcery_wizard_cmp(void *obj, void *arg, int flags)
return !strcmp(wizard1->name, flags & OBJ_KEY ? name : wizard2->name) ? CMP_MATCH | CMP_STOP : 0;
}
/*! \brief Cleanup function */
static void sorcery_exit(void)
{
ast_threadpool_shutdown(threadpool);
threadpool = NULL;
}
/*! \brief Cleanup function for graceful shutdowns */
static void sorcery_cleanup(void)
{
ao2_cleanup(wizards);
}
int ast_sorcery_init(void)
{
struct ast_threadpool_options options = {
@@ -265,6 +278,7 @@ int ast_sorcery_init(void)
ast_assert(wizards == NULL);
if (!(threadpool = ast_threadpool_create("Sorcery", NULL, &options))) {
threadpool = NULL;
return -1;
}
@@ -273,6 +287,9 @@ int ast_sorcery_init(void)
return -1;
}
ast_register_cleanup(sorcery_cleanup);
ast_register_atexit(sorcery_exit);
return 0;
}