aboutsummaryrefslogtreecommitdiffstats
path: root/pbx
diff options
context:
space:
mode:
authormnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-12-11 22:44:31 +0000
committermnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-12-11 22:44:31 +0000
commit778d308c64dd7e3806d7bd40d59fda94d926d85b (patch)
tree4813d8fa35a78eb30a0cb7892b4b0f3fe8ccfba7 /pbx
parentb7321e16b1c02d823c55e257fd4c42ccc4db42ef (diff)
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.4@163316 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'pbx')
-rw-r--r--pbx/pbx_dundi.c45
1 files changed, 43 insertions, 2 deletions
diff --git a/pbx/pbx_dundi.c b/pbx/pbx_dundi.c
index 3b009e84f..00fd0de73 100644
--- a/pbx/pbx_dundi.c
+++ b/pbx/pbx_dundi.c
@@ -111,6 +111,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 int tos = 0;
static int dundidebug = 0;
static int authdebug = 0;
@@ -2171,6 +2172,41 @@ 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) {
+ if (option_debug)
+ ast_log(LOG_DEBUG, "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;
@@ -2212,6 +2248,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;
}
@@ -4538,7 +4575,7 @@ static int set_config(char *config_file, struct sockaddr_in* sin)
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 */
@@ -4551,7 +4588,11 @@ 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);
ast_custom_function_unregister(&dundi_function);