aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-05-27 19:09:00 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-05-27 19:09:00 +0000
commit786daf2acc8b05bf8d2bb326e233caf51afb0873 (patch)
tree8e7e8afbef464e316fbe4f6f2b2c553ef2a23ea9 /apps
parent61ec20ce0be3067a5fb66c5dad387eb3a405c9cc (diff)
Merged revisions 118514 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r118514 | mmichelson | 2008-05-27 14:08:24 -0500 (Tue, 27 May 2008) | 19 lines Merged revisions 118509 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r118509 | mmichelson | 2008-05-27 14:07:26 -0500 (Tue, 27 May 2008) | 11 lines Russell noted to me that in the case that separate threads use their own addressing system, the fix I made for issue 12376 does not guarantee uniqueness to the datastores' uids. Though I know of no system that works this way, I am going to change this right now to prevent trying to track down some future bug that may occur and cause untold hours of debugging time to track down. The change involves using a global counter which increases with each new chanspy_ds which is created. This guarantees uniqueness. ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@118518 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r--apps/app_chanspy.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c
index 6f1ca4a72..458f1cea3 100644
--- a/apps/app_chanspy.c
+++ b/apps/app_chanspy.c
@@ -166,6 +166,7 @@ AST_APP_OPTIONS(spy_opts, {
AST_APP_OPTION('X', OPTION_EXIT),
});
+int next_unique_id_to_use = 0;
struct chanspy_translation_helper {
/* spy data */
@@ -241,6 +242,7 @@ static int start_spying(struct ast_channel *chan, const char *spychan_name, stru
struct chanspy_ds {
struct ast_channel *chan;
+ char unique_id[20];
ast_mutex_t lock;
};
@@ -452,13 +454,11 @@ static struct chanspy_ds *chanspy_ds_free(struct chanspy_ds *chanspy_ds)
if (chanspy_ds->chan) {
struct ast_datastore *datastore;
struct ast_channel *chan;
- char uid[20];
chan = chanspy_ds->chan;
ast_channel_lock(chan);
- snprintf(uid, sizeof(uid), "%p", chanspy_ds);
- if ((datastore = ast_channel_datastore_find(chan, &chanspy_ds_info, uid))) {
+ if ((datastore = ast_channel_datastore_find(chan, &chanspy_ds_info, chanspy_ds->unique_id))) {
ast_channel_datastore_remove(chan, datastore);
/* chanspy_ds->chan is NULL after this call */
chanspy_ds_destroy(datastore->data);
@@ -476,13 +476,10 @@ static struct chanspy_ds *chanspy_ds_free(struct chanspy_ds *chanspy_ds)
static struct chanspy_ds *setup_chanspy_ds(struct ast_channel *chan, struct chanspy_ds *chanspy_ds)
{
struct ast_datastore *datastore = NULL;
- char uid[20];
ast_mutex_lock(&chanspy_ds->lock);
- snprintf(uid, sizeof(uid), "%p", chanspy_ds);
-
- if (!(datastore = ast_channel_datastore_alloc(&chanspy_ds_info, uid))) {
+ if (!(datastore = ast_channel_datastore_alloc(&chanspy_ds_info, chanspy_ds->unique_id))) {
ast_mutex_unlock(&chanspy_ds->lock);
chanspy_ds = chanspy_ds_free(chanspy_ds);
ast_channel_unlock(chan);
@@ -553,6 +550,8 @@ static int common_exec(struct ast_channel *chan, const struct ast_flags *flags,
ast_mutex_init(&chanspy_ds.lock);
+ snprintf(chanspy_ds.unique_id, sizeof(chanspy_ds.unique_id), "%d", ast_atomic_fetchadd_int(&next_unique_id_to_use, +1));
+
if (chan->_state != AST_STATE_UP)
ast_answer(chan);