This set of changes is to make some callerID handling thread-safe.

The ast_set_callerid() function needed to lock the channel.  Also, the handlers
for the CALLERID() dialplan function needed to lock the channel when reading
or writing callerid values directly on the channel structure.


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@90145 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Russell Bryant
2007-11-29 00:20:34 +00:00
parent 1380790b60
commit 2fc83c3db1
3 changed files with 17 additions and 4 deletions

View File

@@ -64,6 +64,8 @@ static int callerid_read(struct ast_channel *chan, char *cmd, char *data,
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
}
} else {
ast_channel_lock(chan);
if (!strncasecmp("all", data, 3)) {
snprintf(buf, len, "\"%s\" <%s>",
S_OR(chan->cid.cid_name, ""),
@@ -92,6 +94,8 @@ static int callerid_read(struct ast_channel *chan, char *cmd, char *data,
} else {
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
}
ast_channel_unlock(chan);
}
return 0;
@@ -117,15 +121,17 @@ static int callerid_write(struct ast_channel *chan, char *cmd, char *data,
} else if (!strncasecmp("ani", data, 3)) {
ast_set_callerid(chan, NULL, NULL, value);
} else if (!strncasecmp("dnid", data, 4)) {
/* do we need to lock chan here? */
ast_channel_lock(chan);
if (chan->cid.cid_dnid)
free(chan->cid.cid_dnid);
chan->cid.cid_dnid = ast_strdup(value);
ast_channel_unlock(chan);
} else if (!strncasecmp("rdnis", data, 5)) {
/* do we need to lock chan here? */
ast_channel_lock(chan);
if (chan->cid.cid_rdnis)
free(chan->cid.cid_rdnis);
chan->cid.cid_rdnis = ast_strdup(value);
ast_channel_unlock(chan);
} else {
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
}

View File

@@ -1109,6 +1109,9 @@ int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen,
/*! Deactive an active generator */
void ast_deactivate_generator(struct ast_channel *chan);
/*!
* \note The channel does not need to be locked before calling this function.
*/
void ast_set_callerid(struct ast_channel *chan, const char *cidnum, const char *cidname, const char *ani);

View File

@@ -3874,6 +3874,8 @@ int ast_do_masquerade(struct ast_channel *original)
void ast_set_callerid(struct ast_channel *chan, const char *callerid, const char *calleridname, const char *ani)
{
ast_channel_lock(chan);
if (callerid) {
if (chan->cid.cid_num)
free(chan->cid.cid_num);
@@ -3904,6 +3906,8 @@ void ast_set_callerid(struct ast_channel *chan, const char *callerid, const char
chan->cid.cid_pres,
ast_describe_caller_presentation(chan->cid.cid_pres)
);
ast_channel_unlock(chan);
}
int ast_setstate(struct ast_channel *chan, enum ast_channel_state state)