From 3fca7d468f97d5a372f59853c4d92cbb96ee8588 Mon Sep 17 00:00:00 2001 From: Automerge script Date: Tue, 11 Sep 2012 23:22:10 +0000 Subject: [PATCH] Merged revisions 372916 via svnmerge from file:///srv/subversion/repos/asterisk/branches/10 ................ r372916 | jrose | 2012-09-11 17:23:20 -0500 (Tue, 11 Sep 2012) | 13 lines chan_local: Switch from using a random 4 digit hex identifier to unique id Changes chan_local channels to use an 8 digit hex identifier generated atomically and sequentially in order to eliminate the chance of having multiple channels with the same name during high call volume situations. (issue ASTERISK-20318) Reported by: Dan Cropp Review: https://reviewboard.asterisk.org/r/2104/ ........ Merged revisions 372902 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10-digiumphones@372929 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_local.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/channels/chan_local.c b/channels/chan_local.c index 681285602b..ba238d858b 100644 --- a/channels/chan_local.c +++ b/channels/chan_local.c @@ -84,6 +84,8 @@ static const int BUCKET_SIZE = 1; static struct ao2_container *locals; +static unsigned int name_sequence = 0; + static struct ast_jb_conf g_jb_conf = { .flags = 0, .max_size = -1, @@ -1156,8 +1158,8 @@ static struct local_pvt *local_alloc(const char *data, struct ast_format_cap *ca static struct ast_channel *local_new(struct local_pvt *p, int state, const char *linkedid) { struct ast_channel *tmp = NULL, *tmp2 = NULL; - int randnum = ast_random() & 0xffff; struct ast_format fmt; + int generated_seqno = ast_atomic_fetchadd_int((int *)&name_sequence, +1); const char *t; int ama; @@ -1175,8 +1177,8 @@ static struct ast_channel *local_new(struct local_pvt *p, int state, const char /* Make sure that the ;2 channel gets the same linkedid as ;1. You can't pass linkedid to both * allocations since if linkedid isn't set, then each channel will generate its own linkedid. */ - if (!(tmp = ast_channel_alloc(1, state, 0, 0, t, p->exten, p->context, linkedid, ama, "Local/%s@%s-%04x;1", p->exten, p->context, randnum)) - || !(tmp2 = ast_channel_alloc(1, AST_STATE_RING, 0, 0, t, p->exten, p->context, tmp->linkedid, ama, "Local/%s@%s-%04x;2", p->exten, p->context, randnum))) { + if (!(tmp = ast_channel_alloc(1, state, 0, 0, t, p->exten, p->context, linkedid, ama, "Local/%s@%s-%08x;1", p->exten, p->context, generated_seqno)) + || !(tmp2 = ast_channel_alloc(1, AST_STATE_RING, 0, 0, t, p->exten, p->context, tmp->linkedid, ama, "Local/%s@%s-%08x;2", p->exten, p->context, generated_seqno))) { if (tmp) { tmp = ast_channel_release(tmp); } -- 2.47.3