17 #ifndef _ASTERISK_ASTOBJ2_H
18 #define _ASTERISK_ASTOBJ2_H
402 #define ao2_t_alloc_options(data_size, destructor_fn, options, debug_msg) \
403 __ao2_alloc((data_size), (destructor_fn), (options), (debug_msg), __FILE__, __LINE__, __PRETTY_FUNCTION__)
404 #define ao2_alloc_options(data_size, destructor_fn, options) \
405 __ao2_alloc((data_size), (destructor_fn), (options), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
407 #define ao2_t_alloc(data_size, destructor_fn, debug_msg) \
408 __ao2_alloc((data_size), (destructor_fn), AO2_ALLOC_OPT_LOCK_MUTEX, (debug_msg), __FILE__, __LINE__, __PRETTY_FUNCTION__)
409 #define ao2_alloc(data_size, destructor_fn) \
410 __ao2_alloc((data_size), (destructor_fn), AO2_ALLOC_OPT_LOCK_MUTEX, NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
412 void *__ao2_alloc(
size_t data_size,
ao2_destructor_fn destructor_fn,
unsigned int options,
413 const char *tag,
const char *file,
int line,
const char *func) attribute_warn_unused_result;
431 #define ao2_alloc_with_lockobj(data_size, destructor_fn, lockobj, tag) \
432 __ao2_alloc_with_lockobj((data_size), (destructor_fn), (lockobj), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
434 void *__ao2_alloc_with_lockobj(
size_t data_size,
ao2_destructor_fn destructor_fn,
void *lockobj,
435 const char *tag,
const char *file,
int line,
const char *func) attribute_warn_unused_result;
459 #define ao2_ref(o,delta) __ao2_ref((o), (delta), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
460 #define ao2_t_ref(o,delta,tag) __ao2_ref((o), (delta), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
480 #define ao2_bump(obj) \
481 ao2_t_bump((obj), NULL)
483 #define ao2_t_bump(obj, tag) \
485 typeof(obj) __obj_ ## __LINE__ = (obj); \
486 if (__obj_ ## __LINE__) { \
487 ao2_t_ref(__obj_ ## __LINE__, +1, (tag)); \
489 __obj_ ## __LINE__; \
492 int __ao2_ref(
void *o,
int delta,
const char *tag,
const char *file,
int line,
const char *func);
501 #define ao2_replace(dst, src) \
502 ao2_t_replace((dst), (src), NULL)
504 #define ao2_t_replace(dst, src, tag) \
506 typeof(dst) *__dst_ ## __LINE__ = &dst; \
507 typeof(src) __src_ ## __LINE__ = src; \
508 if (__src_ ## __LINE__ != *__dst_ ## __LINE__) { \
509 if (__src_ ## __LINE__) {\
510 ao2_t_ref(__src_ ## __LINE__, +1, (tag)); \
512 if (*__dst_ ## __LINE__) {\
513 ao2_t_ref(*__dst_ ## __LINE__, -1, (tag)); \
515 *__dst_ ## __LINE__ = __src_ ## __LINE__; \
526 typedef void (*ao2_weakproxy_notification_cb)(
void *weakproxy,
void *data);
538 #define AO2_WEAKPROXY() struct ao2_weakproxy __weakproxy##__LINE__
550 #define ao2_weakproxy_alloc(data_size, destructor_fn) \
551 __ao2_weakproxy_alloc(data_size, destructor_fn, NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
553 #define ao2_t_weakproxy_alloc(data_size, destructor_fn, tag) \
554 __ao2_weakproxy_alloc(data_size, destructor_fn, tag, __FILE__, __LINE__, __PRETTY_FUNCTION__)
557 const char *tag,
const char *file,
int line,
const char *func) attribute_warn_unused_result;
579 #define ao2_weakproxy_set_object(weakproxy, obj, flags) \
580 __ao2_weakproxy_set_object(weakproxy, obj, flags, NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
582 #define ao2_t_weakproxy_set_object(weakproxy, obj, flags, tag) \
583 __ao2_weakproxy_set_object(weakproxy, obj, flags, tag, __FILE__, __LINE__, __PRETTY_FUNCTION__)
585 int __ao2_weakproxy_set_object(
void *weakproxy,
void *obj,
int flags,
586 const char *tag,
const char *file,
int line,
const char *func);
601 #define ao2_weakproxy_ref_object(weakproxy, delta, flags) \
602 ao2_t_weakproxy_ref_object(weakproxy, delta, flags, NULL)
604 #define ao2_t_weakproxy_ref_object(weakproxy, delta, flags, tag) \
605 __ao2_weakproxy_ref_object(weakproxy, delta, flags, \
606 tag, __FILE__, __LINE__, __PRETTY_FUNCTION__)
608 int __ao2_weakproxy_ref_object(
void *weakproxy,
int delta,
int flags,
609 const char *tag,
const char *file,
int line,
const char *func);
621 #define ao2_weakproxy_get_object(weakproxy, flags) \
622 __ao2_weakproxy_get_object(weakproxy, flags, NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
624 #define ao2_t_weakproxy_get_object(weakproxy, flags, tag) \
625 __ao2_weakproxy_get_object(weakproxy, flags, tag, __FILE__, __LINE__, __PRETTY_FUNCTION__)
627 void *__ao2_weakproxy_get_object(
void *weakproxy,
int flags,
628 const char *tag,
const char *file,
int line,
const char *func) attribute_warn_unused_result;
688 #define ao2_get_weakproxy(obj) \
689 __ao2_get_weakproxy(obj, NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
691 #define ao2_t_get_weakproxy(obj, tag) \
692 __ao2_get_weakproxy(obj, tag, __FILE__, __LINE__, __PRETTY_FUNCTION__)
694 void *__ao2_get_weakproxy(
void *obj,
695 const char *tag,
const char *file,
int line,
const char *func) attribute_warn_unused_result;
716 int __ao2_lock(
void *a,
enum ao2_lock_req lock_how,
const char *file,
const char *func,
int line,
const char *var);
717 #define ao2_lock(a) __ao2_lock(a, AO2_LOCK_REQ_MUTEX, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
718 #define ao2_rdlock(a) __ao2_lock(a, AO2_LOCK_REQ_RDLOCK, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
719 #define ao2_wrlock(a) __ao2_lock(a, AO2_LOCK_REQ_WRLOCK, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
728 int __ao2_unlock(
void *a,
const char *file,
const char *func,
int line,
const char *var);
729 #define ao2_unlock(a) __ao2_unlock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
739 #define ao2_trylock(a) __ao2_trylock(a, AO2_LOCK_REQ_MUTEX, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
740 #define ao2_tryrdlock(a) __ao2_trylock(a, AO2_LOCK_REQ_RDLOCK, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
741 #define ao2_trywrlock(a) __ao2_trylock(a, AO2_LOCK_REQ_WRLOCK, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
793 if (ao2_unlock(obj)) {
829 #ifndef HAVE_PTHREAD_RWLOCK_INITIALIZER
830 #define AO2_GLOBAL_OBJ_STATIC(name) \
831 struct ao2_global_obj name; \
832 static void __attribute__((constructor)) __init_##name(void) \
834 ast_rwlock_init(&name.lock); \
837 static void __attribute__((destructor)) __fini_##name(void) \
840 ao2_ref(name.obj, -1); \
843 ast_rwlock_destroy(&name.lock); \
845 struct __dummy_##name
847 #define AO2_GLOBAL_OBJ_STATIC(name) \
848 struct ao2_global_obj name = { \
849 .lock = AST_RWLOCK_INIT_VALUE, \
859 #define ao2_global_obj_release(holder) \
860 __ao2_global_obj_replace_unref(&holder, NULL, NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__, #holder)
861 #define ao2_t_global_obj_release(holder, tag) \
862 __ao2_global_obj_replace_unref(&holder, NULL, (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__, #holder)
878 #define ao2_global_obj_replace(holder, obj) \
879 __ao2_global_obj_replace(&holder, (obj), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__, #holder)
881 #define ao2_t_global_obj_replace(holder, obj, tag) \
882 __ao2_global_obj_replace(&holder, (obj), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__, #holder)
884 void *__ao2_global_obj_replace(
struct ao2_global_obj *holder,
void *obj,
const char *tag,
const char *file,
int line,
const char *func,
const char *name) attribute_warn_unused_result;
901 #define ao2_global_obj_replace_unref(holder, obj) \
902 __ao2_global_obj_replace_unref(&holder, (obj), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__, #holder)
904 #define ao2_t_global_obj_replace_unref(holder, obj, tag) \
905 __ao2_global_obj_replace_unref(&holder, (obj), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__, #holder)
907 int __ao2_global_obj_replace_unref(
struct ao2_global_obj *holder,
void *obj,
const char *tag,
const char *file,
int line,
const char *func,
const char *name);
918 #define ao2_global_obj_ref(holder) \
919 __ao2_global_obj_ref(&holder, NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__, #holder)
921 #define ao2_t_global_obj_ref(holder, tag) \
922 __ao2_global_obj_ref(&holder, (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__, #holder)
924 void *__ao2_global_obj_ref(
struct ao2_global_obj *holder,
const char *tag,
const char *file,
int line,
const char *func,
const char *name) attribute_warn_unused_result;
1150 #define OBJ_POINTER OBJ_SEARCH_OBJECT
1151 #define OBJ_KEY OBJ_SEARCH_KEY
1152 #define OBJ_PARTIAL_KEY OBJ_SEARCH_PARTIAL_KEY
1276 typedef int (
ao2_sort_fn)(
const void *obj_left,
const void *obj_right,
int flags);
1303 #define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn) \
1304 __ao2_container_alloc_hash((ao2_options), (container_options), (n_buckets), (hash_fn), (sort_fn), (cmp_fn), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1306 #define ao2_t_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn, tag) \
1307 __ao2_container_alloc_hash((ao2_options), (container_options), (n_buckets), (hash_fn), (sort_fn), (cmp_fn), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
1309 struct ao2_container *__ao2_container_alloc_hash(
unsigned int ao2_options,
1310 unsigned int container_options,
unsigned int n_buckets,
ao2_hash_fn *hash_fn,
1312 const char *tag,
const char *file,
int line,
const char *func) attribute_warn_unused_result;
1327 #define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn) \
1328 __ao2_container_alloc_list((ao2_options), (container_options), (sort_fn), (cmp_fn), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1330 #define ao2_t_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn, tag) \
1331 __ao2_container_alloc_list((ao2_options), (container_options), (sort_fn), (cmp_fn), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
1333 struct ao2_container *__ao2_container_alloc_list(
unsigned int ao2_options,
1335 const char *tag,
const char *file,
int line,
const char *func) attribute_warn_unused_result;
1349 #define ao2_container_alloc_rbtree(ao2_options, container_options, sort_fn, cmp_fn) \
1350 __ao2_container_alloc_rbtree((ao2_options), (container_options), (sort_fn), (cmp_fn), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1352 #define ao2_t_container_alloc_rbtree(ao2_options, container_options, sort_fn, cmp_fn, tag) \
1353 __ao2_container_alloc_rbtree((ao2_options), (container_options), (sort_fn), (cmp_fn), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
1355 struct ao2_container *__ao2_container_alloc_rbtree(
unsigned int ao2_options,
unsigned int container_options,
1357 const char *tag,
const char *file,
int line,
const char *func) attribute_warn_unused_result;
1419 #define ao2_container_clone(orig, flags) \
1420 __ao2_container_clone(orig, flags, NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1422 #define ao2_t_container_clone(orig, flags, tag) \
1423 __ao2_container_clone(orig, flags, tag, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1426 const char *tag,
const char *file,
int line,
const char *func) attribute_warn_unused_result;
1435 typedef void (
ao2_prnt_fn)(
void *where,
const char *fmt, ...) __attribute__((format(printf, 2, 3)));
1532 #define ao2_link(container, obj) \
1533 __ao2_link((container), (obj), 0, NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1534 #define ao2_t_link(container, obj, tag) \
1535 __ao2_link((container), (obj), 0, (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
1554 #define ao2_link_flags(container, obj, flags) \
1555 __ao2_link((container), (obj), (flags), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1556 #define ao2_t_link_flags(container, obj, flags, tag) \
1557 __ao2_link((container), (obj), (flags), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
1559 int __ao2_link(
struct ao2_container *c,
void *obj_new,
int flags,
1560 const char *tag,
const char *file,
int line,
const char *func);
1578 #define ao2_unlink(container, obj) \
1579 __ao2_unlink((container), (obj), 0, NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1580 #define ao2_t_unlink(container, obj, tag) \
1581 __ao2_unlink((container), (obj), 0, (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
1600 #define ao2_unlink_flags(container, obj, flags) \
1601 __ao2_unlink((container), (obj), (flags), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1603 #define ao2_t_unlink_flags(container, obj, flags, tag) \
1604 __ao2_unlink((container), (obj), (flags), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
1606 void *__ao2_unlink(
struct ao2_container *c,
void *obj,
int flags,
1607 const char *tag,
const char *file,
int line,
const char *func);
1693 #define ao2_callback(c, flags, cb_fn, arg) \
1694 __ao2_callback((c), (flags), (cb_fn), (arg), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1696 #define ao2_t_callback(c, flags, cb_fn, arg, tag) \
1697 __ao2_callback((c), (flags), (cb_fn), (arg), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
1700 ao2_callback_fn *cb_fn,
void *arg,
const char *tag,
const char *file,
int line,
1721 #define ao2_t_callback_data(container, flags, cb_fn, arg, data, tag) \
1722 __ao2_callback_data((container), (flags), (cb_fn), (arg), (data), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
1723 #define ao2_callback_data(container, flags, cb_fn, arg, data) \
1724 __ao2_callback_data((container), (flags), (cb_fn), (arg), (data), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1728 int line,
const char *func);
1734 #define ao2_t_find(container, arg, flags, tag) \
1735 __ao2_find((container), (arg), (flags), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
1736 #define ao2_find(container, arg, flags) \
1737 __ao2_find((container), (arg), (flags), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1740 const char *tag,
const char *file,
int line,
const char *func);
1748 #define ao2_weakproxy_find(c, arg, flags, tag) \
1749 __ao2_weakproxy_find(c, arg, flags, tag, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1751 const char *tag,
const char *file,
int line,
const char *func);
1903 #if defined(TEST_FRAMEWORK)
1909 #define ao2_t_iterator_next(iter, tag) \
1910 __ao2_iterator_next((iter), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
1911 #define ao2_iterator_next(iter) \
1912 __ao2_iterator_next((iter), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1915 const char *tag,
const char *file,
int line,
const char *func) attribute_warn_unused_result;
1933 void __ao2_cleanup_debug(
void *obj,
const char *tag,
const char *file,
int line,
const char *
function);
1934 #define ao2_cleanup(obj) __ao2_cleanup_debug((obj), NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__)
1935 #define ao2_t_cleanup(obj, tag) __ao2_cleanup_debug((obj), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__)
1957 #define AO2_FIELD_HASH_FN(stype, field, hash_fn) \
1958 static int stype ## _hash_fn(const void *obj, const int flags) \
1960 const struct stype *object = obj; \
1962 switch (flags & OBJ_SEARCH_MASK) { \
1963 case OBJ_SEARCH_KEY: \
1966 case OBJ_SEARCH_OBJECT: \
1967 key = object->field; \
1973 return hash_fn(key); \
1977 #define AO2_FIELD_TRANSFORM_CMP_FN(cmp) ((cmp) ? 0 : CMP_MATCH)
1978 #define AO2_FIELD_TRANSFORM_SORT_FN(cmp) (cmp)
1999 #define AO2_FIELD_CMP_FN(stype, fn_suffix, field, key_cmp, partial_key_cmp, transform, argconst) \
2000 static int stype ## fn_suffix(argconst void *obj, argconst void *arg, int flags) \
2002 const struct stype *object_left = obj, *object_right = arg; \
2003 const char *right_key = arg; \
2005 switch (flags & OBJ_SEARCH_MASK) { \
2006 case OBJ_SEARCH_OBJECT: \
2007 right_key = object_right->field; \
2008 case OBJ_SEARCH_KEY: \
2009 cmp = key_cmp(object_left->field, right_key); \
2011 case OBJ_SEARCH_PARTIAL_KEY: \
2012 cmp = partial_key_cmp(object_left->field, right_key, strlen(right_key)); \
2018 return transform(cmp); \
2032 #define AO2_STRING_FIELD_HASH_FN(stype, field) \
2033 AO2_FIELD_HASH_FN(stype, field, ast_str_hash)
2034 #define AO2_STRING_FIELD_CASE_HASH_FN(stype, field) \
2035 AO2_FIELD_HASH_FN(stype, field, ast_str_case_hash)
2048 #define AO2_STRING_FIELD_CMP_FN(stype, field) \
2049 AO2_FIELD_CMP_FN(stype, _cmp_fn, field, strcmp, strncmp, AO2_FIELD_TRANSFORM_CMP_FN,)
2050 #define AO2_STRING_FIELD_CASE_CMP_FN(stype, field) \
2051 AO2_FIELD_CMP_FN(stype, _cmp_fn, field, strcasecmp, strncasecmp, AO2_FIELD_TRANSFORM_CMP_FN,)
2064 #define AO2_STRING_FIELD_SORT_FN(stype, field) \
2065 AO2_FIELD_CMP_FN(stype, _sort_fn, field, strcmp, strncmp, AO2_FIELD_TRANSFORM_SORT_FN, const)
2066 #define AO2_STRING_FIELD_CASE_SORT_FN(stype, field) \
2067 AO2_FIELD_CMP_FN(stype, _sort_fn, field, strcasecmp, strncasecmp, AO2_FIELD_TRANSFORM_SORT_FN, const)
void ao2_container_dump(struct ao2_container *self, enum search_flags flags, const char *name, void *where, ao2_prnt_fn *prnt, ao2_prnt_obj_fn *prnt_obj)
Display contents of the specified container.
void( ao2_prnt_fn)(void *where, const char *fmt,...)
Print output.
void( ao2_prnt_obj_fn)(void *v_obj, void *where, ao2_prnt_fn *prnt)
Print object key.
Asterisk locking-related definitions:
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
int( ao2_callback_fn)(void *obj, void *arg, int flags)
Type of a generic callback function.
ao2_lock_req
Which lock to request.
int ao2_weakproxy_unsubscribe(void *weakproxy, ao2_weakproxy_notification_cb cb, void *data, int flags)
Remove notification of real object destruction.
void * __ao2_find(struct ao2_container *c, const void *arg, enum search_flags flags, const char *tag, const char *file, int line, const char *func)
The arg parameter is a search key, but is not an object.
int __ao2_lock(void *a, enum ao2_lock_req lock_how, const char *file, const char *func, int line, const char *var)
Lock an object.
Allow objects with duplicate keys in container.
void __ao2_cleanup(void *obj)
int ao2_container_dup_weakproxy_objs(struct ao2_container *dest, struct ao2_container *src, enum search_flags flags)
Copy object references associated with src container weakproxies into the dest container.
int ao2_ref_and_lock(void *obj)
Increment reference count on an object and lock it.
void ao2_iterator_restart(struct ao2_iterator *iter)
Restart an iteration.
int( ao2_hash_fn)(const void *obj, int flags)
int __ao2_unlock(void *a, const char *file, const char *func, int line, const char *var)
Unlock an object.
Assume that the ao2_container is already locked.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
int ao2_weakproxy_subscribe(void *weakproxy, ao2_weakproxy_notification_cb cb, void *data, int flags)
Request notification when weakproxy points to NULL.
search_flags
Flags passed to ao2_callback_fn(), ao2_hash_fn(), and ao2_sort_fn() to modify behaviour.
void ao2_container_stats(struct ao2_container *self, enum search_flags flags, const char *name, void *where, ao2_prnt_fn *prnt)
Display statistics of the specified container.
The arg parameter has no meaning to the astobj2 code.
Insert objects at the beginning of the container. (Otherwise it is the opposite; insert at the end...
void * ao2_object_get_lockaddr(void *obj)
Return the mutex lock address of an object.
Traverse in ascending order (First to last container object)
int ao2_container_check(struct ao2_container *self, enum search_flags flags)
Perform an integrity check on the specified container.
void ao2_container_unregister(const char *name)
Unregister a container for CLI stats and integrity check.
int ao2_container_register(const char *name, struct ao2_container *self, ao2_prnt_obj_fn *prnt_obj)
Register a container for CLI stats and integrity check.
The arg parameter is a partial search key similar to OBJ_SEARCH_KEY.
The ao2 container objects with duplicate keys option field mask.
Inlinable API function macro.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
A set of macros to manage forward-linked lists.
Traverse in descending order (Last to first container object)
#define AST_LIST_HEAD_NOLOCK(name, type)
Defines a structure to be used to hold a list of specified type (with no lock).
ao2_alloc_opts
Options available when allocating an ao2 object.
int ao2_container_dup(struct ao2_container *dest, struct ao2_container *src, enum search_flags flags)
Copy all object references in the src container into the dest container.
int __ao2_trylock(void *a, enum ao2_lock_req lock_how, const char *file, const char *func, int line, const char *var)
Try locking– (don't block if fail)
void(* ao2_destructor_fn)(void *vdoomed)
Typedef for an object destructor.
Traverse in pre-order (Node then children, for tree container)
_cb_results
A callback function will return a combination of CMP_MATCH and CMP_STOP. The latter will terminate th...
General Definitions for Asterisk top level program Included by asterisk.h to handle platform-specific...
int ao2_match_by_addr(void *obj, void *arg, int flags)
A common ao2_callback is one that matches by address.
int ao2_unlock_and_unref(void *obj)
Unlock an object and decrement its reference count.
Assume that the ao2_container is already locked.
The arg parameter is an object of the same type.
Replace objects with duplicate keys in container.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Structure for rwlock and tracking information.
Traverse in post-order (Children then node, for tree container)
unsigned int ao2_options_get(void *obj)
Retrieve the ao2 options used to create the object.
This struct should be opaque, but it's size is needed.
Reject objects with duplicate keys in container.
int ao2_iterator_count(struct ao2_iterator *iter)
Get a count of the iterated container objects.
int( ao2_sort_fn)(const void *obj_left, const void *obj_right, int flags)
Type of generic container sort function.
Search option field mask.
ao2_container_opts
Options available when allocating an ao2 container object.
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
int( ao2_callback_data_fn)(void *obj, void *arg, void *data, int flags)
Type of a generic callback function.
Reject duplicate objects in container.
Traverse order option field mask.