[asterisk-commits] murf: branch group/newcdr r163487 - in /team/group/newcdr: ./ apps/ configs/ ...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Dec 12 08:25:37 CST 2008
Author: murf
Date: Fri Dec 12 08:25:36 2008
New Revision: 163487
URL: http://svn.digium.com/view/asterisk?view=rev&rev=163487
Log:
Merged revisions 163166,163168,163171,163198,163213,163241,163254,163317,163384 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r163166 | mmichelson | 2008-12-11 12:40:18 -0700 (Thu, 11 Dec 2008) | 3 lines
Reduce indentation level of ast_feature_request_and_dial
................
r163168 | tilghman | 2008-12-11 13:02:35 -0700 (Thu, 11 Dec 2008) | 5 lines
Sometimes even Linux needs -lm to link libtonezone, such as when libtonezone
is compiled statically.
(closes issue #13887)
Reported by: tzafrir
................
r163171 | russell | 2008-12-11 13:07:47 -0700 (Thu, 11 Dec 2008) | 16 lines
Fix the "failed" extension for outgoing calls.
The conversion to use ast_check_hangup() everywhere instead of checking the softhangup
flag directly introduced this problem. The issue is that ast_check_hangup() checked
for tech_pvt to be NULL. Unfortunately, this will be NULL is some valid circumstances,
such as with a dummy channel.
The fix is simple. Don't check tech_pvt. It's pointless, because the code path that
sets this to NULL is when the channel hangup callback gets called. This happens inside
of ast_hangup(), which is the same function responsible for freeing the channel. Any
code calling ast_check_hangup() better not be calling it after that point, and if so,
we have a bigger problem at hand.
(closes issue #14035)
Reported by: erogoza
................
r163198 | mmichelson | 2008-12-11 13:21:44 -0700 (Thu, 11 Dec 2008) | 3 lines
Add an appropriate goto if ast_call fails
................
r163213 | mmichelson | 2008-12-11 13:57:44 -0700 (Thu, 11 Dec 2008) | 9 lines
Add an option to voicemail.conf to allow urgent messages to be
forwarded as not urgent.
(closes issue #14063)
Reported by: jaroth
Patches:
urgfwd_v2.patch uploaded by jaroth (license 50)
................
r163241 | russell | 2008-12-11 14:21:31 -0700 (Thu, 11 Dec 2008) | 8 lines
Fix a problem where continuous mode will get inadvertently get turned off if set_rate()
is used while continuous mode was already turned on.
(closes issue #13738)
Reported by: smurfix
Patches:
res.patch.fixed uploaded by smurfix (license 547)
................
r163254 | russell | 2008-12-11 14:48:08 -0700 (Thu, 11 Dec 2008) | 16 lines
Merged revisions 163253 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r163253 | russell | 2008-12-11 15:46:29 -0600 (Thu, 11 Dec 2008) | 8 lines
Fix some observed slowdowns in dialplan processing.
The change is to remove autoservice usage from dialplan functions that do not
need it because they do not perform operations that potentially block.
(closes issue #13940)
Reported by: tbelder
........
................
r163317 | mnicholson | 2008-12-11 15:49:59 -0700 (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
........
................
r163384 | tilghman | 2008-12-11 16:38:56 -0700 (Thu, 11 Dec 2008) | 16 lines
Merged revisions 163383 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r163383 | tilghman | 2008-12-11 17:35:55 -0600 (Thu, 11 Dec 2008) | 9 lines
When a Ctrl-C or Ctrl-D ends a remote console, on certain shells, the terminal
is messed up. By intercepting those events with a signal handler in the remote
console, we can avoid those issues.
(closes issue #13464)
Reported by: tzafrir
Patches:
20081110__bug13464.diff.txt uploaded by Corydon76 (license 14)
Tested by: blitzrage
........
................
Modified:
team/group/newcdr/ (props changed)
team/group/newcdr/apps/app_voicemail.c
team/group/newcdr/configs/voicemail.conf.sample
team/group/newcdr/configure
team/group/newcdr/configure.ac
team/group/newcdr/funcs/func_cut.c
team/group/newcdr/funcs/func_strings.c
team/group/newcdr/main/asterisk.c
team/group/newcdr/main/channel.c
team/group/newcdr/main/features.c
team/group/newcdr/pbx/pbx_dundi.c
team/group/newcdr/res/res_timing_pthread.c
Propchange: team/group/newcdr/
------------------------------------------------------------------------------
automerge = si
Propchange: team/group/newcdr/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.
Propchange: team/group/newcdr/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Fri Dec 12 08:25:36 2008
@@ -1,1 +1,1 @@
-/trunk:1-163108
+/trunk:1-163447
Modified: team/group/newcdr/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/apps/app_voicemail.c?view=diff&rev=163487&r1=163486&r2=163487
==============================================================================
--- team/group/newcdr/apps/app_voicemail.c (original)
+++ team/group/newcdr/apps/app_voicemail.c Fri Dec 12 08:25:36 2008
@@ -407,6 +407,7 @@
#define VM_TEMPGREETWARN (1 << 15) /*!< Remind user tempgreeting is set */
#define VM_MOVEHEARD (1 << 16) /*!< Move a "heard" message to Old after listening to it */
#define VM_MESSAGEWRAP (1 << 17) /*!< Wrap around from the last message to the first, and vice-versa */
+#define VM_FWDURGAUTO (1 << 18) /*!< Autoset of Urgent flag on forwarded Urgent messages set globally */
#define ERROR_LOCK_PATH -100
@@ -6267,7 +6268,9 @@
char urgent_str[7] = "";
char tmptxtfile[PATH_MAX];
- ast_copy_string(urgent_str, urgent ? "Urgent" : "", sizeof(urgent_str));
+ if (ast_test_flag((&globalflags), VM_FWDURGAUTO)) {
+ ast_copy_string(urgent_str, urgent ? "Urgent" : "", sizeof(urgent_str));
+ }
if (vms == NULL) return -1;
dir = vms->curdir;
@@ -10663,6 +10666,12 @@
}
ast_set2_flag((&globalflags), ast_true(val), VM_MOVEHEARD);
+ if (!(val = ast_variable_retrieve(cfg, "general", "forward_urgent_auto"))) {
+ ast_debug(1,"Autoset of Urgent flag on forwarded Urgent messages disabled globally\n");
+ val = "no";
+ }
+ ast_set2_flag((&globalflags), ast_true(val), VM_FWDURGAUTO);
+
if (!(val = ast_variable_retrieve(cfg, "general", "sayduration"))) {
ast_debug(1,"Duration info before msg enabled globally\n");
val = "yes";
Modified: team/group/newcdr/configs/voicemail.conf.sample
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/configs/voicemail.conf.sample?view=diff&rev=163487&r1=163486&r2=163487
==============================================================================
--- team/group/newcdr/configs/voicemail.conf.sample (original)
+++ team/group/newcdr/configs/voicemail.conf.sample Fri Dec 12 08:25:36 2008
@@ -54,6 +54,10 @@
;
; Move heard messages to the 'Old' folder automagically. Defaults to on.
;moveheard=yes
+;
+; Forward an urgent message as an urgent message. Defaults to no so
+; sender can set the urgency on the envelope of the forwarded message.
+;forward_urgent_auto=no
;
; User context is where entries from users.conf are registered. The
; default value is 'default'
Modified: team/group/newcdr/configure.ac
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/configure.ac?view=diff&rev=163487&r1=163486&r2=163487
==============================================================================
--- team/group/newcdr/configure.ac (original)
+++ team/group/newcdr/configure.ac Fri Dec 12 08:25:36 2008
@@ -1521,7 +1521,9 @@
AST_EXT_LIB_CHECK([TINFO], [tinfo], [tgetent], [])
-if test "${host_os}" != "linux-gnu" ; then
+AC_CHECK_LIB([tonezone], [tone_zone_find_by_num], tonezone_does_not_need_lm=yes, tonezone_does_not_need_lm=no)
+
+if test "${tonezone_does_not_need_lm}" = "no" ; then
tonezone_extra="-lm"
fi
Modified: team/group/newcdr/funcs/func_cut.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/funcs/func_cut.c?view=diff&rev=163487&r1=163486&r2=163487
==============================================================================
--- team/group/newcdr/funcs/func_cut.c (original)
+++ team/group/newcdr/funcs/func_cut.c Fri Dec 12 08:25:36 2008
@@ -270,9 +270,6 @@
{
int ret = -1;
- if (chan)
- ast_autoservice_start(chan);
-
switch (cut_internal(chan, data, buf, len)) {
case ERROR_NOARG:
ast_log(LOG_ERROR, "Syntax: CUT(<varname>,<char-delim>,<range-spec>) - missing argument!\n");
@@ -289,9 +286,6 @@
default:
ast_log(LOG_ERROR, "Unknown internal error\n");
}
-
- if (chan)
- ast_autoservice_stop(chan);
return ret;
}
Modified: team/group/newcdr/funcs/func_strings.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/funcs/func_strings.c?view=diff&rev=163487&r1=163486&r2=163487
==============================================================================
--- team/group/newcdr/funcs/func_strings.c (original)
+++ team/group/newcdr/funcs/func_strings.c Fri Dec 12 08:25:36 2008
@@ -285,9 +285,6 @@
char delim[2] = "";
size_t delim_used;
- if (chan)
- ast_autoservice_start(chan);
-
AST_STANDARD_APP_ARGS(args, parse);
if (args.delim) {
ast_get_encoded_char(args.delim, delim, &delim_used);
@@ -306,9 +303,6 @@
fieldcount = 1;
}
snprintf(buf, len, "%d", fieldcount);
-
- if (chan)
- ast_autoservice_stop(chan);
return 0;
}
@@ -565,9 +559,6 @@
value2 = ast_strdupa(value);
if (!var || !value2)
return -1;
-
- if (chan)
- ast_autoservice_start(chan);
if (!strcmp(cmd, "HASH")) {
const char *var2 = pbx_builtin_getvar_helper(chan, "~ODBCFIELDS~");
@@ -615,9 +606,6 @@
}
}
- if (chan)
- ast_autoservice_stop(chan);
-
return 0;
}
@@ -855,11 +843,7 @@
return -1;
}
- if (chan)
- ast_autoservice_start(chan);
pbx_substitute_variables_helper(chan, data, buf, buflen - 1);
- if (chan)
- ast_autoservice_stop(chan);
return 0;
}
Modified: team/group/newcdr/main/asterisk.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/main/asterisk.c?view=diff&rev=163487&r1=163486&r2=163487
==============================================================================
--- team/group/newcdr/main/asterisk.c (original)
+++ team/group/newcdr/main/asterisk.c Fri Dec 12 08:25:36 2008
@@ -1529,6 +1529,11 @@
}
/* There is no need to restore the signal handler here, since the app
* is going to exit */
+}
+
+static void __remote_quit_handler(int num)
+{
+ sig_flags.need_quit = 1;
}
static const char *fix_header(char *outbuf, int maxout, const char *s, char *cmp)
@@ -2458,6 +2463,11 @@
char *ebuf;
int num = 0;
+ memset(&sig_flags, 0, sizeof(sig_flags));
+ signal(SIGINT, __remote_quit_handler);
+ signal(SIGTERM, __remote_quit_handler);
+ signal(SIGHUP, __remote_quit_handler);
+
if (read(ast_consock, buf, sizeof(buf)) < 0) {
ast_log(LOG_ERROR, "read() failed: %s\n", strerror(errno));
return;
@@ -2468,6 +2478,9 @@
sprintf(tmp, "%s%s", prefix, data);
if (write(ast_consock, tmp, strlen(tmp) + 1) < 0) {
ast_log(LOG_ERROR, "write() failed: %s\n", strerror(errno));
+ if (sig_flags.need_quit == 1) {
+ return;
+ }
}
}
stringp = buf;
@@ -2503,6 +2516,10 @@
char buffer[512] = "", *curline = buffer, *nextline;
int not_written = 1;
+ if (sig_flags.need_quit == 1) {
+ break;
+ }
+
if (read(ast_consock, buffer, sizeof(buffer) - 1) <= 0) {
break;
}
@@ -2546,6 +2563,10 @@
for (;;) {
ebuf = (char *)el_gets(el, &num);
+
+ if (sig_flags.need_quit == 1) {
+ break;
+ }
if (!ebuf && write(1, "", 1) < 0)
break;
Modified: team/group/newcdr/main/channel.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/main/channel.c?view=diff&rev=163487&r1=163486&r2=163487
==============================================================================
--- team/group/newcdr/main/channel.c (original)
+++ team/group/newcdr/main/channel.c Fri Dec 12 08:25:36 2008
@@ -462,8 +462,6 @@
int ast_check_hangup(struct ast_channel *chan)
{
if (chan->_softhangup) /* yes if soft hangup flag set */
- return 1;
- if (!chan->tech_pvt) /* yes if no technology private data */
return 1;
if (ast_tvzero(chan->whentohangup)) /* no if no hangup scheduled */
return 0;
Modified: team/group/newcdr/main/features.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/main/features.c?view=diff&rev=163487&r1=163486&r2=163487
==============================================================================
--- team/group/newcdr/main/features.c (original)
+++ team/group/newcdr/main/features.c Fri Dec 12 08:25:36 2008
@@ -2012,131 +2012,11 @@
struct ast_channel *monitor_chans[2];
struct ast_channel *active_channel;
int res = 0, ready = 0;
-
- if ((chan = ast_request(type, format, caller, data, &cause))) {
- ast_set_callerid(chan, cid_num, cid_name, cid_num);
- ast_string_field_set(chan, language, language);
- ast_channel_inherit_variables(caller, chan);
- pbx_builtin_setvar_helper(chan, "TRANSFERERNAME", caller->name);
-
- if (!ast_call(chan, data, timeout)) {
- struct timeval started;
- int x, len = 0;
- char *disconnect_code = NULL, *dialed_code = NULL;
-
- ast_indicate(caller, AST_CONTROL_RINGING);
- /* support dialing of the featuremap disconnect code while performing an attended tranfer */
- ast_rwlock_rdlock(&features_lock);
- for (x = 0; x < FEATURES_COUNT; x++) {
- if (strcasecmp(builtin_features[x].sname, "disconnect"))
- continue;
-
- disconnect_code = builtin_features[x].exten;
- len = strlen(disconnect_code) + 1;
- dialed_code = alloca(len);
- memset(dialed_code, 0, len);
- break;
- }
- ast_rwlock_unlock(&features_lock);
- x = 0;
- started = ast_tvnow();
- to = timeout;
-
- ast_poll_channel_add(caller, chan);
-
- while (!((transferee && ast_check_hangup(transferee)) && (!igncallerstate && ast_check_hangup(caller))) && timeout && (chan->_state != AST_STATE_UP)) {
- struct ast_frame *f = NULL;
-
- monitor_chans[0] = caller;
- monitor_chans[1] = chan;
- active_channel = ast_waitfor_n(monitor_chans, 2, &to);
-
- /* see if the timeout has been violated */
- if(ast_tvdiff_ms(ast_tvnow(), started) > timeout) {
- state = AST_CONTROL_UNHOLD;
- ast_log(LOG_NOTICE, "We exceeded our AT-timeout\n");
- break; /*doh! timeout*/
- }
-
- if (!active_channel)
- continue;
-
- if (chan && (chan == active_channel)){
- f = ast_read(chan);
- if (f == NULL) { /*doh! where'd he go?*/
- state = AST_CONTROL_HANGUP;
- res = 0;
- break;
- }
-
- if (f->frametype == AST_FRAME_CONTROL || f->frametype == AST_FRAME_DTMF || f->frametype == AST_FRAME_TEXT) {
- if (f->subclass == AST_CONTROL_RINGING) {
- state = f->subclass;
- ast_verb(3, "%s is ringing\n", chan->name);
- ast_indicate(caller, AST_CONTROL_RINGING);
- } else if ((f->subclass == AST_CONTROL_BUSY) || (f->subclass == AST_CONTROL_CONGESTION)) {
- state = f->subclass;
- ast_verb(3, "%s is busy\n", chan->name);
- ast_indicate(caller, AST_CONTROL_BUSY);
- ast_frfree(f);
- f = NULL;
- break;
- } else if (f->subclass == AST_CONTROL_ANSWER) {
- /* This is what we are hoping for */
- state = f->subclass;
- ast_frfree(f);
- f = NULL;
- ready=1;
- break;
- } else if (f->subclass != -1) {
- ast_log(LOG_NOTICE, "Don't know what to do about control frame: %d\n", f->subclass);
- }
- /* else who cares */
- }
-
- } else if (caller && (active_channel == caller)) {
- f = ast_read(caller);
- if (f == NULL) { /*doh! where'd he go?*/
- if (!igncallerstate) {
- if (ast_check_hangup(caller) && !ast_check_hangup(chan)) {
- /* make this a blind transfer */
- ready = 1;
- break;
- }
- state = AST_CONTROL_HANGUP;
- res = 0;
- break;
- }
- } else {
-
- if (f->frametype == AST_FRAME_DTMF) {
- dialed_code[x++] = f->subclass;
- dialed_code[x] = '\0';
- if (strlen(dialed_code) == len) {
- x = 0;
- } else if (x && strncmp(dialed_code, disconnect_code, x)) {
- x = 0;
- dialed_code[x] = '\0';
- }
- if (*dialed_code && !strcmp(dialed_code, disconnect_code)) {
- /* Caller Canceled the call */
- state = AST_CONTROL_UNHOLD;
- ast_frfree(f);
- f = NULL;
- break;
- }
- }
- }
- }
- if (f)
- ast_frfree(f);
- } /* end while */
-
- ast_poll_channel_del(caller, chan);
-
- } else
- ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, (char *)data);
- } else {
+ struct timeval started;
+ int x, len = 0;
+ char *disconnect_code = NULL, *dialed_code = NULL;
+
+ if (!(chan = ast_request(type, format, caller, data, &cause))) {
ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, (char *)data);
switch(cause) {
case AST_CAUSE_BUSY:
@@ -2146,14 +2026,136 @@
state = AST_CONTROL_CONGESTION;
break;
}
+ goto done;
+ }
+
+ ast_set_callerid(chan, cid_num, cid_name, cid_num);
+ ast_string_field_set(chan, language, language);
+ ast_channel_inherit_variables(caller, chan);
+ pbx_builtin_setvar_helper(chan, "TRANSFERERNAME", caller->name);
+
+ if (ast_call(chan, data, timeout)) {
+ ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, (char *)data);
+ goto done;
}
+ ast_indicate(caller, AST_CONTROL_RINGING);
+ /* support dialing of the featuremap disconnect code while performing an attended tranfer */
+ ast_rwlock_rdlock(&features_lock);
+ for (x = 0; x < FEATURES_COUNT; x++) {
+ if (strcasecmp(builtin_features[x].sname, "disconnect"))
+ continue;
+
+ disconnect_code = builtin_features[x].exten;
+ len = strlen(disconnect_code) + 1;
+ dialed_code = alloca(len);
+ memset(dialed_code, 0, len);
+ break;
+ }
+ ast_rwlock_unlock(&features_lock);
+ x = 0;
+ started = ast_tvnow();
+ to = timeout;
+
+ ast_poll_channel_add(caller, chan);
+
+ while (!((transferee && ast_check_hangup(transferee)) && (!igncallerstate && ast_check_hangup(caller))) && timeout && (chan->_state != AST_STATE_UP)) {
+ struct ast_frame *f = NULL;
+
+ monitor_chans[0] = caller;
+ monitor_chans[1] = chan;
+ active_channel = ast_waitfor_n(monitor_chans, 2, &to);
+
+ /* see if the timeout has been violated */
+ if(ast_tvdiff_ms(ast_tvnow(), started) > timeout) {
+ state = AST_CONTROL_UNHOLD;
+ ast_log(LOG_NOTICE, "We exceeded our AT-timeout\n");
+ break; /*doh! timeout*/
+ }
+
+ if (!active_channel)
+ continue;
+
+ if (chan && (chan == active_channel)){
+ f = ast_read(chan);
+ if (f == NULL) { /*doh! where'd he go?*/
+ state = AST_CONTROL_HANGUP;
+ res = 0;
+ break;
+ }
+
+ if (f->frametype == AST_FRAME_CONTROL || f->frametype == AST_FRAME_DTMF || f->frametype == AST_FRAME_TEXT) {
+ if (f->subclass == AST_CONTROL_RINGING) {
+ state = f->subclass;
+ ast_verb(3, "%s is ringing\n", chan->name);
+ ast_indicate(caller, AST_CONTROL_RINGING);
+ } else if ((f->subclass == AST_CONTROL_BUSY) || (f->subclass == AST_CONTROL_CONGESTION)) {
+ state = f->subclass;
+ ast_verb(3, "%s is busy\n", chan->name);
+ ast_indicate(caller, AST_CONTROL_BUSY);
+ ast_frfree(f);
+ f = NULL;
+ break;
+ } else if (f->subclass == AST_CONTROL_ANSWER) {
+ /* This is what we are hoping for */
+ state = f->subclass;
+ ast_frfree(f);
+ f = NULL;
+ ready=1;
+ break;
+ } else if (f->subclass != -1) {
+ ast_log(LOG_NOTICE, "Don't know what to do about control frame: %d\n", f->subclass);
+ }
+ /* else who cares */
+ }
+
+ } else if (caller && (active_channel == caller)) {
+ f = ast_read(caller);
+ if (f == NULL) { /*doh! where'd he go?*/
+ if (!igncallerstate) {
+ if (ast_check_hangup(caller) && !ast_check_hangup(chan)) {
+ /* make this a blind transfer */
+ ready = 1;
+ break;
+ }
+ state = AST_CONTROL_HANGUP;
+ res = 0;
+ break;
+ }
+ } else {
+
+ if (f->frametype == AST_FRAME_DTMF) {
+ dialed_code[x++] = f->subclass;
+ dialed_code[x] = '\0';
+ if (strlen(dialed_code) == len) {
+ x = 0;
+ } else if (x && strncmp(dialed_code, disconnect_code, x)) {
+ x = 0;
+ dialed_code[x] = '\0';
+ }
+ if (*dialed_code && !strcmp(dialed_code, disconnect_code)) {
+ /* Caller Canceled the call */
+ state = AST_CONTROL_UNHOLD;
+ ast_frfree(f);
+ f = NULL;
+ break;
+ }
+ }
+ }
+ }
+ if (f)
+ ast_frfree(f);
+ } /* end while */
+
+ ast_poll_channel_del(caller, chan);
+
+done:
ast_indicate(caller, -1);
if (chan && ready) {
if (chan->_state == AST_STATE_UP)
state = AST_CONTROL_ANSWER;
res = 0;
- } else if(chan) {
+ } else if (chan) {
res = -1;
ast_hangup(chan);
chan = NULL;
Modified: team/group/newcdr/pbx/pbx_dundi.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/pbx/pbx_dundi.c?view=diff&rev=163487&r1=163486&r2=163487
==============================================================================
--- team/group/newcdr/pbx/pbx_dundi.c (original)
+++ team/group/newcdr/pbx/pbx_dundi.c Fri Dec 12 08:25:36 2008
@@ -101,6 +101,7 @@
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;
@@ -2112,6 +2113,40 @@
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;
@@ -2153,6 +2188,7 @@
{
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;
}
@@ -4687,7 +4723,7 @@
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 */
@@ -4700,6 +4736,10 @@
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, ARRAY_LEN(cli_dundi));
ast_unregister_switch(&dundi_switch);
Modified: team/group/newcdr/res/res_timing_pthread.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/res/res_timing_pthread.c?view=diff&rev=163487&r1=163486&r2=163487
==============================================================================
--- team/group/newcdr/res/res_timing_pthread.c (original)
+++ team/group/newcdr/res/res_timing_pthread.c Fri Dec 12 08:25:36 2008
@@ -151,6 +151,23 @@
ao2_ref(timer, -1);
}
+static void set_state(struct pthread_timer *timer)
+{
+ unsigned int rate = timer->rate;
+
+ if (rate) {
+ timer->state = TIMER_STATE_TICKING;
+ timer->interval = roundf(1000.0 / ((float) rate));
+ timer->start = ast_tvnow();
+ } else {
+ timer->state = TIMER_STATE_IDLE;
+ timer->interval = 0;
+ timer->start = ast_tv(0, 0);
+ }
+
+ timer->tick_count = 0;
+}
+
static int pthread_timer_set_rate(int handle, unsigned int rate)
{
struct pthread_timer *timer;
@@ -169,10 +186,10 @@
ao2_lock(timer);
timer->rate = rate;
- timer->state = rate ? TIMER_STATE_TICKING : TIMER_STATE_IDLE;
- timer->interval = rate ? roundf(1000.0 / ((float) rate)) : 0;
- timer->start = rate ? ast_tvnow() : ast_tv(0, 0);
- timer->tick_count = 0;
+ if (timer->state != TIMER_STATE_CONTINUOUS) {
+ set_state(timer);
+ }
+
ao2_unlock(timer);
ao2_ref(timer, -1);
@@ -229,7 +246,7 @@
}
ao2_lock(timer);
- timer->state = timer->rate ? TIMER_STATE_TICKING : TIMER_STATE_IDLE;
+ set_state(timer);
read_pipe(timer->pipe[PIPE_READ], 0, 1);
ao2_unlock(timer);
More information about the asterisk-commits
mailing list