@ -608,7 +608,7 @@ static int sorcery_generic_observer_remove(void *obj, void *arg, int flags)
 
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						const  struct  sorcery_global_observer  * observer  =  obj ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						return  ( observer - > callbacks  = =  arg )  ?  CMP_MATCH  |  CMP_STOP :  0 ; 
 
			
		
	
		
			
				
						return  ( observer - > callbacks  = =  arg )  ?  CMP_MATCH :  0 ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					int  ast_sorcery_global_observer_add ( const  struct  ast_sorcery_global_observer  * callbacks )  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -1352,8 +1352,10 @@ static void sorcery_observer_invocation_destroy(void *obj)
 
			
		
	
		
			
				
					/*! \brief Allocator function for observer invocation */  
			
		
	
		
			
				
					static  struct  sorcery_observer_invocation  * sorcery_observer_invocation_alloc ( struct  ast_sorcery_object_type  * object_type ,  void  * object )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						struct  sorcery_observer_invocation  * invocation  =  ao2_alloc ( sizeof ( * invocation ) ,  sorcery_observer_invocation_destroy )  ; 
 
			
		
	
		
			
				
						struct  sorcery_observer_invocation  * invocation ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						invocation  =  ao2_alloc_options ( sizeof ( * invocation ) , 
 
			
		
	
		
			
				
							sorcery_observer_invocation_destroy ,  AO2_ALLOC_OPT_LOCK_NOLOCK ) ; 
 
			
		
	
		
			
				
						if  ( ! invocation )  { 
 
			
		
	
		
			
				
							return  NULL ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -1978,11 +1980,8 @@ struct ao2_container *ast_sorcery_retrieve_by_regex(const struct ast_sorcery *so
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					/*! \brief Internal function which returns if the wizard has created the object */  
			
		
	
		
			
				
					static  int  sorcery_wizard_create ( void  * obj ,  void  * arg ,  int  flag )  
			
		
	
		
			
				
					static  int  sorcery_wizard_create ( const  struct  ast_sorcery_object_wizard  * object_wizard ,  const  struct  sorcery_details  * detail )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						const  struct  ast_sorcery_object_wizard  * object_wizard  =  obj ; 
 
			
		
	
		
			
				
						const  struct  sorcery_details  * details  =  arg ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						if  ( ! object_wizard - > wizard - > callbacks . create )  { 
 
			
		
	
		
			
				
							ast_debug ( 5 ,  " Sorcery wizard '%s' does not support creation \n " ,  object_wizard - > wizard - > callbacks . name ) ; 
 
			
		
	
		
			
				
							return  0 ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -2037,7 +2036,8 @@ int ast_sorcery_create(const struct ast_sorcery *sorcery, void *object)
 
			
		
	
		
			
				
						AST_VECTOR_RW_RDLOCK ( & object_type - > wizards ) ; 
 
			
		
	
		
			
				
						for  ( i  =  0 ;  i  <  AST_VECTOR_SIZE ( & object_type - > wizards ) ;  i + + )  { 
 
			
		
	
		
			
				
							found_wizard  =  AST_VECTOR_GET ( & object_type - > wizards ,  i ) ; 
 
			
		
	
		
			
				
							if  ( ! found_wizard - > caching  & &  sorcery_wizard_create ( found_wizard ,  & sdetails ,  0 )  = =  CMP_MATCH )  { 
 
			
		
	
		
			
				
							if  ( ! found_wizard - > caching 
 
			
		
	
		
			
				
								& &  sorcery_wizard_create ( found_wizard ,  & sdetails )  = =  CMP_MATCH )  { 
 
			
		
	
		
			
				
								object_wizard  =  found_wizard ; 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
						} 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -2046,14 +2046,14 @@ int ast_sorcery_create(const struct ast_sorcery *sorcery, void *object)
 
			
		
	
		
			
				
							for  ( i  =  0 ;  i  <  AST_VECTOR_SIZE ( & object_type - > wizards ) ;  i + + )  { 
 
			
		
	
		
			
				
								found_wizard  =  AST_VECTOR_GET ( & object_type - > wizards ,  i ) ; 
 
			
		
	
		
			
				
								if  ( found_wizard - > caching )  { 
 
			
		
	
		
			
				
									sorcery_wizard_create ( found_wizard ,  & sdetails , 0  ); 
 
			
		
	
		
			
				
									sorcery_wizard_create ( found_wizard ,  & sdetails ; 
 
			
		
	
		
			
				
								} 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( ao2_container_count ( object_type - > observers ) )  { 
 
			
		
	
		
			
				
								struct  sorcery_observer_invocation  * invocation  =  sorcery_observer_invocation_alloc ( 
 
			
		
	
		
			
				
									object_type ,  object ) ; 
 
			
		
	
		
			
				
								struct  sorcery_observer_invocation  * invocation ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								invocation  =  sorcery_observer_invocation_alloc ( object_type ,  object ) ; 
 
			
		
	
		
			
				
								if  ( invocation 
 
			
		
	
		
			
				
									& &  ast_taskprocessor_push ( object_type - > serializer ,  sorcery_observers_notify_create , 
 
			
		
	
		
			
				
										invocation ) )  { 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -2091,11 +2091,8 @@ static int sorcery_observers_notify_update(void *data)
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					/*! \brief Internal function which returns if a wizard has updated the object */  
			
		
	
		
			
				
					static  int  sorcery_wizard_update ( void  * obj ,  void  * arg ,  int  flag )  
			
		
	
		
			
				
					static  int  sorcery_wizard_update ( const  struct  ast_sorcery_object_wizard  * object_wizard ,  const  struct  sorcery_details  * detail )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						const  struct  ast_sorcery_object_wizard  * object_wizard  =  obj ; 
 
			
		
	
		
			
				
						const  struct  sorcery_details  * details  =  arg ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						if  ( ! object_wizard - > wizard - > callbacks . update )  { 
 
			
		
	
		
			
				
							ast_debug ( 5 ,  " Sorcery wizard '%s' does not support updating \n " ,  object_wizard - > wizard - > callbacks . name ) ; 
 
			
		
	
		
			
				
							return  0 ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -2127,7 +2124,8 @@ int ast_sorcery_update(const struct ast_sorcery *sorcery, void *object)
 
			
		
	
		
			
				
						AST_VECTOR_RW_RDLOCK ( & object_type - > wizards ) ; 
 
			
		
	
		
			
				
						for  ( i  =  0 ;  i  <  AST_VECTOR_SIZE ( & object_type - > wizards ) ;  i + + )  { 
 
			
		
	
		
			
				
							found_wizard  =  AST_VECTOR_GET ( & object_type - > wizards ,  i ) ; 
 
			
		
	
		
			
				
							if  ( ! found_wizard - > caching  & &  sorcery_wizard_update ( found_wizard ,  & sdetails ,  0 )  = =  CMP_MATCH )  { 
 
			
		
	
		
			
				
							if  ( ! found_wizard - > caching 
 
			
		
	
		
			
				
								& &  sorcery_wizard_update ( found_wizard ,  & sdetails )  = =  CMP_MATCH )  { 
 
			
		
	
		
			
				
								object_wizard  =  found_wizard ; 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
						} 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -2136,14 +2134,14 @@ int ast_sorcery_update(const struct ast_sorcery *sorcery, void *object)
 
			
		
	
		
			
				
							for  ( i  =  0 ;  i  <  AST_VECTOR_SIZE ( & object_type - > wizards ) ;  i + + )  { 
 
			
		
	
		
			
				
								found_wizard  =  AST_VECTOR_GET ( & object_type - > wizards ,  i ) ; 
 
			
		
	
		
			
				
								if  ( found_wizard - > caching )  { 
 
			
		
	
		
			
				
									sorcery_wizard_update ( found_wizard ,  & sdetails , 0  ); 
 
			
		
	
		
			
				
									sorcery_wizard_update ( found_wizard ,  & sdetails ; 
 
			
		
	
		
			
				
								} 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( ao2_container_count ( object_type - > observers ) )  { 
 
			
		
	
		
			
				
								struct  sorcery_observer_invocation  * invocation  =  sorcery_observer_invocation_alloc ( 
 
			
		
	
		
			
				
									object_type ,  object ) ; 
 
			
		
	
		
			
				
								struct  sorcery_observer_invocation  * invocation ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								invocation  =  sorcery_observer_invocation_alloc ( object_type ,  object ) ; 
 
			
		
	
		
			
				
								if  ( invocation 
 
			
		
	
		
			
				
									& &  ast_taskprocessor_push ( object_type - > serializer ,  sorcery_observers_notify_update , 
 
			
		
	
		
			
				
										invocation ) )  { 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -2181,11 +2179,8 @@ static int sorcery_observers_notify_delete(void *data)
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					/*! \brief Internal function which returns if a wizard has deleted the object */  
			
		
	
		
			
				
					static  int  sorcery_wizard_delete ( void  * obj ,  void  * arg ,  int  flag )  
			
		
	
		
			
				
					static  int  sorcery_wizard_delete ( const  struct  ast_sorcery_object_wizard  * object_wizard ,  const  struct  sorcery_details  * detail )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						const  struct  ast_sorcery_object_wizard  * object_wizard  =  obj ; 
 
			
		
	
		
			
				
						const  struct  sorcery_details  * details  =  arg ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						if  ( ! object_wizard - > wizard - > callbacks . delete )  { 
 
			
		
	
		
			
				
							ast_debug ( 5 ,  " Sorcery wizard '%s' does not support deletion \n " ,  object_wizard - > wizard - > callbacks . name ) ; 
 
			
		
	
		
			
				
							return  0 ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -2217,7 +2212,8 @@ int ast_sorcery_delete(const struct ast_sorcery *sorcery, void *object)
 
			
		
	
		
			
				
						AST_VECTOR_RW_RDLOCK ( & object_type - > wizards ) ; 
 
			
		
	
		
			
				
						for  ( i  =  0 ;  i  <  AST_VECTOR_SIZE ( & object_type - > wizards ) ;  i + + )  { 
 
			
		
	
		
			
				
							found_wizard  =  AST_VECTOR_GET ( & object_type - > wizards ,  i ) ; 
 
			
		
	
		
			
				
							if  ( ! found_wizard - > caching  & &  sorcery_wizard_delete ( found_wizard ,  & sdetails ,  0 )  = =  CMP_MATCH )  { 
 
			
		
	
		
			
				
							if  ( ! found_wizard - > caching 
 
			
		
	
		
			
				
								& &  sorcery_wizard_delete ( found_wizard ,  & sdetails )  = =  CMP_MATCH )  { 
 
			
		
	
		
			
				
								object_wizard  =  found_wizard ; 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
						} 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -2226,14 +2222,14 @@ int ast_sorcery_delete(const struct ast_sorcery *sorcery, void *object)
 
			
		
	
		
			
				
							for  ( i  =  0 ;  i  <  AST_VECTOR_SIZE ( & object_type - > wizards ) ;  i + + )  { 
 
			
		
	
		
			
				
								found_wizard  =  AST_VECTOR_GET ( & object_type - > wizards ,  i ) ; 
 
			
		
	
		
			
				
								if  ( found_wizard - > caching )  { 
 
			
		
	
		
			
				
									sorcery_wizard_delete ( found_wizard ,  & sdetails , 0  ); 
 
			
		
	
		
			
				
									sorcery_wizard_delete ( found_wizard ,  & sdetails ; 
 
			
		
	
		
			
				
								} 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( ao2_container_count ( object_type - > observers ) )  { 
 
			
		
	
		
			
				
								struct  sorcery_observer_invocation  * invocation  =  sorcery_observer_invocation_alloc ( 
 
			
		
	
		
			
				
									object_type ,  object ) ; 
 
			
		
	
		
			
				
								struct  sorcery_observer_invocation  * invocation ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								invocation  =  sorcery_observer_invocation_alloc ( object_type ,  object ) ; 
 
			
		
	
		
			
				
								if  ( invocation 
 
			
		
	
		
			
				
									& &  ast_taskprocessor_push ( object_type - > serializer ,  sorcery_observers_notify_delete , 
 
			
		
	
		
			
				
										invocation ) )  { 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -2377,7 +2373,7 @@ static int sorcery_observer_remove(void *obj, void *arg, int flags)
 
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						const  struct  ast_sorcery_object_type_observer  * observer  =  obj ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						return  ( observer - > callbacks  = =  arg )  ?  CMP_MATCH  |  CMP_STOP :  0 ; 
 
			
		
	
		
			
				
						return  ( observer - > callbacks  = =  arg )  ?  CMP_MATCH :  0 ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  ast_sorcery_observer_remove ( const  struct  ast_sorcery  * sorcery ,  const  char  * type ,  const  struct  ast_sorcery_observer  * callbacks )  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -2399,18 +2395,20 @@ void ast_sorcery_observer_remove(const struct ast_sorcery *sorcery, const char *
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					int  ast_sorcery_object_id_sort ( const  void  * obj ,  const  void  * arg ,  int  flags )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						const  void  * object_left  =  obj ; 
 
			
		
	
		
			
				
						const  void  * object_right  =  arg ; 
 
			
		
	
		
			
				
						const  char  * right_key  =  arg ; 
 
			
		
	
		
			
				
						int  cmp ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						switch  ( flags  &  OBJ_SEARCH_MASK )  { 
 
			
		
	
		
			
				
						case  OBJ_SEARCH_OBJECT : 
 
			
		
	
		
			
				
							right_key  =  ast_sorcery_object_get_id ( arg ) ; 
 
			
		
	
		
			
				
							right_key  =  ast_sorcery_object_get_id ( object_right ) ; 
 
			
		
	
		
			
				
							/* Fall through */ 
 
			
		
	
		
			
				
						case  OBJ_SEARCH_KEY : 
 
			
		
	
		
			
				
							cmp  =  strcmp ( ast_sorcery_object_get_id ( obj ) ,  right_key ) ; 
 
			
		
	
		
			
				
							cmp  =  strcmp ( ast_sorcery_object_get_id ( obj ect_left ) ,  right_key ) ; 
 
			
		
	
		
			
				
							break ; 
 
			
		
	
		
			
				
						case  OBJ_SEARCH_PARTIAL_KEY : 
 
			
		
	
		
			
				
							cmp  =  strncmp ( ast_sorcery_object_get_id ( obj ) ,  right_key ,  strlen ( right_key ) ) ; 
 
			
		
	
		
			
				
							cmp  =  strncmp ( ast_sorcery_object_get_id ( obj ect_left ) ,  right_key ,  strlen ( right_key ) ) ; 
 
			
		
	
		
			
				
							break ; 
 
			
		
	
		
			
				
						default : 
 
			
		
	
		
			
				
							cmp  =  0 ; 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -2421,37 +2419,32 @@ int ast_sorcery_object_id_sort(const void *obj, const void *arg, int flags)
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					int  ast_sorcery_object_id_compare ( void  * obj ,  void  * arg ,  int  flags )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						const  char  * right_key  =  arg ; 
 
			
		
	
		
			
				
						int  cmp  =  0 ; 
 
			
		
	
		
			
				
						int  cmp ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						cmp  =  ast_sorcery_object_id_sort ( obj ,  arg ,  flags ) ; 
 
			
		
	
		
			
				
						if  ( cmp )  { 
 
			
		
	
		
			
				
							return  0 ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
						return  CMP_MATCH ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					int  ast_sorcery_object_id_hash ( const  void  * obj ,  int  flags )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						const  char  * key ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						switch  ( flags  &  OBJ_SEARCH_MASK )  { 
 
			
		
	
		
			
				
						case  OBJ_SEARCH_OBJECT : 
 
			
		
	
		
			
				
							right_key  =  ast_sorcery_object_get_id ( arg ) ; 
 
			
		
	
		
			
				
							/* Fall through */ 
 
			
		
	
		
			
				
						case  OBJ_SEARCH_KEY : 
 
			
		
	
		
			
				
							if  ( strcmp ( ast_sorcery_object_get_id ( obj ) ,  right_key )  = =  0 )  { 
 
			
		
	
		
			
				
								cmp  =  CMP_MATCH  |  CMP_STOP ; 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
							key  =  obj ; 
 
			
		
	
		
			
				
							break ; 
 
			
		
	
		
			
				
						case  OBJ_SEARCH_PARTIAL_KEY : 
 
			
		
	
		
			
				
							if  ( strncmp ( ast_sorcery_object_get_id ( obj ) ,  right_key ,  strlen ( right_key ) )  = =  0 )  { 
 
			
		
	
		
			
				
								cmp  =  CMP_MATCH ; 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
						case  OBJ_SEARCH_OBJECT : 
 
			
		
	
		
			
				
							key  =  ast_sorcery_object_get_id ( obj ) ; 
 
			
		
	
		
			
				
							break ; 
 
			
		
	
		
			
				
						default : 
 
			
		
	
		
			
				
							cmp  =  0 ; 
 
			
		
	
		
			
				
							break ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
						return  cmp ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					int  ast_sorcery_object_id_hash ( const  void  * obj ,  int  flags )  {  
			
		
	
		
			
				
						if  ( flags  &  OBJ_SEARCH_OBJECT )  { 
 
			
		
	
		
			
				
							return  ast_str_hash ( ast_sorcery_object_get_id ( obj ) ) ; 
 
			
		
	
		
			
				
						}  else  if  ( flags  &  OBJ_SEARCH_KEY )  { 
 
			
		
	
		
			
				
							return  ast_str_hash ( obj ) ; 
 
			
		
	
		
			
				
							/* Hash can only work on something with a full key. */ 
 
			
		
	
		
			
				
							ast_assert ( 0 ) ; 
 
			
		
	
		
			
				
							return  0 ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
						return  - 1 ; 
 
			
		
	
		
			
				
						return  ast_str_hash ( key ) ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					struct  ast_sorcery_object_type  * ast_sorcery_get_object_type ( const  struct  ast_sorcery  * sorcery ,  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -2468,7 +2461,7 @@ static int is_registered_cb(void *obj, void *arg, int flags)
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						if  ( object_field - > name_regex 
 
			
		
	
		
			
				
							& &  ! regexec ( object_field - > name_regex ,  name ,  0 ,  NULL ,  0 ) )  { 
 
			
		
	
		
			
				
							rc  =  CMP_MATCH  |  CMP_STOP  ; 
 
			
		
	
		
			
				
							rc  =  CMP_MATCH ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						return  rc ;