[asterisk-commits] russell: branch group/upenn r104115 - in /team/group/upenn: ./ apps/ channels...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Feb 25 18:10:03 CST 2008
Author: russell
Date: Mon Feb 25 18:10:02 2008
New Revision: 104115
URL: http://svn.digium.com/view/asterisk?view=rev&rev=104115
Log:
sync with 1.4
Modified:
team/group/upenn/ (props changed)
team/group/upenn/apps/app_chanspy.c
team/group/upenn/apps/app_voicemail.c
team/group/upenn/channels/chan_agent.c
team/group/upenn/channels/chan_h323.c
team/group/upenn/channels/chan_sip.c
team/group/upenn/channels/chan_zap.c
team/group/upenn/main/config.c
team/group/upenn/main/manager.c
team/group/upenn/main/utils.c
Propchange: team/group/upenn/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Mon Feb 25 18:10:02 2008
@@ -1,1 +1,1 @@
-/branches/1.4:1-103967
+/branches/1.4:1-104114
Modified: team/group/upenn/apps/app_chanspy.c
URL: http://svn.digium.com/view/asterisk/team/group/upenn/apps/app_chanspy.c?view=diff&rev=104115&r1=104114&r2=104115
==============================================================================
--- team/group/upenn/apps/app_chanspy.c (original)
+++ team/group/upenn/apps/app_chanspy.c Mon Feb 25 18:10:02 2008
@@ -197,23 +197,31 @@
.generate = spy_generate,
};
-static int start_spying(struct ast_channel *chan, struct ast_channel *spychan, struct ast_audiohook *audiohook)
+static int start_spying(struct ast_channel *chan, const char *spychan_name, struct ast_audiohook *audiohook)
{
int res;
struct ast_channel *peer;
- ast_log(LOG_NOTICE, "Attaching %s to %s\n", spychan->name, chan->name);
+ ast_log(LOG_NOTICE, "Attaching %s to %s\n", spychan_name, chan->name);
res = ast_audiohook_attach(chan, audiohook);
- if (!res && ast_test_flag(chan, AST_FLAG_NBRIDGE) && (peer = ast_bridged_channel(chan)))
+ if (!res && ast_test_flag(chan, AST_FLAG_NBRIDGE) && (peer = ast_bridged_channel(chan))) {
+ ast_channel_unlock(chan);
ast_softhangup(peer, AST_SOFTHANGUP_UNBRIDGE);
+ } else
+ ast_channel_unlock(chan);
return res;
}
-static int channel_spy(struct ast_channel *chan, struct ast_channel *spyee, int *volfactor, int fd,
- const struct ast_flags *flags)
+struct chanspy_ds {
+ struct ast_channel *chan;
+ ast_mutex_t lock;
+};
+
+static int channel_spy(struct ast_channel *chan, struct chanspy_ds *spyee_chanspy_ds,
+ int *volfactor, int fd, const struct ast_flags *flags)
{
struct chanspy_translation_helper csth;
int running = 0, res, x = 0;
@@ -221,6 +229,24 @@
char *name;
struct ast_frame *f;
struct ast_silence_generator *silgen = NULL;
+ struct ast_channel *spyee = NULL;
+ const char *spyer_name;
+
+ ast_channel_lock(chan);
+ spyer_name = ast_strdupa(chan->name);
+ ast_channel_unlock(chan);
+
+ ast_mutex_lock(&spyee_chanspy_ds->lock);
+ if (spyee_chanspy_ds->chan) {
+ spyee = spyee_chanspy_ds->chan;
+ ast_channel_lock(spyee);
+ }
+ ast_mutex_unlock(&spyee_chanspy_ds->lock);
+
+ if (!spyee)
+ return 0;
+
+ /* We now hold the channel lock on spyee */
if (ast_check_hangup(chan) || ast_check_hangup(spyee))
return 0;
@@ -232,17 +258,19 @@
memset(&csth, 0, sizeof(csth));
ast_audiohook_init(&csth.spy_audiohook, AST_AUDIOHOOK_TYPE_SPY, "ChanSpy");
-
- if (start_spying(spyee, chan, &csth.spy_audiohook)) {
+
+ if (start_spying(spyee, spyer_name, &csth.spy_audiohook)) { /* Unlocks spyee */
ast_audiohook_destroy(&csth.spy_audiohook);
return 0;
}
if (ast_test_flag(flags, OPTION_WHISPER)) {
ast_audiohook_init(&csth.whisper_audiohook, AST_AUDIOHOOK_TYPE_WHISPER, "ChanSpy");
- start_spying(spyee, chan, &csth.whisper_audiohook);
- }
-
+ start_spying(spyee, spyer_name, &csth.whisper_audiohook); /* Unlocks spyee */
+ }
+
+ spyee = NULL;
+
csth.volfactor = *volfactor;
if (csth.volfactor) {
@@ -343,12 +371,82 @@
return running;
}
-static struct ast_channel *next_channel(const struct ast_channel *last, const char *spec,
- const char *exten, const char *context)
+/*!
+ * \note This relies on the embedded lock to be recursive, as it may be called
+ * due to a call to chanspy_ds_free with the lock held there.
+ */
+static void chanspy_ds_destroy(void *data)
+{
+ struct chanspy_ds *chanspy_ds = data;
+
+ /* Setting chan to be NULL is an atomic operation, but we don't want this
+ * value to change while this lock is held. The lock is held elsewhere
+ * while it performs non-atomic operations with this channel pointer */
+
+ ast_mutex_lock(&chanspy_ds->lock);
+ chanspy_ds->chan = NULL;
+ ast_mutex_unlock(&chanspy_ds->lock);
+}
+
+static const struct ast_datastore_info chanspy_ds_info = {
+ .type = "chanspy",
+ .destroy = chanspy_ds_destroy,
+};
+
+static struct chanspy_ds *chanspy_ds_free(struct chanspy_ds *chanspy_ds)
+{
+ if (!chanspy_ds)
+ return NULL;
+
+ ast_mutex_lock(&chanspy_ds->lock);
+ if (chanspy_ds->chan) {
+ struct ast_datastore *datastore;
+ struct ast_channel *chan;
+
+ chan = chanspy_ds->chan;
+
+ ast_channel_lock(chan);
+ if ((datastore = ast_channel_datastore_find(chan, &chanspy_ds_info, NULL))) {
+ ast_channel_datastore_remove(chan, datastore);
+ /* chanspy_ds->chan is NULL after this call */
+ ast_channel_datastore_free(datastore);
+ }
+ ast_channel_unlock(chan);
+ }
+ ast_mutex_unlock(&chanspy_ds->lock);
+
+ return NULL;
+}
+
+/*! \note Returns the channel in the chanspy_ds locked as well as the chanspy_ds locked */
+static struct chanspy_ds *setup_chanspy_ds(struct ast_channel *chan, struct chanspy_ds *chanspy_ds)
+{
+ struct ast_datastore *datastore = NULL;
+
+ ast_mutex_lock(&chanspy_ds->lock);
+
+ chanspy_ds->chan = chan;
+
+ if (!(datastore = ast_channel_datastore_alloc(&chanspy_ds_info, NULL))) {
+ chanspy_ds = chanspy_ds_free(chanspy_ds);
+ ast_channel_unlock(chan);
+ return NULL;
+ }
+
+ datastore->data = chanspy_ds;
+
+ ast_channel_datastore_add(chan, datastore);
+
+ return chanspy_ds;
+}
+
+static struct chanspy_ds *next_channel(struct ast_channel *chan,
+ const struct ast_channel *last, const char *spec,
+ const char *exten, const char *context, struct chanspy_ds *chanspy_ds)
{
struct ast_channel *this;
- redo:
+redo:
if (spec)
this = ast_walk_channel_by_name_prefix_locked(last, spec, strlen(spec));
else if (exten)
@@ -356,20 +454,21 @@
else
this = ast_channel_walk_locked(last);
- if (this) {
+ if (!this)
+ return NULL;
+
+ if (!strncmp(this->name, "Zap/pseudo", 10)) {
ast_channel_unlock(this);
- if (!strncmp(this->name, "Zap/pseudo", 10))
- goto redo;
- }
-
- return this;
+ goto redo;
+ }
+
+ return setup_chanspy_ds(this, chanspy_ds);
}
static int common_exec(struct ast_channel *chan, const struct ast_flags *flags,
int volfactor, const int fd, const char *mygroup, const char *spec,
const char *exten, const char *context)
{
- struct ast_channel *peer, *prev, *next;
char nameprefix[AST_NAME_STRLEN];
char peer_name[AST_NAME_STRLEN + 5];
signed char zero_volume = 0;
@@ -378,6 +477,9 @@
char *ptr;
int num;
int num_spyed_upon = 1;
+ struct chanspy_ds chanspy_ds;
+
+ ast_mutex_init(&chanspy_ds.lock);
if (chan->_state != AST_STATE_UP)
ast_answer(chan);
@@ -387,6 +489,9 @@
waitms = 100;
for (;;) {
+ struct chanspy_ds *peer_chanspy_ds = NULL, *next_chanspy_ds = NULL;
+ struct ast_channel *prev = NULL, *peer = NULL;
+
if (!ast_test_flag(flags, OPTION_QUIET) && num_spyed_upon) {
res = ast_streamfile(chan, "beep", chan->language);
if (!res)
@@ -405,12 +510,13 @@
/* reset for the next loop around, unless overridden later */
waitms = 100;
- peer = prev = next = NULL;
num_spyed_upon = 0;
- for (peer = next_channel(peer, spec, exten, context);
- peer;
- prev = peer, peer = next ? next : next_channel(peer, spec, exten, context), next = NULL) {
+ for (peer_chanspy_ds = next_channel(chan, prev, spec, exten, context, &chanspy_ds);
+ peer_chanspy_ds;
+ chanspy_ds_free(peer_chanspy_ds), prev = peer,
+ peer_chanspy_ds = next_chanspy_ds ? next_chanspy_ds :
+ next_channel(chan, prev, spec, exten, context, &chanspy_ds), next_chanspy_ds = NULL) {
const char *group;
int igrp = !mygroup;
char *groups[25];
@@ -418,18 +524,32 @@
char *dup_group;
int x;
char *s;
-
- if (peer == prev)
+ struct ast_channel *peer;
+
+ peer = peer_chanspy_ds->chan;
+
+ ast_mutex_unlock(&peer_chanspy_ds->lock);
+
+ if (peer == prev) {
+ ast_channel_unlock(peer);
+ chanspy_ds_free(peer_chanspy_ds);
break;
-
- if (peer == chan)
+ }
+
+ if (peer == chan) {
+ ast_channel_unlock(peer);
continue;
-
- if (ast_test_flag(flags, OPTION_BRIDGED) && !ast_bridged_channel(peer))
+ }
+
+ if (ast_test_flag(flags, OPTION_BRIDGED) && !ast_bridged_channel(peer)) {
+ ast_channel_unlock(peer);
continue;
-
- if (ast_check_hangup(peer) || ast_test_flag(peer, AST_FLAG_SPYING))
+ }
+
+ if (ast_check_hangup(peer) || ast_test_flag(peer, AST_FLAG_SPYING)) {
+ ast_channel_unlock(peer);
continue;
+ }
if (mygroup) {
if ((group = pbx_builtin_getvar_helper(peer, "SPYGROUP"))) {
@@ -446,8 +566,10 @@
}
}
- if (!igrp)
+ if (!igrp) {
+ ast_channel_unlock(peer);
continue;
+ }
strcpy(peer_name, "spy-");
strncat(peer_name, peer->name, AST_NAME_STRLEN);
@@ -456,7 +578,14 @@
for (s = peer_name; s < ptr; s++)
*s = tolower(*s);
-
+
+
+ /* We have to unlock the peer channel here to avoid a deadlock.
+ * So, when we need it again, we have to lock the datastore and get
+ * the pointer from there to see if the channel is still valid. */
+ ast_channel_unlock(peer);
+ peer = NULL;
+
if (!ast_test_flag(flags, OPTION_QUIET)) {
if (ast_fileexists(peer_name, NULL, NULL) != -1) {
res = ast_streamfile(chan, peer_name, chan->language);
@@ -471,19 +600,34 @@
}
waitms = 5000;
- res = channel_spy(chan, peer, &volfactor, fd, flags);
+ res = channel_spy(chan, peer_chanspy_ds, &volfactor, fd, flags);
num_spyed_upon++;
if (res == -1) {
break;
} else if (res > 1 && spec) {
+ struct ast_channel *next;
+
snprintf(nameprefix, AST_NAME_STRLEN, "%s/%d", spec, res);
+
if ((next = ast_get_channel_by_name_prefix_locked(nameprefix, strlen(nameprefix)))) {
- ast_channel_unlock(next);
+ peer_chanspy_ds = chanspy_ds_free(peer_chanspy_ds);
+ next_chanspy_ds = setup_chanspy_ds(next, &chanspy_ds);
} else {
- /* stay on this channel */
- next = peer;
+ /* stay on this channel, if it is still valid */
+
+ ast_mutex_lock(&peer_chanspy_ds->lock);
+ if (peer_chanspy_ds->chan) {
+ ast_channel_lock(peer_chanspy_ds->chan);
+ next_chanspy_ds = peer_chanspy_ds;
+ peer_chanspy_ds = NULL;
+ } else {
+ /* the channel is gone */
+ ast_mutex_unlock(&peer_chanspy_ds->lock);
+ next_chanspy_ds = NULL;
+ }
}
+
peer = NULL;
}
}
@@ -494,6 +638,8 @@
ast_clear_flag(chan, AST_FLAG_SPYING);
ast_channel_setoption(chan, AST_OPTION_TXGAIN, &zero_volume, sizeof(zero_volume), 0);
+
+ ast_mutex_destroy(&chanspy_ds.lock);
return res;
}
Modified: team/group/upenn/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/team/group/upenn/apps/app_voicemail.c?view=diff&rev=104115&r1=104114&r2=104115
==============================================================================
--- team/group/upenn/apps/app_voicemail.c (original)
+++ team/group/upenn/apps/app_voicemail.c Mon Feb 25 18:10:02 2008
@@ -262,6 +262,7 @@
#define VM_SEARCH (1 << 14)
#define VM_TEMPGREETWARN (1 << 15) /*!< Remind user tempgreeting is set */
#define ERROR_LOCK_PATH -100
+#define ERROR_MAILBOX_FULL -200
enum {
@@ -3414,7 +3415,7 @@
}
if (x >= vmu->maxmsg) {
ast_unlock_path(ddir);
- return -1;
+ return ERROR_MAILBOX_FULL;
}
if (strcmp(sfn, dfn)) {
COPY(dir, msg, ddir, x, username, context, sfn, dfn);
@@ -5075,8 +5076,9 @@
} else if (!strcasecmp(vms->curbox, "INBOX") && vms->heard[x] && !vms->deleted[x]) {
/* Move to old folder before deleting */
res = save_to_folder(vmu, vms, x, 1);
- if (res == ERROR_LOCK_PATH) {
+ if (res == ERROR_LOCK_PATH || res == ERROR_MAILBOX_FULL) {
/* If save failed do not delete the message */
+ ast_log(LOG_WARNING, "Save failed. Not moving message: %s.\n", res == ERROR_LOCK_PATH ? "unable to lock path" : "destination folder full");
vms->deleted[x] = 0;
vms->heard[x] = 0;
--x;
Modified: team/group/upenn/channels/chan_agent.c
URL: http://svn.digium.com/view/asterisk/team/group/upenn/channels/chan_agent.c?view=diff&rev=104115&r1=104114&r2=104115
==============================================================================
--- team/group/upenn/channels/chan_agent.c (original)
+++ team/group/upenn/channels/chan_agent.c Mon Feb 25 18:10:02 2008
@@ -1581,10 +1581,29 @@
ret = 0;
if (p->owner || p->chan) {
if (!soft) {
- if (p->owner)
+ ast_mutex_lock(&p->lock);
+
+ while (p->owner && ast_channel_trylock(p->owner)) {
+ ast_mutex_unlock(&p->lock);
+ usleep(1);
+ ast_mutex_lock(&p->lock);
+ }
+ if (p->owner) {
ast_softhangup(p->owner, AST_SOFTHANGUP_EXPLICIT);
- if (p->chan)
+ ast_channel_unlock(p->owner);
+ }
+
+ while (p->chan && ast_channel_trylock(p->chan)) {
+ ast_mutex_unlock(&p->lock);
+ usleep(1);
+ ast_mutex_lock(&p->lock);
+ }
+ if (p->chan) {
ast_softhangup(p->chan, AST_SOFTHANGUP_EXPLICIT);
+ ast_channel_unlock(p->chan);
+ }
+
+ ast_mutex_unlock(&p->lock);
} else
p->deferlogoff = 1;
} else {
Modified: team/group/upenn/channels/chan_h323.c
URL: http://svn.digium.com/view/asterisk/team/group/upenn/channels/chan_h323.c?view=diff&rev=104115&r1=104114&r2=104115
==============================================================================
--- team/group/upenn/channels/chan_h323.c (original)
+++ team/group/upenn/channels/chan_h323.c Mon Feb 25 18:10:02 2008
@@ -54,7 +54,7 @@
#include <sys/socket.h>
#include <sys/signal.h>
#include <sys/param.h>
-#if defined(BSD)
+#if defined(BSD) || defined(SOLARIS)
#ifndef IPTOS_MINCOST
#define IPTOS_MINCOST 0x02
#endif
Modified: team/group/upenn/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/group/upenn/channels/chan_sip.c?view=diff&rev=104115&r1=104114&r2=104115
==============================================================================
--- team/group/upenn/channels/chan_sip.c (original)
+++ team/group/upenn/channels/chan_sip.c Mon Feb 25 18:10:02 2008
@@ -1417,7 +1417,7 @@
/*--- Device object handling */
static struct sip_peer *temp_peer(const char *name);
static struct sip_peer *build_peer(const char *name, struct ast_variable *v, struct ast_variable *alt, int realtime);
-static struct sip_user *build_user(const char *name, struct ast_variable *v, int realtime);
+static struct sip_user *build_user(const char *name, struct ast_variable *v, struct ast_variable *alt, int realtime);
static int update_call_counter(struct sip_pvt *fup, int event);
static void sip_destroy_peer(struct sip_peer *peer);
static void sip_destroy_user(struct sip_user *user);
@@ -2171,7 +2171,7 @@
}
ast_mutex_unlock(&p->lock);
if (option_debug)
- ast_log(LOG_DEBUG, "Stopping retransmission on '%s' of %s %d: Match %s\n", p->callid, resp ? "Response" : "Request", seqno, res ? "Not Found" : "Found");
+ ast_log(LOG_DEBUG, "Stopping retransmission on '%s' of %s %d: Match %s\n", p->callid, resp ? "Response" : "Request", seqno, res == FALSE ? "Not Found" : "Found");
}
/*! \brief Pretend to ack all packets
@@ -2212,7 +2212,7 @@
}
}
if (option_debug)
- ast_log(LOG_DEBUG, "(Provisional) Stopping retransmission (but retaining packet) on '%s' %s %d: %s\n", p->callid, resp ? "Response" : "Request", seqno, res ? "Not Found" : "Found");
+ ast_log(LOG_DEBUG, "(Provisional) Stopping retransmission (but retaining packet) on '%s' %s %d: %s\n", p->callid, resp ? "Response" : "Request", seqno, res == -1 ? "Not Found" : "Found");
return res;
}
@@ -2697,7 +2697,7 @@
}
}
- user = build_user(username, var, !ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS));
+ user = build_user(username, var, NULL, !ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS));
if (!user) { /* No user found */
ast_variables_destroy(var);
@@ -4567,7 +4567,7 @@
found = (!strcmp(p->callid, callid));
else
found = (!strcmp(p->callid, callid) &&
- (!pedanticsipchecking || !tag || ast_strlen_zero(p->theirtag) || !strcmp(p->theirtag, tag))) ;
+ (!pedanticsipchecking || ast_strlen_zero(tag) || ast_strlen_zero(p->theirtag) || !strcmp(p->theirtag, tag))) ;
if (option_debug > 4)
ast_log(LOG_DEBUG, "= %s Their Call ID: %s Their Tag %s Our tag: %s\n", found ? "Found" : "No match", p->callid, p->theirtag, p->tag);
@@ -14812,6 +14812,18 @@
}
if (!ast_test_flag(req, SIP_PKT_IGNORE) && !resubscribe) { /* Set up dialog, new subscription */
+ const char *to = get_header(req, "To");
+ char totag[128];
+
+ /* Check to see if a tag was provided, if so this is actually a resubscription of a dialog we no longer know about */
+ if (!ast_strlen_zero(to) && gettag(req, "To", totag, sizeof(totag))) {
+ if (ast_test_flag(req, SIP_PKT_DEBUG))
+ ast_verbose("Received resubscription for a dialog we no longer know about. Telling remote side to subscribe again.\n");
+ transmit_response(p, "481 Subscription does not exist", req);
+ ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);
+ return 0;
+ }
+
/* Use this as the basis */
if (ast_test_flag(req, SIP_PKT_DEBUG))
ast_verbose("Creating new subscription\n");
@@ -16284,7 +16296,7 @@
}
/*! \brief Initiate a SIP user structure from configuration (configuration or realtime) */
-static struct sip_user *build_user(const char *name, struct ast_variable *v, int realtime)
+static struct sip_user *build_user(const char *name, struct ast_variable *v, struct ast_variable *alt, int realtime)
{
struct sip_user *user;
int format;
@@ -16315,7 +16327,7 @@
strcpy(user->language, default_language);
strcpy(user->mohinterpret, default_mohinterpret);
strcpy(user->mohsuggest, default_mohsuggest);
- for (; v; v = v->next) {
+ for (; v || ((v = alt) && !(alt=NULL)); v = v->next) {
if (handle_common_options(&userflags[0], &mask[0], v))
continue;
@@ -17135,6 +17147,12 @@
hassip = ast_variable_retrieve(ucfg, cat, "hassip");
registersip = ast_variable_retrieve(ucfg, cat, "registersip");
if (ast_true(hassip) || (!hassip && genhassip)) {
+ user = build_user(cat, gen, ast_variable_browse(ucfg, cat), 0);
+ if (user) {
+ ASTOBJ_CONTAINER_LINK(&userl,user);
+ ASTOBJ_UNREF(user, sip_destroy_user);
+ user_count++;
+ }
peer = build_peer(cat, gen, ast_variable_browse(ucfg, cat), 0);
if (peer) {
ast_device_state_changed("SIP/%s", peer->name);
@@ -17196,7 +17214,7 @@
continue;
}
if (is_user) {
- user = build_user(cat, ast_variable_browse(cfg, cat), 0);
+ user = build_user(cat, ast_variable_browse(cfg, cat), NULL, 0);
if (user) {
ASTOBJ_CONTAINER_LINK(&userl,user);
ASTOBJ_UNREF(user, sip_destroy_user);
Modified: team/group/upenn/channels/chan_zap.c
URL: http://svn.digium.com/view/asterisk/team/group/upenn/channels/chan_zap.c?view=diff&rev=104115&r1=104114&r2=104115
==============================================================================
--- team/group/upenn/channels/chan_zap.c (original)
+++ team/group/upenn/channels/chan_zap.c Mon Feb 25 18:10:02 2008
@@ -6938,12 +6938,6 @@
} else {
ast_log(LOG_WARNING, "Read failed with %d: %s\n", res, strerror(errno));
}
- if (option_debug)
- ast_log(LOG_DEBUG, "Monitor doohicky got event %s on channel %d\n", event2str(res), i->channel);
- /* Don't hold iflock while handling init events -- race with chlock */
- ast_mutex_unlock(&iflock);
- handle_init_event(i, res);
- ast_mutex_lock(&iflock);
}
if (pollres & POLLPRI) {
if (i->owner || i->subs[SUB_REAL].owner) {
Modified: team/group/upenn/main/config.c
URL: http://svn.digium.com/view/asterisk/team/group/upenn/main/config.c?view=diff&rev=104115&r1=104114&r2=104115
==============================================================================
--- team/group/upenn/main/config.c (original)
+++ team/group/upenn/main/config.c Mon Feb 25 18:10:02 2008
@@ -1330,7 +1330,8 @@
struct ast_config_engine *loader = &text_file_engine;
struct ast_config *result;
- if (cfg->include_level == cfg->max_include_level) {
+ /* The config file itself bumps include_level by 1 */
+ if (cfg->max_include_level > 0 && cfg->include_level == cfg->max_include_level + 1) {
ast_log(LOG_WARNING, "Maximum Include level (%d) exceeded\n", cfg->max_include_level);
return NULL;
}
Modified: team/group/upenn/main/manager.c
URL: http://svn.digium.com/view/asterisk/team/group/upenn/main/manager.c?view=diff&rev=104115&r1=104114&r2=104115
==============================================================================
--- team/group/upenn/main/manager.c (original)
+++ team/group/upenn/main/manager.c Mon Feb 25 18:10:02 2008
@@ -2660,7 +2660,7 @@
ast_mutex_init(&s->__lock);
ast_mutex_lock(&s->__lock);
s->inuse = 1;
- s->managerid = rand() | (unsigned long)s;
+ s->managerid = rand() ^ (unsigned long) s;
AST_LIST_LOCK(&sessions);
AST_LIST_INSERT_HEAD(&sessions, s, list);
/* Hook into the last spot in the event queue */
Modified: team/group/upenn/main/utils.c
URL: http://svn.digium.com/view/asterisk/team/group/upenn/main/utils.c?view=diff&rev=104115&r1=104114&r2=104115
==============================================================================
--- team/group/upenn/main/utils.c (original)
+++ team/group/upenn/main/utils.c Mon Feb 25 18:10:02 2008
@@ -610,7 +610,16 @@
pthread_mutex_unlock(&lock_info->lock);
return;
}
-
+
+ if (i && lock_info->locks[i].pending == -1) {
+ /* The last lock on the list was one that this thread tried to lock but
+ * failed at doing so. It has now moved on to something else, so remove
+ * the old lock from the list. */
+ i--;
+ lock_info->num_locks--;
+ memset(&lock_info->locks[i], 0, sizeof(lock_info->locks[0]));
+ }
+
lock_info->locks[i].file = filename;
lock_info->locks[i].line_num = line_num;
lock_info->locks[i].func = func;
More information about the asterisk-commits
mailing list