@ -40,6 +40,8 @@
/*** MODULEINFO
/*** MODULEINFO
< depend > pjproject < / depend >
< depend > pjproject < / depend >
< depend > res_sorcery_config < / depend >
< depend > res_sorcery_config < / depend >
< depend > res_sorcery_memory < / depend >
< depend > res_sorcery_astdb < / depend >
< support_level > core < / support_level >
< support_level > core < / support_level >
* * */
* * */
@ -1811,7 +1813,7 @@ static pjsip_endpoint *ast_pjsip_endpoint;
static struct ast_threadpool * sip_threadpool ;
static struct ast_threadpool * sip_threadpool ;
static int register_service ( void * data )
static int register_service _noref ( void * data )
{
{
pjsip_module * * module = data ;
pjsip_module * * module = data ;
if ( ! ast_pjsip_endpoint ) {
if ( ! ast_pjsip_endpoint ) {
@ -1823,19 +1825,33 @@ static int register_service(void *data)
return - 1 ;
return - 1 ;
}
}
ast_debug ( 1 , " Registered SIP service %.*s (%p) \n " , ( int ) pj_strlen ( & ( * module ) - > name ) , pj_strbuf ( & ( * module ) - > name ) , * module ) ;
ast_debug ( 1 , " Registered SIP service %.*s (%p) \n " , ( int ) pj_strlen ( & ( * module ) - > name ) , pj_strbuf ( & ( * module ) - > name ) , * module ) ;
ast_module_ref ( ast_module_info - > self ) ;
return 0 ;
return 0 ;
}
}
static int register_service ( void * data )
{
int res ;
if ( ! ( res = register_service_noref ( data ) ) ) {
ast_module_ref ( ast_module_info - > self ) ;
}
return res ;
}
int internal_sip_register_service ( pjsip_module * module )
{
return ast_sip_push_task_synchronous ( NULL , register_service_noref , & module ) ;
}
int ast_sip_register_service ( pjsip_module * module )
int ast_sip_register_service ( pjsip_module * module )
{
{
return ast_sip_push_task_synchronous ( NULL , register_service , & module ) ;
return ast_sip_push_task_synchronous ( NULL , register_service , & module ) ;
}
}
static int unregister_service ( void * data )
static int unregister_service _noref ( void * data )
{
{
pjsip_module * * module = data ;
pjsip_module * * module = data ;
ast_module_unref ( ast_module_info - > self ) ;
if ( ! ast_pjsip_endpoint ) {
if ( ! ast_pjsip_endpoint ) {
return - 1 ;
return - 1 ;
}
}
@ -1844,6 +1860,22 @@ static int unregister_service(void *data)
return 0 ;
return 0 ;
}
}
static int unregister_service ( void * data )
{
int res ;
if ( ! ( res = unregister_service_noref ( data ) ) ) {
ast_module_unref ( ast_module_info - > self ) ;
}
return res ;
}
int internal_sip_unregister_service ( pjsip_module * module )
{
return ast_sip_push_task_synchronous ( NULL , unregister_service_noref , & module ) ;
}
void ast_sip_unregister_service ( pjsip_module * module )
void ast_sip_unregister_service ( pjsip_module * module )
{
{
ast_sip_push_task_synchronous ( NULL , unregister_service , & module ) ;
ast_sip_push_task_synchronous ( NULL , unregister_service , & module ) ;
@ -1990,26 +2022,38 @@ struct ast_sip_endpoint *ast_sip_identify_endpoint(pjsip_rx_data *rdata)
AST_RWLIST_HEAD_STATIC ( endpoint_formatters , ast_sip_endpoint_formatter ) ;
AST_RWLIST_HEAD_STATIC ( endpoint_formatters , ast_sip_endpoint_formatter ) ;
int ast _sip_register_endpoint_formatter( struct ast_sip_endpoint_formatter * obj )
void internal _sip_register_endpoint_formatter( struct ast_sip_endpoint_formatter * obj )
{
{
SCOPED_LOCK ( lock , & endpoint_formatters , AST_RWLIST_WRLOCK , AST_RWLIST_UNLOCK ) ;
SCOPED_LOCK ( lock , & endpoint_formatters , AST_RWLIST_WRLOCK , AST_RWLIST_UNLOCK ) ;
AST_RWLIST_INSERT_TAIL ( & endpoint_formatters , obj , next ) ;
AST_RWLIST_INSERT_TAIL ( & endpoint_formatters , obj , next ) ;
}
int ast_sip_register_endpoint_formatter ( struct ast_sip_endpoint_formatter * obj )
{
internal_sip_register_endpoint_formatter ( obj ) ;
ast_module_ref ( ast_module_info - > self ) ;
ast_module_ref ( ast_module_info - > self ) ;
return 0 ;
return 0 ;
}
}
void ast_sip_unregister_endpoint_formatter ( struct ast_sip_endpoint_formatter * obj )
int internal _sip_unregister_endpoint_formatter( struct ast_sip_endpoint_formatter * obj )
{
{
struct ast_sip_endpoint_formatter * i ;
struct ast_sip_endpoint_formatter * i ;
SCOPED_LOCK ( lock , & endpoint_formatters , AST_RWLIST_WRLOCK , AST_RWLIST_UNLOCK ) ;
SCOPED_LOCK ( lock , & endpoint_formatters , AST_RWLIST_WRLOCK , AST_RWLIST_UNLOCK ) ;
AST_RWLIST_TRAVERSE_SAFE_BEGIN ( & endpoint_formatters , i , next ) {
AST_RWLIST_TRAVERSE_SAFE_BEGIN ( & endpoint_formatters , i , next ) {
if ( i = = obj ) {
if ( i = = obj ) {
AST_RWLIST_REMOVE_CURRENT ( next ) ;
AST_RWLIST_REMOVE_CURRENT ( next ) ;
ast_module_unref ( ast_module_info - > self ) ;
break ;
break ;
}
}
}
}
AST_RWLIST_TRAVERSE_SAFE_END ;
AST_RWLIST_TRAVERSE_SAFE_END ;
return i = = obj ? 0 : - 1 ;
}
void ast_sip_unregister_endpoint_formatter ( struct ast_sip_endpoint_formatter * obj )
{
if ( ! internal_sip_unregister_endpoint_formatter ( obj ) ) {
ast_module_unref ( ast_module_info - > self ) ;
}
}
}
int ast_sip_format_endpoint_ami ( struct ast_sip_endpoint * endpoint ,
int ast_sip_format_endpoint_ami ( struct ast_sip_endpoint * endpoint ,
@ -3234,7 +3278,7 @@ static int load_module(void)
return AST_MODULE_LOAD_DECLINE ;
return AST_MODULE_LOAD_DECLINE ;
}
}
if ( ast _sip_register_service( & supplement_module ) ) {
if ( internal _sip_register_service( & supplement_module ) ) {
ast_log ( LOG_ERROR , " Failed to initialize supplement hooks. Aborting load \n " ) ;
ast_log ( LOG_ERROR , " Failed to initialize supplement hooks. Aborting load \n " ) ;
ast_sip_destroy_distributor ( ) ;
ast_sip_destroy_distributor ( ) ;
ast_res_pjsip_destroy_configuration ( ) ;
ast_res_pjsip_destroy_configuration ( ) ;
@ -3249,9 +3293,9 @@ static int load_module(void)
return AST_MODULE_LOAD_DECLINE ;
return AST_MODULE_LOAD_DECLINE ;
}
}
if ( ast _sip_initialize_outbound_authentication( ) ) {
if ( internal _sip_initialize_outbound_authentication( ) ) {
ast_log ( LOG_ERROR , " Failed to initialize outbound authentication. Aborting load \n " ) ;
ast_log ( LOG_ERROR , " Failed to initialize outbound authentication. Aborting load \n " ) ;
ast _sip_unregister_service( & supplement_module ) ;
internal _sip_unregister_service( & supplement_module ) ;
ast_sip_destroy_distributor ( ) ;
ast_sip_destroy_distributor ( ) ;
ast_res_pjsip_destroy_configuration ( ) ;
ast_res_pjsip_destroy_configuration ( ) ;
ast_sip_destroy_global_headers ( ) ;
ast_sip_destroy_global_headers ( ) ;
@ -3267,8 +3311,6 @@ static int load_module(void)
ast_res_pjsip_init_options_handling ( 0 ) ;
ast_res_pjsip_init_options_handling ( 0 ) ;
ast_module_ref ( ast_module_info - > self ) ;
return AST_MODULE_LOAD_SUCCESS ;
return AST_MODULE_LOAD_SUCCESS ;
}
}
@ -3282,9 +3324,41 @@ static int reload_module(void)
return 0 ;
return 0 ;
}
}
static int unload_pjsip ( void * data )
{
if ( memory_pool ) {
pj_pool_release ( memory_pool ) ;
memory_pool = NULL ;
}
if ( ast_pjsip_endpoint ) {
pjsip_endpt_destroy ( ast_pjsip_endpoint ) ;
ast_pjsip_endpoint = NULL ;
}
pj_caching_pool_destroy ( & caching_pool ) ;
pj_shutdown ( ) ;
return 0 ;
}
static int unload_module ( void )
static int unload_module ( void )
{
{
/* This will never get called as this module can't be unloaded */
ast_res_pjsip_cleanup_options_handling ( ) ;
internal_sip_destroy_outbound_authentication ( ) ;
ast_sip_destroy_distributor ( ) ;
ast_res_pjsip_destroy_configuration ( ) ;
ast_sip_destroy_system ( ) ;
ast_sip_destroy_global_headers ( ) ;
internal_sip_unregister_service ( & supplement_module ) ;
if ( monitor_thread ) {
stop_monitor_thread ( ) ;
}
/* The thread this is called from cannot call PJSIP/PJLIB functions,
* so we have to push the work to the threadpool to handle
*/
ast_sip_push_task_synchronous ( NULL , unload_pjsip , NULL ) ;
ast_threadpool_shutdown ( sip_threadpool ) ;
ast_sip_destroy_cli ( ) ;
return 0 ;
return 0 ;
}
}