#include "asterisk/compat.h"
Go to the source code of this file.
Data Structures | |
struct | ao2_iterator |
When we need to walk through a container, we use an ao2_iterator to keep track of the current position. The astobj2 iterator. More... | |
struct | ao2_list |
Used as return value if the flag OBJ_MULTIPLE is set. More... | |
Object Containers | |
Here start declarations of containers. | |
#define | ao2_container_alloc(arg1, arg2, arg3) _ao2_container_alloc((arg1), (arg2), (arg3)) |
#define | ao2_t_container_alloc(arg1, arg2, arg3, arg4) _ao2_container_alloc((arg1), (arg2), (arg3)) |
Allocate and initialize a container with the desired number of buckets. | |
ao2_container * | _ao2_container_alloc (const unsigned int n_buckets, ao2_hash_fn *hash_fn, ao2_callback_fn *cmp_fn) |
ao2_container * | _ao2_container_alloc_debug (const unsigned int n_buckets, ao2_hash_fn *hash_fn, ao2_callback_fn *cmp_fn, char *tag, char *file, int line, const char *funcname, int ref_debug) |
int | ao2_container_count (struct ao2_container *c) |
Returns the number of elements in a container. | |
Object Management | |
Here we have functions to manage objects.
We can use the functions below on any kind of object defined by the user. | |
#define | ao2_link(arg1, arg2) _ao2_link((arg1), (arg2)) |
#define | ao2_t_link(arg1, arg2, arg3) _ao2_link((arg1), (arg2)) |
Add an object to a container. | |
#define | ao2_t_unlink(arg1, arg2, arg3) _ao2_unlink((arg1), (arg2)) |
Remove an object from a container. | |
#define | ao2_unlink(arg1, arg2) _ao2_unlink((arg1), (arg2)) |
void * | _ao2_link (struct ao2_container *c, void *newobj) |
void * | _ao2_link_debug (struct ao2_container *c, void *new_obj, char *tag, char *file, int line, const char *funcname) |
void * | _ao2_unlink (struct ao2_container *c, void *obj) |
void * | _ao2_unlink_debug (struct ao2_container *c, void *obj, char *tag, char *file, int line, const char *funcname) |
Defines | |
#define | ao2_alloc(arg1, arg2) _ao2_alloc((arg1), (arg2)) |
#define | ao2_callback(arg1, arg2, arg3, arg4) _ao2_callback((arg1), (arg2), (arg3), (arg4)) |
#define | ao2_find(arg1, arg2, arg3) _ao2_find((arg1), (arg2), (arg3)) |
#define | ao2_iterator_next(arg1) _ao2_iterator_next((arg1)) |
#define | ao2_ref(arg1, arg2) _ao2_ref((arg1), (arg2)) |
#define | ao2_t_alloc(arg1, arg2, arg3) _ao2_alloc((arg1), (arg2)) |
Allocate and initialize an object. | |
#define | ao2_t_callback(arg1, arg2, arg3, arg4, arg5) _ao2_callback((arg1), (arg2), (arg3), (arg4)) |
ao2_callback() is a generic function that applies cb_fn() to all objects in a container, as described below. | |
#define | ao2_t_find(arg1, arg2, arg3, arg4) _ao2_find((arg1), (arg2), (arg3)) |
#define | ao2_t_iterator_next(arg1, arg2) _ao2_iterator_next((arg1)) |
#define | ao2_t_ref(arg1, arg2, arg3) _ao2_ref((arg1), (arg2)) |
Reference/unreference an object and return the old refcount. | |
Typedefs | |
typedef int( | ao2_callback_fn )(void *obj, void *arg, int flags) |
Type of a generic callback function. | |
typedef void(*) | ao2_destructor_fn (void *) |
Typedef for an object destructor. This is called just before freeing the memory for the object. It is passed a pointer to the user-defined data of the object. | |
typedef int( | ao2_hash_fn )(const void *obj, const int flags) |
Enumerations | |
enum | _cb_results { CMP_MATCH = 0x1, CMP_STOP = 0x2 } |
A callback function will return a combination of CMP_MATCH and CMP_STOP. The latter will terminate the search in a container. More... | |
enum | ao2_iterator_flags { AO2_ITERATOR_DONTLOCK = (1 << 0) } |
enum | search_flags { OBJ_UNLINK = (1 << 0), OBJ_NODATA = (1 << 1), OBJ_MULTIPLE = (1 << 2), OBJ_POINTER = (1 << 3), OBJ_CONTINUE = (1 << 4) } |
Flags passed to ao2_callback() and ao2_hash_fn() to modify its behaviour. More... | |
Functions | |
void * | _ao2_alloc (const size_t data_size, ao2_destructor_fn destructor_fn) |
void * | _ao2_alloc_debug (const size_t data_size, ao2_destructor_fn destructor_fn, char *tag, const char *file, int line, const char *funcname, int ref_debug) |
void * | _ao2_callback (struct ao2_container *c, enum search_flags flags, ao2_callback_fn *cb_fn, void *arg) |
void * | _ao2_callback_debug (struct ao2_container *c, enum search_flags flags, ao2_callback_fn *cb_fn, void *arg, char *tag, char *file, int line, const char *funcname) |
void * | _ao2_find (struct ao2_container *c, void *arg, enum search_flags flags) |
void * | _ao2_find_debug (struct ao2_container *c, void *arg, enum search_flags flags, char *tag, char *file, int line, const char *funcname) |
void * | _ao2_iterator_next (struct ao2_iterator *a) |
void * | _ao2_iterator_next_debug (struct ao2_iterator *a, char *tag, char *file, int line, const char *funcname) |
int | _ao2_lock (void *a, const char *file, const char *func, int line, const char *var) |
int | _ao2_ref (void *o, int delta) |
int | _ao2_ref_debug (void *o, int delta, char *tag, char *file, int line, const char *funcname) |
int | _ao2_trylock (void *a, const char *file, const char *func, int line, const char *var) |
int | _ao2_unlock (void *a, const char *file, const char *func, int line, const char *var) |
void | ao2_bt (void) |
void | ao2_iterator_destroy (struct ao2_iterator *i) |
Destroy a container iterator. | |
ao2_iterator | ao2_iterator_init (struct ao2_container *c, int flags) |
Create an iterator for a container. | |
int | ao2_lock (void *a) |
Lock an object. | |
void * | ao2_object_get_lockaddr (void *obj) |
Return the lock address of an object. | |
int | ao2_trylock (void *a) |
Try locking-- (don't block if fail). | |
int | ao2_unlock (void *a) |
Unlock an object. | |
Variables | |
ao2_callback_fn | ao2_match_by_addr |
a very common callback is one that matches by address. |
Definition in file astobj2.h.
#define ao2_alloc | ( | arg1, | |||
arg2 | ) | _ao2_alloc((arg1), (arg2)) |
Definition at line 415 of file astobj2.h.
Referenced by _moh_class_malloc(), add_calltoken_ignore(), alloc_event_ref(), ast_odbc_request_obj(), ast_taskprocessor_get(), ast_tcptls_client_create(), ast_tcptls_server_root(), build_callno_limits(), build_device(), build_peer(), build_profile(), build_route(), build_user(), conf_run(), create_callno_pools(), create_parkinglot(), create_queue_member(), dialgroup_write(), get_filestream(), get_lock(), inprocess_count(), new_iax(), peercnt_add(), proxy_allocate(), pthread_timer_open(), set_fn(), sip_prepare_socket(), sip_tcptls_write(), sip_threadinfo_create(), and xml_translate().
#define ao2_callback | ( | arg1, | |||
arg2, | |||||
arg3, | |||||
arg4 | ) | _ao2_callback((arg1), (arg2), (arg3), (arg4)) |
Definition at line 894 of file astobj2.h.
Referenced by ast_event_dump_cache(), ast_event_queue_and_cache(), calltoken_required(), delete_users(), do_timing(), load_config(), load_module(), reload_config(), set_config_destroy(), set_peercnt_limit(), and sip_tcp_locate().
#define ao2_container_alloc | ( | arg1, | |||
arg2, | |||||
arg3 | ) | _ao2_container_alloc((arg1), (arg2), (arg3)) |
Definition at line 712 of file astobj2.h.
Referenced by ast_event_init(), ast_features_init(), ast_tps_init(), config_text_file_save(), create_callno_pools(), dialgroup_write(), get_lock(), init_queue(), load_module(), load_objects(), and xml_translate().
#define ao2_find | ( | arg1, | |||
arg2, | |||||
arg3 | ) | _ao2_find((arg1), (arg2), (arg3)) |
Definition at line 916 of file astobj2.h.
Referenced by __find_callno(), add_calltoken_ignore(), ast_event_get_cached(), ast_taskprocessor_get(), authenticate_request(), authenticate_verify(), build_callno_limits(), build_peer(), build_user(), compare_weight(), dialgroup_read(), dialgroup_write(), find_parkinglot(), find_peer(), find_profile(), find_pvt(), find_timer(), find_user(), get_unused_callno(), handle_cli_iax2_unregister(), iax2_destroy_helper(), inprocess_count(), peercnt_add(), peercnt_modify(), peercnt_remove_by_addr(), phoneprov_callback(), reload_queues(), remove_from_queue(), sched_delay_remove(), set_fn(), update_queue(), and xml_translate().
#define ao2_iterator_next | ( | arg1 | ) | _ao2_iterator_next((arg1)) |
Definition at line 1068 of file astobj2.h.
Referenced by __iax2_show_peers(), __queues_show(), ast_odbc_request_obj(), authenticate_reply(), check_access(), cli_console_active(), cli_list_devices(), cli_tps_report(), complete_iax2_peers(), complete_iax2_unregister(), complete_queue_remove_member(), complete_sip_user(), delete_profiles(), delete_routes(), delete_users(), destroy_pvts(), dialgroup_read(), do_parking_thread(), dump_queue_members(), free_members(), get_member_status(), handle_cli_iax2_show_callno_limits(), handle_cli_iax2_show_users(), handle_cli_odbc_show(), handle_feature_show(), handle_parkedcalls(), handle_show_routes(), iax2_getpeername(), iax2_getpeertrunk(), interface_exists(), interface_exists_global(), manager_iax2_show_peer_list(), manager_parking_status(), manager_queues_status(), manager_queues_summary(), num_available_members(), poke_all_peers(), pp_each_user_exec(), prune_peers(), prune_users(), queue_function_qac(), queue_function_qac_dep(), queue_function_queuememberlist(), reload(), reload_queues(), rt_handle_member_record(), sip_show_users(), stop_streams(), tps_taskprocessor_tab_complete(), try_calling(), update_realtime_members(), and update_status().
#define ao2_link | ( | arg1, | |||
arg2 | ) | _ao2_link((arg1), (arg2)) |
Definition at line 762 of file astobj2.h.
Referenced by add_calltoken_ignore(), add_to_queue(), ast_event_dup_and_cache(), ast_odbc_request_obj(), ast_taskprocessor_get(), ast_taskprocessor_unreference(), build_callno_limits(), build_device(), build_parkinglot(), build_route(), create_callno_pools(), dialgroup_write(), get_lock(), inprocess_count(), odbc_register_class(), peercnt_add(), pthread_timer_open(), reload_queues(), replace_callno(), rt_handle_member_record(), set_config(), set_fn(), store_by_peercallno(), store_by_transfercallno(), and xml_translate().
#define ao2_ref | ( | arg1, | |||
arg2 | ) | _ao2_ref((arg1), (arg2)) |
Definition at line 455 of file astobj2.h.
Referenced by __find_callno(), __queues_show(), __sip_destroy(), __unload_module(), _sip_tcp_helper_thread(), add_calltoken_ignore(), add_to_queue(), announce_thread(), ao2_iterator_destroy(), ao2_iterator_init(), ast_closestream(), ast_event_dup_and_cache(), ast_event_get_cached(), ast_odbc_release_obj(), ast_odbc_request_obj(), ast_taskprocessor_get(), ast_taskprocessor_unreference(), ast_tcptls_client_create(), ast_tcptls_client_start(), ast_tcptls_server_root(), build_callno_limits(), calltoken_required(), cli_tps_ping(), cli_tps_report(), compare_weight(), complete_queue_remove_member(), conf_free(), conf_run(), config_text_file_save(), copy_socket_data(), create_callno_pools(), destroy_queue(), dialgroup_read(), dialgroup_write(), dialog_ref(), dialog_unref(), do_parking_thread(), dump_queue_members(), end_bridge_callback(), end_bridge_callback_data_fixup(), expire_register(), free_members(), get_lock(), get_member_penalty(), get_member_status(), group_destroy(), handle_cli_iax2_set_debug(), handle_cli_iax2_show_callno_limits(), handle_cli_odbc_show(), handle_event(), handle_feature_show(), handle_parkedcalls(), handle_tcptls_connection(), hangupcalls(), httpd_helper_thread(), iax2_destroy(), inprocess_count(), interface_exists(), interface_exists_global(), load_module(), load_objects(), manager_parking_status(), manager_queues_status(), manager_queues_summary(), new_iax(), num_available_members(), odbc_class_destructor(), odbc_obj_destructor(), parkinglot_addref(), parkinglot_unref(), parse_moved_contact(), peer_ref(), peer_unref(), peercnt_add(), peercnt_modify(), peercnt_remove_by_addr(), peercnt_remove_cb(), pthread_timer_ack(), pthread_timer_close(), pthread_timer_disable_continuous(), pthread_timer_enable_continuous(), pthread_timer_get_event(), pthread_timer_open(), pthread_timer_set_rate(), queue_function_qac(), queue_function_qac_dep(), queue_function_queuememberlist(), queue_ref(), queue_unref(), ref_proxy(), ref_pvt(), reload(), reload_queues(), remove_from_queue(), replace_callno(), rt_handle_member_record(), sched_delay_remove(), set_member_paused(), set_member_penalty(), set_peercnt_limit(), set_socket_transport(), sip_destroy_peer(), sip_prepare_socket(), sip_tcp_locate(), tps_taskprocessor_tab_complete(), try_calling(), unload_module(), unref_profile(), unref_pvt(), unref_route(), unref_user(), update_queue(), update_realtime_members(), update_status(), user_ref(), user_unref(), and xml_translate().
#define ao2_t_alloc | ( | arg1, | |||
arg2, | |||||
arg3 | ) | _ao2_alloc((arg1), (arg2)) |
Allocate and initialize an object.
data_size | The sizeof() of the user-defined structure. | |
destructor_fn | The destructor function (can be NULL) |
Definition at line 414 of file astobj2.h.
Referenced by alloc_queue(), build_peer(), sip_alloc(), and temp_peer().
#define ao2_t_callback | ( | arg1, | |||
arg2, | |||||
arg3, | |||||
arg4, | |||||
arg5 | ) | _ao2_callback((arg1), (arg2), (arg3), (arg4)) |
ao2_callback() is a generic function that applies cb_fn() to all objects in a container, as described below.
c | A pointer to the container to operate on. | |
flags | A set of flags specifying the operation to perform, partially used by the container code, but also passed to the callback.
| |
cb_fn | A function pointer, that will be called on all objects, to see if they match. This function returns CMP_MATCH if the object is matches the criteria; CMP_STOP if the traversal should immediately stop, or both (via bitwise ORing), if you find a match and want to end the traversal, and 0 if the object is not a match, but the traversal should continue. This is the function that is applied to each object traversed. It's arguments are: (void *obj, void *arg, int flags), where: obj is an object arg is the same as arg passed into ao2_callback flags is the same as flags passed into ao2_callback (flags are also used by ao2_callback). | |
arg | passed to the callback. |
Typically, ao2_callback() is used for two purposes:
This function searches through a container and performs operations on objects according on flags passed. XXX describe better The comparison is done calling the compare function set implicitly. The p pointer can be a pointer to an object or to a key, we can say this looking at flags value. If p points to an object we will search for the object pointed by this value, otherwise we serch for a key value. If the key is not uniq we only find the first matching valued. If we use the OBJ_MARK flags, we mark all the objects matching the condition.
The use of flags argument is the follow:
OBJ_UNLINK unlinks the object found OBJ_NODATA on match, do return an object Callbacks use OBJ_NODATA as a default functions such as find() do OBJ_MULTIPLE return multiple matches Default for _find() is no. to a key (not yet supported) OBJ_POINTER the pointer is an object pointer
In case we return a list, the callee must take care to destroy that list when no longer used.
Definition at line 893 of file astobj2.h.
Referenced by ast_moh_destroy(), do_monitor(), find_call(), find_peer(), get_mohbydigit(), load_moh_classes(), sip_do_reload(), sip_prune_realtime(), sip_show_channels(), sip_show_channelstats(), sip_show_objects(), and unload_module().
#define ao2_t_container_alloc | ( | arg1, | |||
arg2, | |||||
arg3, | |||||
arg4 | ) | _ao2_container_alloc((arg1), (arg2), (arg3)) |
Allocate and initialize a container with the desired number of buckets.
We allocate space for a struct astobj_container, struct container and the buckets[] array.
n_buckets | Number of buckets for hash | |
hash_fn | Pointer to a function computing a hash value. | |
cmp_fn | Pointer to a function comparating key-value with a string. (can be NULL) |
Definition at line 711 of file astobj2.h.
Referenced by load_module().
#define ao2_t_find | ( | arg1, | |||
arg2, | |||||
arg3, | |||||
arg4 | ) | _ao2_find((arg1), (arg2), (arg3)) |
ao2_find() is a short hand for ao2_callback(c, flags, c->cmp_fn, arg) XXX possibly change order of arguments ?
Definition at line 915 of file astobj2.h.
Referenced by _sip_tcp_helper_thread(), build_peer(), find_call(), find_peer(), find_queue_by_name_rt(), get_member_penalty(), get_sip_pvt_byid_locked(), load_realtime_queue(), queue_function_queuememberlist(), queue_function_queuewaitingcount(), queue_function_var(), reload_queue_members(), reload_queues(), remove_from_queue(), sip_prune_realtime(), and sip_tcptls_write().
#define ao2_t_iterator_next | ( | arg1, | |||
arg2 | ) | _ao2_iterator_next((arg1)) |
Definition at line 1067 of file astobj2.h.
Referenced by __queues_show(), _sip_show_peers(), compare_weight(), complete_queue(), complete_queue_remove_member(), complete_sip_peer(), complete_sip_registered_peer(), complete_sipch(), handle_cli_moh_show_classes(), handle_cli_moh_show_files(), handle_request_subscribe(), interface_exists_global(), manager_queues_status(), manager_queues_summary(), reload_queues(), set_member_paused(), set_member_penalty(), sip_poke_all_peers(), sip_prune_realtime(), sip_show_channel(), sip_show_history(), sip_show_inuse(), sip_show_tcp(), unload_module(), update_queue(), and update_status().
#define ao2_t_link | ( | arg1, | |||
arg2, | |||||
arg3 | ) | _ao2_link((arg1), (arg2)) |
Add an object to a container.
c | the container to operate on. | |
newobj | the object to be added. |
NULL | on errors | |
newobj | on success. |
This function automatically increases the reference count to account for the reference that the container now holds to the object.
Definition at line 761 of file astobj2.h.
Referenced by _moh_register(), create_addr_from_peer(), manager_sipnotify(), parse_register_contact(), register_verify(), sip_alloc(), sip_cli_notify(), sip_poke_peer(), sip_prune_realtime(), sip_request_call(), sip_send_mwi_to_peer(), and sip_threadinfo_create().
#define ao2_t_ref | ( | arg1, | |||
arg2, | |||||
arg3 | ) | _ao2_ref((arg1), (arg2)) |
Reference/unreference an object and return the old refcount.
o | A pointer to the object | |
delta | Value to add to the reference counter. |
If the refcount goes to zero, the object is destroyed.
if we know the pointer to an object, it is because we have a reference count to it, so the only case when the object can go away is when we release our reference, and it is the last one in existence.
Definition at line 454 of file astobj2.h.
Referenced by _sip_tcp_helper_thread(), alloc_queue(), check_peer_ok(), dialog_dump_func(), handle_request_do(), handle_request_subscribe(), local_attended_transfer(), peer_dump_func(), ref_peer(), sip_alloc(), sip_prepare_socket(), sip_show_channel(), sip_show_history(), sip_show_tcp(), sip_tcp_locate(), sip_tcptls_write(), sip_threadinfo_create(), sip_threadinfo_destructor(), unload_module(), and unref_peer().
#define ao2_t_unlink | ( | arg1, | |||
arg2, | |||||
arg3 | ) | _ao2_unlink((arg1), (arg2)) |
Remove an object from a container.
c | the container | |
obj | the object to unlink |
NULL,always |
If the object gets unlinked from the container, the container's reference to the object will be automatically released. (The refcount will be decremented).
Definition at line 792 of file astobj2.h.
Referenced by _sip_tcp_helper_thread(), create_addr_from_peer(), dialog_unlink_all(), expire_register(), manager_sipnotify(), parse_register_contact(), sip_cli_notify(), sip_poke_peer(), sip_prepare_socket(), sip_prune_realtime(), sip_request_call(), and sip_send_mwi_to_peer().
#define ao2_unlink | ( | arg1, | |||
arg2 | ) | _ao2_unlink((arg1), (arg2)) |
Definition at line 793 of file astobj2.h.
Referenced by ast_taskprocessor_unreference(), build_user(), delete_profiles(), delete_routes(), delete_users(), destroy_pvts(), dialgroup_write(), free_members(), get_lock(), handle_cli_iax2_prune_realtime(), parkinglot_destroy(), peercnt_remove(), prune_users(), reload(), reload_queues(), remove_by_peercallno(), remove_by_transfercallno(), remove_from_queue(), unlink_peer(), and update_realtime_members().
typedef int( ao2_callback_fn)(void *obj, void *arg, int flags) |
Type of a generic callback function.
obj | pointer to the (user-defined part) of an object. | |
arg | callback argument from ao2_callback() | |
flags | flags from ao2_callback() |
typedef void(*) ao2_destructor_fn(void *) |
typedef int( ao2_hash_fn)(const void *obj, const int flags) |
Type of a generic function to generate a hash value from an object. flags is ignored at the moment. Eventually, it will include the value of OBJ_POINTER passed to ao2_callback().
enum _cb_results |
enum ao2_iterator_flags |
Flags that can be passed to ao2_iterator_init() to modify the behavior of the iterator.
AO2_ITERATOR_DONTLOCK | Prevents ao2_iterator_next() from locking the container while retrieving the next object from it. |
Definition at line 1022 of file astobj2.h.
01022 { 01023 /*! Prevents ao2_iterator_next() from locking the container 01024 * while retrieving the next object from it. 01025 */ 01026 AO2_ITERATOR_DONTLOCK = (1 << 0), 01027 };
enum search_flags |
Flags passed to ao2_callback() and ao2_hash_fn() to modify its behaviour.
OBJ_UNLINK | Unlink the object for which the callback function returned CMP_MATCH . This is the only way to extract objects from a container. |
OBJ_NODATA | On match, don't return the object hence do not increase its refcount. |
OBJ_MULTIPLE |
Don't stop at the first match in ao2_callback()
|
OBJ_POINTER | obj is an object of the same type as the one being searched for, so use the object's hash function for optimized searching. The search function is unaffected (i.e. use the one passed as argument, or match_by_addr if none specified). |
OBJ_CONTINUE |
Continue if a match is not found in the hashed out bucket.
This flag is to be used in combination with OBJ_POINTER. This tells the ao2_callback() core to keep searching through the rest of the buckets if a match is not found in the starting bucket defined by the hash value on the argument. |
Definition at line 640 of file astobj2.h.
00640 { 00641 /*! Unlink the object for which the callback function 00642 * returned CMP_MATCH . This is the only way to extract 00643 * objects from a container. */ 00644 OBJ_UNLINK = (1 << 0), 00645 /*! On match, don't return the object hence do not increase 00646 * its refcount. */ 00647 OBJ_NODATA = (1 << 1), 00648 /*! Don't stop at the first match in ao2_callback() 00649 * \note This is not fully implemented. Using OBJ_MULTIME with OBJ_NODATA 00650 * is perfectly fine. The part that is not implemented is the case where 00651 * multiple objects should be returned by ao2_callback(). 00652 */ 00653 OBJ_MULTIPLE = (1 << 2), 00654 /*! obj is an object of the same type as the one being searched for, 00655 * so use the object's hash function for optimized searching. 00656 * The search function is unaffected (i.e. use the one passed as 00657 * argument, or match_by_addr if none specified). */ 00658 OBJ_POINTER = (1 << 3), 00659 /*! 00660 * \brief Continue if a match is not found in the hashed out bucket 00661 * 00662 * This flag is to be used in combination with OBJ_POINTER. This tells 00663 * the ao2_callback() core to keep searching through the rest of the 00664 * buckets if a match is not found in the starting bucket defined by 00665 * the hash value on the argument. 00666 */ 00667 OBJ_CONTINUE = (1 << 4), 00668 };
void* _ao2_alloc | ( | const size_t | data_size, | |
ao2_destructor_fn | destructor_fn | |||
) |
Definition at line 396 of file astobj2.c.
References __ao2_alloc().
Referenced by _ao2_container_alloc().
00397 { 00398 return __ao2_alloc(data_size, destructor_fn, __FILE__, __LINE__, __FUNCTION__); 00399 }
void* _ao2_alloc_debug | ( | const size_t | data_size, | |
ao2_destructor_fn | destructor_fn, | |||
char * | tag, | |||
const char * | file, | |||
int | line, | |||
const char * | funcname, | |||
int | ref_debug | |||
) |
Definition at line 375 of file astobj2.c.
References __ao2_alloc(), and REF_FILE.
Referenced by _ao2_container_alloc_debug(), and _moh_class_malloc().
00377 { 00378 /* allocation */ 00379 void *obj; 00380 FILE *refo = ref_debug ? fopen(REF_FILE,"a") : NULL; 00381 00382 obj = __ao2_alloc(data_size, destructor_fn, file, line, funcname); 00383 00384 if (obj == NULL) 00385 return NULL; 00386 00387 if (refo) { 00388 fprintf(refo, "%p =1 %s:%d:%s (%s)\n", obj, file, line, funcname, tag); 00389 fclose(refo); 00390 } 00391 00392 /* return a pointer to the user data */ 00393 return obj; 00394 }
void* _ao2_callback | ( | struct ao2_container * | c, | |
enum search_flags | flags, | |||
ao2_callback_fn * | cb_fn, | |||
void * | arg | |||
) |
Definition at line 751 of file astobj2.c.
References __ao2_callback().
Referenced by _ao2_find(), _ao2_unlink(), and container_destruct().
00753 { 00754 return __ao2_callback(c,flags, cb_fn, arg, NULL, NULL, 0, NULL); 00755 }
void* _ao2_callback_debug | ( | struct ao2_container * | c, | |
enum search_flags | flags, | |||
ao2_callback_fn * | cb_fn, | |||
void * | arg, | |||
char * | tag, | |||
char * | file, | |||
int | line, | |||
const char * | funcname | |||
) |
Definition at line 743 of file astobj2.c.
References __ao2_callback().
Referenced by _ao2_find_debug(), _ao2_unlink_debug(), and container_destruct_debug().
00747 { 00748 return __ao2_callback(c,flags, cb_fn, arg, tag, file, line, funcname); 00749 }
struct ao2_container* _ao2_container_alloc | ( | const unsigned int | n_buckets, | |
ao2_hash_fn * | hash_fn, | |||
ao2_callback_fn * | cmp_fn | |||
) |
Definition at line 496 of file astobj2.c.
References __ao2_container_alloc(), _ao2_alloc(), container_destruct(), and ao2_container::n_buckets.
00498 { 00499 /* XXX maybe consistency check on arguments ? */ 00500 /* compute the container size */ 00501 00502 size_t container_size = sizeof(struct ao2_container) + n_buckets * sizeof(struct bucket); 00503 struct ao2_container *c = _ao2_alloc(container_size, container_destruct); 00504 00505 return __ao2_container_alloc(c, n_buckets, hash_fn, cmp_fn); 00506 }
struct ao2_container* _ao2_container_alloc_debug | ( | const unsigned int | n_buckets, | |
ao2_hash_fn * | hash_fn, | |||
ao2_callback_fn * | cmp_fn, | |||
char * | tag, | |||
char * | file, | |||
int | line, | |||
const char * | funcname, | |||
int | ref_debug | |||
) |
Definition at line 483 of file astobj2.c.
References __ao2_container_alloc(), _ao2_alloc_debug(), container_destruct_debug(), and ao2_container::n_buckets.
00486 { 00487 /* XXX maybe consistency check on arguments ? */ 00488 /* compute the container size */ 00489 size_t container_size = sizeof(struct ao2_container) + n_buckets * sizeof(struct bucket); 00490 struct ao2_container *c = _ao2_alloc_debug(container_size, container_destruct_debug, tag, file, line, funcname, ref_debug); 00491 00492 return __ao2_container_alloc(c, n_buckets, hash_fn, cmp_fn); 00493 }
void* _ao2_find | ( | struct ao2_container * | c, | |
void * | arg, | |||
enum search_flags | flags | |||
) |
Definition at line 765 of file astobj2.c.
References _ao2_callback(), and ao2_container::cmp_fn.
Referenced by _get_mohbyname().
00766 { 00767 return _ao2_callback(c, flags, c->cmp_fn, arg); 00768 }
void* _ao2_find_debug | ( | struct ao2_container * | c, | |
void * | arg, | |||
enum search_flags | flags, | |||
char * | tag, | |||
char * | file, | |||
int | line, | |||
const char * | funcname | |||
) |
the find function just invokes the default callback with some reasonable flags.
Definition at line 760 of file astobj2.c.
References _ao2_callback_debug(), and ao2_container::cmp_fn.
Referenced by _get_mohbyname().
00761 { 00762 return _ao2_callback_debug(c, flags, c->cmp_fn, arg, tag, file, line, funcname); 00763 }
void* _ao2_iterator_next | ( | struct ao2_iterator * | a | ) |
Definition at line 870 of file astobj2.c.
References __ao2_iterator_next(), _ao2_ref(), AO2_ITERATOR_DONTLOCK, ao2_unlock(), ao2_iterator::c, and ao2_iterator::flags.
00871 { 00872 struct bucket_list *p = NULL; 00873 void *ret = NULL; 00874 00875 ret = __ao2_iterator_next(a, &p); 00876 00877 if (p) { 00878 /* inc refcount of returned object */ 00879 _ao2_ref(ret, 1); 00880 } 00881 00882 if (!(a->flags & AO2_ITERATOR_DONTLOCK)) 00883 ao2_unlock(a->c); 00884 00885 return ret; 00886 }
void* _ao2_iterator_next_debug | ( | struct ao2_iterator * | a, | |
char * | tag, | |||
char * | file, | |||
int | line, | |||
const char * | funcname | |||
) |
Definition at line 852 of file astobj2.c.
References __ao2_iterator_next(), _ao2_ref_debug(), AO2_ITERATOR_DONTLOCK, ao2_unlock(), ao2_iterator::c, and ao2_iterator::flags.
00853 { 00854 struct bucket_list *p; 00855 void *ret = NULL; 00856 00857 ret = __ao2_iterator_next(a, &p); 00858 00859 if (p) { 00860 /* inc refcount of returned object */ 00861 _ao2_ref_debug(ret, 1, tag, file, line, funcname); 00862 } 00863 00864 if (!(a->flags & AO2_ITERATOR_DONTLOCK)) 00865 ao2_unlock(a->c); 00866 00867 return ret; 00868 }
void* _ao2_link | ( | struct ao2_container * | c, | |
void * | newobj | |||
) |
Definition at line 572 of file astobj2.c.
References __ao2_link(), _ao2_ref(), and ao2_unlock().
00573 { 00574 struct bucket_list *p = __ao2_link(c, user_data); 00575 00576 if (p) { 00577 _ao2_ref(user_data, +1); 00578 ao2_unlock(c); 00579 } 00580 return p; 00581 }
void* _ao2_link_debug | ( | struct ao2_container * | c, | |
void * | new_obj, | |||
char * | tag, | |||
char * | file, | |||
int | line, | |||
const char * | funcname | |||
) |
Definition at line 561 of file astobj2.c.
References __ao2_link(), _ao2_ref_debug(), and ao2_unlock().
00562 { 00563 struct bucket_list *p = __ao2_link(c, user_data); 00564 00565 if (p) { 00566 _ao2_ref_debug(user_data, +1, tag, file, line, funcname); 00567 ao2_unlock(c); 00568 } 00569 return p; 00570 }
int _ao2_lock | ( | void * | a, | |
const char * | file, | |||
const char * | func, | |||
int | line, | |||
const char * | var | |||
) |
Definition at line 162 of file astobj2.c.
References ast_atomic_fetchadd_int(), ast_mutex_lock(), INTERNAL_OBJ(), __priv_data::lock, and astobj2::priv_data.
00163 { 00164 struct astobj2 *p = INTERNAL_OBJ(user_data); 00165 00166 if (p == NULL) 00167 return -1; 00168 00169 #ifdef AO2_DEBUG 00170 ast_atomic_fetchadd_int(&ao2.total_locked, 1); 00171 #endif 00172 00173 #ifndef DEBUG_THREADS 00174 return ast_mutex_lock(&p->priv_data.lock); 00175 #else 00176 return __ast_pthread_mutex_lock(file, line, func, var, &p->priv_data.lock); 00177 #endif 00178 }
int _ao2_ref | ( | void * | o, | |
int | delta | |||
) |
Definition at line 283 of file astobj2.c.
References __ao2_ref(), and INTERNAL_OBJ().
Referenced by __ao2_callback(), _ao2_iterator_next(), _ao2_link(), and cd_cb().
00284 { 00285 struct astobj2 *obj = INTERNAL_OBJ(user_data); 00286 00287 if (obj == NULL) 00288 return -1; 00289 00290 return __ao2_ref(user_data, delta); 00291 }
int _ao2_ref_debug | ( | void * | o, | |
int | delta, | |||
char * | tag, | |||
char * | file, | |||
int | line, | |||
const char * | funcname | |||
) |
Definition at line 263 of file astobj2.c.
References __ao2_ref(), __priv_data::destructor_fn, INTERNAL_OBJ(), astobj2::priv_data, __priv_data::ref_counter, and REF_FILE.
Referenced by __ao2_callback(), _ao2_iterator_next_debug(), _ao2_link_debug(), and cd_cb_debug().
00264 { 00265 struct astobj2 *obj = INTERNAL_OBJ(user_data); 00266 00267 if (obj == NULL) 00268 return -1; 00269 00270 if (delta != 0) { 00271 FILE *refo = fopen(REF_FILE,"a"); 00272 fprintf(refo, "%p %s%d %s:%d:%s (%s) [@%d]\n", user_data, (delta<0? "":"+"), delta, file, line, funcname, tag, obj->priv_data.ref_counter); 00273 fclose(refo); 00274 } 00275 if (obj->priv_data.ref_counter + delta == 0 && obj->priv_data.destructor_fn != NULL) { /* this isn't protected with lock; just for o/p */ 00276 FILE *refo = fopen(REF_FILE,"a"); 00277 fprintf(refo, "%p **call destructor** %s:%d:%s (%s)\n", user_data, file, line, funcname, tag); 00278 fclose(refo); 00279 } 00280 return __ao2_ref(user_data, delta); 00281 }
int _ao2_trylock | ( | void * | a, | |
const char * | file, | |||
const char * | func, | |||
int | line, | |||
const char * | var | |||
) |
Definition at line 228 of file astobj2.c.
References ast_atomic_fetchadd_int(), ast_mutex_trylock(), INTERNAL_OBJ(), __priv_data::lock, and astobj2::priv_data.
00229 { 00230 struct astobj2 *p = INTERNAL_OBJ(user_data); 00231 int ret; 00232 00233 if (p == NULL) 00234 return -1; 00235 #ifndef DEBUG_THREADS 00236 ret = ast_mutex_trylock(&p->priv_data.lock); 00237 #else 00238 ret = __ast_pthread_mutex_trylock(file, line, func, var, &p->priv_data.lock); 00239 #endif 00240 00241 #ifdef AO2_DEBUG 00242 if (!ret) 00243 ast_atomic_fetchadd_int(&ao2.total_locked, 1); 00244 #endif 00245 return ret; 00246 }
void* _ao2_unlink | ( | struct ao2_container * | c, | |
void * | obj | |||
) |
Definition at line 606 of file astobj2.c.
References _ao2_callback(), ao2_match_by_addr, INTERNAL_OBJ(), OBJ_NODATA, OBJ_POINTER, and OBJ_UNLINK.
00607 { 00608 if (INTERNAL_OBJ(user_data) == NULL) /* safety check on the argument */ 00609 return NULL; 00610 00611 _ao2_callback(c, OBJ_UNLINK | OBJ_POINTER | OBJ_NODATA, ao2_match_by_addr, user_data); 00612 00613 return NULL; 00614 }
void* _ao2_unlink_debug | ( | struct ao2_container * | c, | |
void * | obj, | |||
char * | tag, | |||
char * | file, | |||
int | line, | |||
const char * | funcname | |||
) |
Definition at line 595 of file astobj2.c.
References _ao2_callback_debug(), ao2_match_by_addr, INTERNAL_OBJ(), OBJ_NODATA, OBJ_POINTER, and OBJ_UNLINK.
00597 { 00598 if (INTERNAL_OBJ(user_data) == NULL) /* safety check on the argument */ 00599 return NULL; 00600 00601 _ao2_callback_debug(c, OBJ_UNLINK | OBJ_POINTER | OBJ_NODATA, ao2_match_by_addr, user_data, tag, file, line, funcname); 00602 00603 return NULL; 00604 }
int _ao2_unlock | ( | void * | a, | |
const char * | file, | |||
const char * | func, | |||
int | line, | |||
const char * | var | |||
) |
Definition at line 194 of file astobj2.c.
References ast_atomic_fetchadd_int(), ast_mutex_unlock(), INTERNAL_OBJ(), __priv_data::lock, and astobj2::priv_data.
00195 { 00196 struct astobj2 *p = INTERNAL_OBJ(user_data); 00197 00198 if (p == NULL) 00199 return -1; 00200 00201 #ifdef AO2_DEBUG 00202 ast_atomic_fetchadd_int(&ao2.total_locked, -1); 00203 #endif 00204 00205 #ifndef DEBUG_THREADS 00206 return ast_mutex_unlock(&p->priv_data.lock); 00207 #else 00208 return __ast_pthread_mutex_unlock(file, line, func, var, &p->priv_data.lock); 00209 #endif 00210 }
void ao2_bt | ( | void | ) |
Definition at line 83 of file astobj2.c.
References ast_verbose, free, and N1.
00084 { 00085 int c, i; 00086 #define N1 20 00087 void *addresses[N1]; 00088 char **strings; 00089 00090 c = backtrace(addresses, N1); 00091 strings = backtrace_symbols(addresses,c); 00092 ast_verbose("backtrace returned: %d\n", c); 00093 for(i = 0; i < c; i++) { 00094 ast_verbose("%d: %p %s\n", i, addresses[i], strings[i]); 00095 } 00096 free(strings); 00097 }
int ao2_container_count | ( | struct ao2_container * | c | ) |
Returns the number of elements in a container.
return the number of elements in the container
Definition at line 511 of file astobj2.c.
References ao2_container::elements.
Referenced by __queues_show(), _sip_show_peers(), cli_tps_report(), do_timing(), get_unused_callno(), lock_broker(), pthread_timer_open(), and unload_module().
00512 { 00513 return c->elements; 00514 }
void ao2_iterator_destroy | ( | struct ao2_iterator * | i | ) |
Destroy a container iterator.
destroy an iterator
Definition at line 788 of file astobj2.c.
References ao2_ref, and ao2_iterator::c.
Referenced by __iax2_show_peers(), __queues_show(), _sip_show_peers(), authenticate_reply(), check_access(), cli_console_active(), cli_list_devices(), compare_weight(), complete_iax2_peers(), complete_iax2_unregister(), complete_queue(), complete_queue_remove_member(), complete_sip_peer(), complete_sip_registered_peer(), complete_sip_user(), complete_sipch(), delete_profiles(), delete_routes(), delete_users(), destroy_pvts(), dialgroup_read(), dump_queue_members(), free_members(), get_member_status(), handle_cli_iax2_show_callno_limits(), handle_cli_iax2_show_users(), handle_cli_moh_show_classes(), handle_cli_moh_show_files(), handle_cli_odbc_show(), handle_request_subscribe(), handle_show_routes(), iax2_getpeername(), iax2_getpeertrunk(), interface_exists(), interface_exists_global(), manager_iax2_show_peer_list(), manager_queues_status(), manager_queues_summary(), num_available_members(), poke_all_peers(), pp_each_user_exec(), prune_peers(), prune_users(), queue_function_qac(), queue_function_qac_dep(), queue_function_queuememberlist(), reload(), rt_handle_member_record(), set_member_paused(), set_member_penalty(), sip_poke_all_peers(), sip_prune_realtime(), sip_show_channel(), sip_show_history(), sip_show_inuse(), sip_show_tcp(), sip_show_users(), stop_streams(), try_calling(), unload_module(), update_queue(), and update_realtime_members().
struct ao2_iterator ao2_iterator_init | ( | struct ao2_container * | c, | |
int | flags | |||
) |
Create an iterator for a container.
initialize an iterator so we start from the first object
Definition at line 773 of file astobj2.c.
References ao2_ref, ao2_iterator::c, and ao2_iterator::flags.
Referenced by __iax2_show_peers(), __queues_show(), _sip_show_peers(), ast_odbc_request_obj(), authenticate_reply(), check_access(), cli_console_active(), cli_list_devices(), cli_tps_report(), compare_weight(), complete_iax2_peers(), complete_iax2_unregister(), complete_queue(), complete_queue_remove_member(), complete_sip_peer(), complete_sip_registered_peer(), complete_sip_user(), complete_sipch(), delete_profiles(), delete_routes(), delete_users(), destroy_pvts(), dialgroup_read(), do_parking_thread(), dump_queue_members(), free_members(), get_member_status(), handle_cli_iax2_show_callno_limits(), handle_cli_iax2_show_users(), handle_cli_moh_show_classes(), handle_cli_moh_show_files(), handle_cli_odbc_show(), handle_feature_show(), handle_parkedcalls(), handle_request_subscribe(), handle_show_routes(), iax2_getpeername(), iax2_getpeertrunk(), interface_exists(), interface_exists_global(), manager_iax2_show_peer_list(), manager_parking_status(), manager_queues_status(), manager_queues_summary(), num_available_members(), poke_all_peers(), pp_each_user_exec(), prune_peers(), prune_users(), queue_function_qac(), queue_function_qac_dep(), queue_function_queuememberlist(), reload(), reload_queues(), rt_handle_member_record(), set_member_paused(), set_member_penalty(), sip_poke_all_peers(), sip_prune_realtime(), sip_show_channel(), sip_show_history(), sip_show_inuse(), sip_show_tcp(), sip_show_users(), stop_streams(), tps_taskprocessor_tab_complete(), try_calling(), unload_module(), update_queue(), update_realtime_members(), and update_status().
00774 { 00775 struct ao2_iterator a = { 00776 .c = c, 00777 .flags = flags 00778 }; 00779 00780 ao2_ref(c, +1); 00781 00782 return a; 00783 }
int ao2_lock | ( | void * | a | ) |
Lock an object.
a | A pointer to the object we want to lock. |
Definition at line 148 of file astobj2.c.
References ast_atomic_fetchadd_int(), ast_mutex_lock(), INTERNAL_OBJ(), __priv_data::lock, and astobj2::priv_data.
Referenced by __ao2_callback(), __ao2_iterator_next(), __ao2_link(), __queues_show(), _sip_show_peers(), _sip_tcp_helper_thread(), add_calltoken_ignore(), add_to_queue(), ast_taskprocessor_get(), ast_taskprocessor_unreference(), build_callno_limits(), build_parkinglot(), compare_weight(), complete_queue_remove_member(), complete_sip_user(), dialog_needdestroy(), end_bridge_callback(), find_call(), find_queue_by_name_rt(), get_member_penalty(), get_member_status(), get_unused_callno(), handle_request_subscribe(), inprocess_count(), interface_exists_global(), is_our_turn(), join_queue(), leave_queue(), load_config(), load_realtime_queue(), manager_queues_status(), manager_queues_summary(), moh_release(), mohalloc(), monmp3thread(), mwi_event_cb(), peercnt_add(), peercnt_remove(), pthread_timer_ack(), pthread_timer_disable_continuous(), pthread_timer_enable_continuous(), pthread_timer_get_event(), pthread_timer_open(), pthread_timer_set_rate(), queue_function_qac(), queue_function_qac_dep(), queue_function_queuememberlist(), queue_function_queuewaitingcount(), queue_function_var(), recalc_holdtime(), record_abandoned(), reload_queue_members(), reload_queues(), remove_from_queue(), replace_callno(), ring_entry(), run_timer(), set_member_paused(), set_member_penalty(), sip_poke_all_peers(), sip_prune_realtime(), sip_show_inuse(), sip_show_user(), sip_show_users(), sip_tcptls_write(), try_calling(), update_call_counter(), update_queue(), update_realtime_members(), and update_status().
00149 { 00150 struct astobj2 *p = INTERNAL_OBJ(user_data); 00151 00152 if (p == NULL) 00153 return -1; 00154 00155 #ifdef AO2_DEBUG 00156 ast_atomic_fetchadd_int(&ao2.total_locked, 1); 00157 #endif 00158 00159 return ast_mutex_lock(&p->priv_data.lock); 00160 }
void* ao2_object_get_lockaddr | ( | void * | obj | ) |
Return the lock address of an object.
[in] | obj | A pointer to the object we want. |
Definition at line 248 of file astobj2.c.
References INTERNAL_OBJ(), __priv_data::lock, and astobj2::priv_data.
00249 { 00250 struct astobj2 *p = INTERNAL_OBJ(obj); 00251 00252 if (p == NULL) 00253 return NULL; 00254 00255 return &p->priv_data.lock; 00256 }
int ao2_trylock | ( | void * | a | ) |
Try locking-- (don't block if fail).
a | A pointer to the object we want to lock. |
Definition at line 212 of file astobj2.c.
References ast_atomic_fetchadd_int(), ast_mutex_trylock(), INTERNAL_OBJ(), __priv_data::lock, and astobj2::priv_data.
00213 { 00214 struct astobj2 *p = INTERNAL_OBJ(user_data); 00215 int ret; 00216 00217 if (p == NULL) 00218 return -1; 00219 ret = ast_mutex_trylock(&p->priv_data.lock); 00220 00221 #ifdef AO2_DEBUG 00222 if (!ret) 00223 ast_atomic_fetchadd_int(&ao2.total_locked, 1); 00224 #endif 00225 return ret; 00226 }
int ao2_unlock | ( | void * | a | ) |
Unlock an object.
a | A pointer to the object we want unlock. |
Definition at line 180 of file astobj2.c.
References ast_atomic_fetchadd_int(), ast_mutex_unlock(), INTERNAL_OBJ(), __priv_data::lock, and astobj2::priv_data.
Referenced by __ao2_callback(), __queues_show(), _ao2_iterator_next(), _ao2_iterator_next_debug(), _ao2_link(), _ao2_link_debug(), _sip_show_peers(), _sip_tcp_helper_thread(), add_calltoken_ignore(), add_to_queue(), ast_taskprocessor_get(), ast_taskprocessor_unreference(), build_callno_limits(), build_parkinglot(), compare_weight(), complete_queue_remove_member(), complete_sip_user(), dialog_needdestroy(), end_bridge_callback(), find_call(), find_queue_by_name_rt(), get_member_penalty(), get_member_status(), get_unused_callno(), handle_request_subscribe(), inprocess_count(), interface_exists_global(), is_our_turn(), join_queue(), leave_queue(), load_config(), load_realtime_queue(), manager_queues_status(), manager_queues_summary(), moh_release(), mohalloc(), monmp3thread(), mwi_event_cb(), peercnt_add(), peercnt_remove(), pthread_timer_ack(), pthread_timer_disable_continuous(), pthread_timer_enable_continuous(), pthread_timer_get_event(), pthread_timer_open(), pthread_timer_set_rate(), queue_function_qac(), queue_function_qac_dep(), queue_function_queuememberlist(), queue_function_queuewaitingcount(), queue_function_var(), recalc_holdtime(), record_abandoned(), reload_queue_members(), reload_queues(), remove_from_queue(), replace_callno(), ring_entry(), run_timer(), set_member_paused(), set_member_penalty(), sip_poke_all_peers(), sip_prune_realtime(), sip_show_inuse(), sip_show_user(), sip_show_users(), sip_tcptls_write(), try_calling(), update_call_counter(), update_queue(), update_realtime_members(), and update_status().
00181 { 00182 struct astobj2 *p = INTERNAL_OBJ(user_data); 00183 00184 if (p == NULL) 00185 return -1; 00186 00187 #ifdef AO2_DEBUG 00188 ast_atomic_fetchadd_int(&ao2.total_locked, -1); 00189 #endif 00190 00191 return ast_mutex_unlock(&p->priv_data.lock); 00192 }
ao2_callback_fn ao2_match_by_addr |
a very common callback is one that matches by address.
Definition at line 626 of file astobj2.h.
Referenced by _ao2_unlink(), _ao2_unlink_debug(), and load_module().