@ -3064,6 +3064,21 @@ static void __sip_destroy(struct sip_pvt *p, int lockowner)
ast_log ( LOG_DEBUG , " This call did not properly clean up call limits. Call ID %s \n " , p - > callid ) ;
}
/* Unlink us from the owner if we have one */
if ( p - > owner ) {
if ( lockowner )
ast_channel_lock ( p - > owner ) ;
if ( option_debug )
ast_log ( LOG_DEBUG , " Detaching from %s \n " , p - > owner - > name ) ;
p - > owner - > tech_pvt = NULL ;
/* Make sure that the channel knows its backend is going away */
p - > owner - > _softhangup | = AST_SOFTHANGUP_DEV ;
if ( lockowner )
ast_channel_unlock ( p - > owner ) ;
/* Give the channel a chance to react before deallocation */
usleep ( 1 ) ;
}
/* Remove link from peer to subscription of MWI */
if ( p - > relatedpeer & & p - > relatedpeer - > mwipvt )
p - > relatedpeer - > mwipvt = NULL ;
@ -3080,10 +3095,17 @@ static void __sip_destroy(struct sip_pvt *p, int lockowner)
AST_SCHED_DEL ( sched , p - > waitid ) ;
AST_SCHED_DEL ( sched , p - > autokillid ) ;
if ( p - > rtp )
/* We absolutely cannot destroy the rtp struct while a bridge is active or we WILL crash */
if ( p - > rtp ) {
while ( ast_rtp_get_bridged ( p - > rtp ) )
usleep ( 1 ) ;
ast_rtp_destroy ( p - > rtp ) ;
if ( p - > vrtp )
}
if ( p - > vrtp ) {
while ( ast_rtp_get_bridged ( p - > vrtp ) )
usleep ( 1 ) ;
ast_rtp_destroy ( p - > vrtp ) ;
}
if ( p - > udptl )
ast_udptl_destroy ( p - > udptl ) ;
if ( p - > refer )
@ -3098,16 +3120,6 @@ static void __sip_destroy(struct sip_pvt *p, int lockowner)
ASTOBJ_UNREF ( p - > registry , sip_registry_destroy ) ;
}
/* Unlink us from the owner if we have one */
if ( p - > owner ) {
if ( lockowner )
ast_channel_lock ( p - > owner ) ;
if ( option_debug )
ast_log ( LOG_DEBUG , " Detaching from %s \n " , p - > owner - > name ) ;
p - > owner - > tech_pvt = NULL ;
if ( lockowner )
ast_channel_unlock ( p - > owner ) ;
}
/* Clear history */
if ( p - > history ) {
struct sip_history * hist ;