aboutsummaryrefslogtreecommitdiffstats
path: root/pbx/pbx_dundi.c
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2006-05-01 00:33:24 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2006-05-01 00:33:24 +0000
commit6e0ff9169daf566a70c0f9400c90564c8cb8573a (patch)
treea94a0557802af321a72b8fc49669e1791413297b /pbx/pbx_dundi.c
parent31362c2aecf4cbb8c185f30ac9b702fc38e0e2f2 (diff)
- convert the dundi precache list to use the list macros
- change an instance of malloc+memset to ast_calloc git-svn-id: http://svn.digium.com/svn/asterisk/trunk@23808 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'pbx/pbx_dundi.c')
-rw-r--r--pbx/pbx_dundi.c83
1 files changed, 37 insertions, 46 deletions
diff --git a/pbx/pbx_dundi.c b/pbx/pbx_dundi.c
index b83550410..887aef406 100644
--- a/pbx/pbx_dundi.c
+++ b/pbx/pbx_dundi.c
@@ -154,7 +154,7 @@ struct dundi_hint_metadata {
};
struct dundi_precache_queue {
- struct dundi_precache_queue *next;
+ AST_LIST_ENTRY(dundi_precache_queue) list;
char *context;
time_t expiration;
char number[0];
@@ -259,14 +259,11 @@ struct dundi_peer {
};
AST_LIST_HEAD_STATIC(peers, dundi_peer);
+AST_LIST_HEAD_STATIC(pcq, dundi_precache_queue);
AST_LIST_HEAD_NOLOCK_STATIC(mappings, dundi_mapping);
AST_LIST_HEAD_NOLOCK_STATIC(requests, dundi_request);
AST_LIST_HEAD_NOLOCK_STATIC(alltrans, dundi_transaction);
-static struct dundi_precache_queue *pcq;
-
-AST_MUTEX_DEFINE_STATIC(pclock);
-
static int dundi_xmit(struct dundi_packet *pack);
static void dundi_debug_output(const char *data)
@@ -2099,30 +2096,31 @@ static void *process_precache(void *ign)
char context[256];
char number[256];
int run;
+
for (;;) {
time(&now);
run = 0;
- ast_mutex_lock(&pclock);
- if (pcq) {
- if (!pcq->expiration) {
+ AST_LIST_LOCK(&pcq);
+ if ((qe = AST_LIST_FIRST(&pcq))) {
+ if (!qe->expiration) {
/* Gone... Remove... */
- qe = pcq;
- pcq = pcq->next;
+ AST_LIST_REMOVE_HEAD(&pcq, list);
free(qe);
- } else if (pcq->expiration < now) {
+ } else if (qe->expiration < now) {
/* Process this entry */
- pcq->expiration = 0;
- ast_copy_string(context, pcq->context, sizeof(context));
- ast_copy_string(number, pcq->number, sizeof(number));
+ qe->expiration = 0;
+ ast_copy_string(context, qe->context, sizeof(context));
+ ast_copy_string(number, qe->number, sizeof(number));
run = 1;
}
}
- ast_mutex_unlock(&pclock);
+ AST_LIST_UNLOCK(&pcq);
if (run) {
dundi_precache(context, number);
} else
sleep(1);
}
+
return NULL;
}
@@ -2606,9 +2604,9 @@ static int dundi_show_precache(int fd, int argc, char *argv[])
if (argc != 3)
return RESULT_SHOWUSAGE;
time(&now);
- ast_mutex_lock(&pclock);
ast_cli(fd, FORMAT2, "Number", "Context", "Expiration");
- for (qe = pcq;qe;qe = qe->next) {
+ AST_LIST_LOCK(&pcq);
+ AST_LIST_TRAVERSE(&pcq, qe, list) {
s = qe->expiration - now;
h = s / 3600;
s = s % 3600;
@@ -2616,7 +2614,8 @@ static int dundi_show_precache(int fd, int argc, char *argv[])
s = s % 60;
ast_cli(fd, FORMAT, qe->number, qe->context, h,m,s);
}
- ast_mutex_unlock(&pclock);
+ AST_LIST_UNLOCK(&pcq);
+
return RESULT_SUCCESS;
#undef FORMAT
#undef FORMAT2
@@ -3553,45 +3552,37 @@ int dundi_lookup(struct dundi_result *result, int maxret, struct ast_channel *ch
static void reschedule_precache(const char *number, const char *context, int expiration)
{
int len;
- struct dundi_precache_queue *qe, *prev=NULL;
- ast_mutex_lock(&pclock);
- qe = pcq;
- while(qe) {
+ struct dundi_precache_queue *qe, *prev;
+
+ AST_LIST_LOCK(&pcq);
+ AST_LIST_TRAVERSE_SAFE_BEGIN(&pcq, qe, list) {
if (!strcmp(number, qe->number) && !strcasecmp(context, qe->context)) {
- if (prev)
- prev->next = qe->next;
- else
- pcq = qe->next;
- qe->next = NULL;
+ AST_LIST_REMOVE_CURRENT(&pcq, list);
break;
}
- prev = qe;
- qe = qe->next;
- };
+ }
+ AST_LIST_TRAVERSE_SAFE_END
if (!qe) {
- len = sizeof(struct dundi_precache_queue);
+ len = sizeof(*qe);
len += strlen(number) + 1;
len += strlen(context) + 1;
- qe = malloc(len);
- if (qe) {
- memset(qe, 0, len);
- strcpy(qe->number, number);
- qe->context = qe->number + strlen(number) + 1;
- strcpy(qe->context, context);
+ if (!(qe = ast_calloc(1, len))) {
+ AST_LIST_UNLOCK(&pcq);
+ return;
}
+ strcpy(qe->number, number);
+ qe->context = qe->number + strlen(number) + 1;
+ strcpy(qe->context, context);
}
time(&qe->expiration);
qe->expiration += expiration;
- prev = pcq;
- if (prev) {
- while(prev->next && (prev->next->expiration <= qe->expiration))
- prev = prev->next;
- qe->next = prev->next;
- prev->next = qe;
+ if ((prev = AST_LIST_FIRST(&pcq))) {
+ while (AST_LIST_NEXT(prev, list) && ((AST_LIST_NEXT(prev, list))->expiration <= qe->expiration))
+ prev = AST_LIST_NEXT(prev, list);
+ AST_LIST_INSERT_AFTER(&pcq, prev, qe, list);
} else
- pcq = qe;
- ast_mutex_unlock(&pclock);
-
+ AST_LIST_INSERT_HEAD(&pcq, qe, list);
+ AST_LIST_UNLOCK(&pcq);
}
static void dundi_precache_full(void)