mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 18:55:19 +00:00 
			
		
		
		
	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 ........ Merged revisions 372916 from http://svn.asterisk.org/svn/asterisk/branches/10 ........ Merged revisions 372917 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@372918 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -85,6 +85,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, | ||||
| @@ -1195,8 +1197,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_callid *callid) | ||||
| { | ||||
| 	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; | ||||
|  | ||||
| @@ -1214,8 +1216,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, ast_channel_linkedid(tmp), 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, ast_channel_linkedid(tmp), ama, "Local/%s@%s-%08x;2", p->exten, p->context, generated_seqno))) { | ||||
| 		if (tmp) { | ||||
| 			tmp = ast_channel_release(tmp); | ||||
| 		} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user