diff options
author | Richard Mudgett <rmudgett@digium.com> | 2012-09-20 17:22:41 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2012-09-20 17:22:41 +0000 |
commit | da5944fc56482949ba04aad6ab33275b5031f75d (patch) | |
tree | 16b3832a037e0d62af11751c418fef1afabd7fc4 /apps/app_directed_pickup.c | |
parent | afa6b8f320bfe73d8d6a1478c32ef7790e7c950f (diff) |
Named call pickup groups. Fixes, missing functionality, and improvements.
* ASTERISK-20383
Missing named call pickup group features:
CHANNEL(callgroup) - Need CHANNEL(namedcallgroup)
CHANNEL(pickupgroup) - Need CHANNEL(namedpickupgroup)
Pickup() - Needs to also select from named pickup groups.
* ASTERISK-20384
Using the pickupexten, the pickup channel selection could fail even though
there was a call it could have picked up. In a call pickup race when
there are multiple calls to pickup and two extensions try to pickup a
call, it is conceivable that the loser will not pick up any call even
though it could have picked up the next oldest matching call.
Regression because of the named call pickup group feature.
* See ASTERISK-20386 for the implementation improvements. These are the
changes in channel.c and channel.h.
* Fixed some locking issues in CHANNEL().
(closes issue ASTERISK-20383)
Reported by: rmudgett
(closes issue ASTERISK-20384)
Reported by: rmudgett
(closes issue ASTERISK-20386)
Reported by: rmudgett
Tested by: rmudgett
Review: https://reviewboard.asterisk.org/r/2112/
........
Merged revisions 373220 from http://svn.asterisk.org/svn/asterisk/branches/11
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@373221 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps/app_directed_pickup.c')
-rw-r--r-- | apps/app_directed_pickup.c | 18 |
1 files changed, 1 insertions, 17 deletions
diff --git a/apps/app_directed_pickup.c b/apps/app_directed_pickup.c index 9ae3fc842..6fcde0748 100644 --- a/apps/app_directed_pickup.c +++ b/apps/app_directed_pickup.c @@ -252,29 +252,13 @@ static int pickup_by_mark(struct ast_channel *chan, const char *mark) return res; } -static int find_channel_by_group(void *obj, void *arg, void *data, int flags) -{ - struct ast_channel *target = obj;/*!< Potential pickup target */ - struct ast_channel *chan = data;/*!< Channel wanting to pickup call */ - - ast_channel_lock(target); - if (chan != target && (ast_channel_pickupgroup(chan) & ast_channel_callgroup(target)) - && ast_can_pickup(target)) { - /* Return with the channel still locked on purpose */ - return CMP_MATCH | CMP_STOP; - } - ast_channel_unlock(target); - - return 0; -} - static int pickup_by_group(struct ast_channel *chan) { struct ast_channel *target;/*!< Potential pickup target */ int res = -1; /* The found channel is already locked. */ - target = ast_channel_callback(find_channel_by_group, NULL, chan, 0); + target = ast_pickup_find_by_group(chan); if (target) { ast_log(LOG_NOTICE, "pickup %s attempt by %s\n", ast_channel_name(target), ast_channel_name(chan)); res = ast_do_pickup(chan, target); |