]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_local: Switch from using a random 4 digit hex identifier to unique id
authorJonathan Rose <jrose@digium.com>
Tue, 11 Sep 2012 22:11:58 +0000 (22:11 +0000)
committerJonathan Rose <jrose@digium.com>
Tue, 11 Sep 2012 22:11:58 +0000 (22:11 +0000)
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/

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@372902 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_local.c

index b82b9d28e96db043226979f5e377be1bfdd6905e..f1991f262f6be4c5acf118046e7efbcc67facdbf 100644 (file)
@@ -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,
@@ -1150,7 +1152,8 @@ static struct local_pvt *local_alloc(const char *data, format_t format)
 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, fmt = 0;
+       int fmt = 0;
+       int generated_seqno = ast_atomic_fetchadd_int((int *)&name_sequence, +1);
        const char *t;
        int ama;
 
@@ -1168,8 +1171,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);
                }