Review Board 1.7.16


Fix directed group pickup feature code *8 with pickupsounds enabled , deadlock and segfault, affects 1.8.0 and trunk

Review Request #1185 - Created April 17, 2011 and submitted

Alec Davis
trunk
18654
Reviewers
asterisk-dev
rmudgett
Asterisk
Since 1.8, the new pickupsound and pickupfailsound in features.conf cause many issues.

1). chan_sip:handle_request_invite() shouldn't be playing out the fail/success audio, as it has 'netlock' locked.
2). dialplan applications for directed_pickups shouldn't beep.
3). feature code for directed pickup should beep on success/failure if configured.

Moved app_directed:pickup_do() to features:ast_do_pickup().

Functions below, all now use the new ast_do_pickup()
app_directed_pickup.c:
   pickup_by_channel()
   pickup_by_exten()
   pickup_by_mark()
   pickup_by_part()
features.c:
   ast_pickup_call()

Created a sip_pickup() thread to handle the pickup and playout the audio, spawned from handle_request_invite.
pickup using *8 feature code, with pickup sounds enabled/disabled

exten => 71,1,Pickup()           ; any ringing extension in same pickupgroup 
exten => 72,1,Pickup(85@phones)  ; dahdi extension
exten => 73,1,Pickup(823@phones) ; sip extension

Changes between revision 12 and 13

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

  1. trunk/main/features.c: Loading...
trunk/main/features.c
Diff Revision 12 Diff Revision 13
This file contains only whitespace changes.
[20] 5725 lines
[+20] [+] int ast_pickup_call(struct ast_channel *chan)
5726
	if ((target = ast_channel_callback(find_channel_by_group, NULL, chan, 0))) {
5726
	if ((target = ast_channel_callback(find_channel_by_group, NULL, chan, 0))) {
5727
		ast_channel_lock(target);
5727
		ast_channel_lock(target);
5728

    
   
5728

   
5729
		/* We now have the target locked, but is the target still available to pickup */
5729
		/* We now have the target locked, but is the target still available to pickup */
5730
		if (!target->masq && !ast_test_flag(target, AST_FLAG_ZOMBIE) &&
5730
		if (!target->masq && !ast_test_flag(target, AST_FLAG_ZOMBIE) &&
5731
			((target->_state == AST_STATE_RINGING) || (target->_state == AST_STATE_RING))) { 
5731
			((target->_state == AST_STATE_RINGING) || (target->_state == AST_STATE_RING))) {
5732

    
   
5732

   
5733
			ast_log(LOG_NOTICE, "pickup %s attempt by %s\n", target->name, chan->name);
5733
			ast_log(LOG_NOTICE, "pickup %s attempt by %s\n", target->name, chan->name);
5734
			res = ast_do_pickup(chan, target);
5734
			res = ast_do_pickup(chan, target);
5735

    
   
5735

   
5736
			/* A 2nd pickup attempt will bail out when we unlock the target */
5736
			/* A 2nd pickup attempt will bail out when we unlock the target */
[+20] [20] 426 lines
  1. trunk/main/features.c: Loading...

https://reviewboard.asterisk.org/ runs on a server provided by Digium, Inc. and uses bandwidth donated to the open source Asterisk community by API Digital Communications in Huntsville, AL USA.
Please report problems with this site to asteriskteam@digium.com.