diff options
author | mnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-12-11 22:52:18 +0000 |
---|---|---|
committer | mnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-12-11 22:52:18 +0000 |
commit | 2f4ed44961ffb21673cc0b732ce353bb2384241d (patch) | |
tree | 1c03d6da779ba64dcd33cdbb097cb696b1a3e535 /pbx | |
parent | 300c8dcaf7ae080cb5f8e0c98cead2329a639e8f (diff) |
Merged revisions 163317 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r163317 | mnicholson | 2008-12-11 16:49:59 -0600 (Thu, 11 Dec 2008) | 16 lines
Merged revisions 163316 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r163316 | mnicholson | 2008-12-11 16:44:31 -0600 (Thu, 11 Dec 2008) | 9 lines
Clean up the dundi cache every 5 minutes.
(closes issue #13819)
Reported by: adomjan
Patches:
pbx_dundi.c-clearcache.patch uploaded by adomjan (license 487)
dundi_clearecache3.diff uploaded by mnicholson (license 96)
Tested by: adomjan
........
................
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@163318 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'pbx')
-rw-r--r-- | pbx/pbx_dundi.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/pbx/pbx_dundi.c b/pbx/pbx_dundi.c index cf214dc31..159f084fa 100644 --- a/pbx/pbx_dundi.c +++ b/pbx/pbx_dundi.c @@ -101,6 +101,7 @@ static struct sched_context *sched; static int netsocket = -1; static pthread_t netthreadid = AST_PTHREADT_NULL; static pthread_t precachethreadid = AST_PTHREADT_NULL; +static pthread_t clearcachethreadid = AST_PTHREADT_NULL; static unsigned int tos = 0; static int dundidebug = 0; static int authdebug = 0; @@ -2156,6 +2157,40 @@ static void *network_thread(void *ignore) return NULL; } +static void *process_clearcache(void *ignore) +{ + struct ast_db_entry *db_entry, *db_tree; + int striplen = sizeof("/dundi/cache"); + time_t now; + + while (!dundi_shutdown) { + pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); + + time(&now); + + db_entry = db_tree = ast_db_gettree("dundi/cache", NULL); + for (; db_entry; db_entry = db_entry->next) { + time_t expiry; + + if (!ast_get_time_t(db_entry->data, &expiry, 0, NULL)) { + if (expiry < now) { + ast_debug(1, "clearing expired DUNDI cache entry: %s\n", db_entry->key); + ast_db_del("dundi/cache", db_entry->key + striplen); + } + } + } + ast_db_freetree(db_tree); + + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + pthread_testcancel(); + sleep(60); + pthread_testcancel(); + } + + clearcachethreadid = AST_PTHREADT_NULL; + return NULL; +} + static void *process_precache(void *ign) { struct dundi_precache_queue *qe; @@ -2197,6 +2232,7 @@ static int start_network_thread(void) { ast_pthread_create_background(&netthreadid, NULL, network_thread, NULL); ast_pthread_create_background(&precachethreadid, NULL, process_precache, NULL); + ast_pthread_create_background(&clearcachethreadid, NULL, process_clearcache, NULL); return 0; } @@ -4781,7 +4817,7 @@ static int set_config(char *config_file, struct sockaddr_in* sin, int reload) static int unload_module(void) { - pthread_t previous_netthreadid = netthreadid, previous_precachethreadid = precachethreadid; + pthread_t previous_netthreadid = netthreadid, previous_precachethreadid = precachethreadid, previous_clearcachethreadid = clearcachethreadid; ast_module_user_hangup_all(); /* Stop all currently running threads */ @@ -4794,6 +4830,10 @@ static int unload_module(void) pthread_kill(previous_precachethreadid, SIGURG); pthread_join(previous_precachethreadid, NULL); } + if (previous_clearcachethreadid != AST_PTHREADT_NULL) { + pthread_cancel(previous_clearcachethreadid); + pthread_join(previous_clearcachethreadid, NULL); + } ast_cli_unregister_multiple(cli_dundi, sizeof(cli_dundi) / sizeof(struct ast_cli_entry)); ast_unregister_switch(&dundi_switch); |