<p>Corey Farrell has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/10700">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">astobj2: Remove legacy ao2_container_alloc routine.<br><br>Replace usage of ao2_container_alloc with ao2_container_alloc_hash or<br>ao2_container_alloc_list. Remove ao2_container_alloc macro.<br><br>Change-Id: I0907d78bc66efc775672df37c8faad00f2f6c088<br>---<br>M apps/app_confbridge.c<br>M apps/app_meetme.c<br>M apps/app_queue.c<br>M apps/app_skel.c<br>M apps/app_voicemail.c<br>M apps/confbridge/conf_config_parser.c<br>M channels/chan_console.c<br>M channels/chan_iax2.c<br>M channels/chan_motif.c<br>M channels/chan_sip.c<br>M channels/chan_unistim.c<br>M channels/sig_pri.c<br>M funcs/func_dialgroup.c<br>M funcs/func_lock.c<br>M funcs/func_odbc.c<br>M include/asterisk/astobj2.h<br>M main/cel.c<br>M main/channel.c<br>M main/channel_internal_api.c<br>M main/config.c<br>M main/config_options.c<br>M main/datastore.c<br>M main/endpoints.c<br>M main/indications.c<br>M main/manager.c<br>M main/media_index.c<br>M main/message.c<br>M main/named_acl.c<br>M main/pbx.c<br>M main/stasis.c<br>M main/stasis_channels.c<br>M main/taskprocessor.c<br>M main/threadpool.c<br>M main/xmldoc.c<br>M pbx/pbx_realtime.c<br>M res/ari/resource_events.c<br>M res/res_calendar.c<br>M res/res_clialiases.c<br>M res/res_config_sqlite3.c<br>M res/res_corosync.c<br>M res/res_fax.c<br>M res/res_http_websocket.c<br>M res/res_odbc.c<br>M res/res_parking.c<br>M res/res_phoneprov.c<br>M res/res_pjsip/config_transport.c<br>M res/res_pjsip/pjsip_transport_management.c<br>M res/res_pjsip_exten_state.c<br>M res/res_pjsip_mwi.c<br>M res/res_pjsip_outbound_publish.c<br>M res/res_pjsip_outbound_registration.c<br>M res/res_pjsip_pubsub.c<br>M res/res_pjsip_session.c<br>M res/res_rtp_asterisk.c<br>M res/res_sorcery_memory.c<br>M res/res_sorcery_memory_cache.c<br>M res/res_stasis.c<br>M res/res_stasis_device_state.c<br>M res/res_stasis_playback.c<br>M res/res_stasis_recording.c<br>M res/res_timing_pthread.c<br>M res/res_xmpp.c<br>M tests/test_astobj2.c<br>M tests/test_astobj2_thrash.c<br>M tests/test_cel.c<br>M tests/test_config.c<br>M tests/test_scoped_lock.c<br>67 files changed, 315 insertions(+), 233 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/00/10700/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/apps/app_confbridge.c b/apps/app_confbridge.c</span><br><span>index 5936400..ad871e0 100644</span><br><span>--- a/apps/app_confbridge.c</span><br><span>+++ b/apps/app_confbridge.c</span><br><span>@@ -4196,8 +4196,9 @@</span><br><span> }</span><br><span> </span><br><span> /* Create a container to hold the conference bridges */</span><br><span style="color: hsl(0, 100%, 40%);">- conference_bridges = ao2_container_alloc(CONFERENCE_BRIDGE_BUCKETS,</span><br><span style="color: hsl(0, 100%, 40%);">- conference_bridge_hash_cb, conference_bridge_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ conference_bridges = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ CONFERENCE_BRIDGE_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ conference_bridge_hash_cb, NULL, conference_bridge_cmp_cb);</span><br><span> if (!conference_bridges) {</span><br><span> unload_module();</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span>diff --git a/apps/app_meetme.c b/apps/app_meetme.c</span><br><span>index 40c0bd2..6984bd2 100644</span><br><span>--- a/apps/app_meetme.c</span><br><span>+++ b/apps/app_meetme.c</span><br><span>@@ -1624,8 +1624,14 @@</span><br><span> </span><br><span> ast_format_cap_append(cap_slin, ast_format_slin, 0);</span><br><span> /* Make a new one */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cnf = ast_calloc(1, sizeof(*cnf))) ||</span><br><span style="color: hsl(0, 100%, 40%);">- !(cnf->usercontainer = ao2_container_alloc(1, NULL, user_no_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cnf = ast_calloc(1, sizeof(*cnf));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cnf) {</span><br><span style="color: hsl(120, 100%, 40%);">+ goto cnfout;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ cnf->usercontainer = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ NULL, user_no_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cnf->usercontainer) {</span><br><span> goto cnfout;</span><br><span> }</span><br><span> </span><br><span>@@ -7395,13 +7401,6 @@</span><br><span> ast_string_field_free_memory(station);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int sla_trunk_hash(const void *obj, const int flags)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- const struct sla_trunk *trunk = obj;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return ast_str_case_hash(trunk->name);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int sla_trunk_cmp(void *obj, void *arg, int flags)</span><br><span> {</span><br><span> struct sla_trunk *trunk = obj, *trunk2 = arg;</span><br><span>@@ -7409,13 +7408,6 @@</span><br><span> return !strcasecmp(trunk->name, trunk2->name) ? CMP_MATCH | CMP_STOP : 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int sla_station_hash(const void *obj, const int flags)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- const struct sla_station *station = obj;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return ast_str_case_hash(station->name);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int sla_station_cmp(void *obj, void *arg, int flags)</span><br><span> {</span><br><span> struct sla_station *station = obj, *station2 = arg;</span><br><span>@@ -7869,8 +7861,10 @@</span><br><span> if (!reload) {</span><br><span> ast_mutex_init(&sla.lock);</span><br><span> ast_cond_init(&sla.cond, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- sla_trunks = ao2_container_alloc(1, sla_trunk_hash, sla_trunk_cmp);</span><br><span style="color: hsl(0, 100%, 40%);">- sla_stations = ao2_container_alloc(1, sla_station_hash, sla_station_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ sla_trunks = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ NULL, sla_trunk_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ sla_stations = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ NULL, sla_station_cmp);</span><br><span> }</span><br><span> </span><br><span> if (!(cfg = ast_config_load(SLA_CONFIG_FILE, config_flags))) {</span><br><span>diff --git a/apps/app_queue.c b/apps/app_queue.c</span><br><span>index b299889..b4613c3 100644</span><br><span>--- a/apps/app_queue.c</span><br><span>+++ b/apps/app_queue.c</span><br><span>@@ -2815,9 +2815,10 @@</span><br><span> if (!q->members) {</span><br><span> if (q->strategy == QUEUE_STRATEGY_LINEAR || q->strategy == QUEUE_STRATEGY_RRORDERED) {</span><br><span> /* linear strategy depends on order, so we have to place all members in a single bucket */</span><br><span style="color: hsl(0, 100%, 40%);">- q->members = ao2_container_alloc(1, member_hash_fn, member_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ q->members = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, member_cmp_fn);</span><br><span> } else {</span><br><span style="color: hsl(0, 100%, 40%);">- q->members = ao2_container_alloc(37, member_hash_fn, member_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ q->members = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 37,</span><br><span style="color: hsl(120, 100%, 40%);">+ member_hash_fn, NULL, member_cmp_fn);</span><br><span> }</span><br><span> }</span><br><span> q->found = 1;</span><br><span>@@ -11254,13 +11255,14 @@</span><br><span> struct stasis_topic *queue_topic;</span><br><span> struct stasis_topic *manager_topic;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- queues = ao2_container_alloc(MAX_QUEUE_BUCKETS, queue_hash_cb, queue_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ queues = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, MAX_QUEUE_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ queue_hash_cb, NULL, queue_cmp_cb);</span><br><span> if (!queues) {</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- pending_members = ao2_container_alloc(</span><br><span style="color: hsl(0, 100%, 40%);">- MAX_CALL_ATTEMPT_BUCKETS, pending_members_hash, pending_members_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ pending_members = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ MAX_CALL_ATTEMPT_BUCKETS, pending_members_hash, NULL, pending_members_cmp);</span><br><span> if (!pending_members) {</span><br><span> unload_module();</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span>diff --git a/apps/app_skel.c b/apps/app_skel.c</span><br><span>index e58f625..e0b8bca 100644</span><br><span>--- a/apps/app_skel.c</span><br><span>+++ b/apps/app_skel.c</span><br><span>@@ -580,7 +580,9 @@</span><br><span> goto error;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cfg->levels = ao2_container_alloc(LEVEL_BUCKETS, skel_level_hash, skel_level_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg->levels = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, LEVEL_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ skel_level_hash, NULL, skel_level_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cfg->levels) {</span><br><span> goto error;</span><br><span> }</span><br><span> </span><br><span>@@ -725,7 +727,9 @@</span><br><span> if (aco_info_init(&cfg_info)) {</span><br><span> goto error;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(games = ao2_container_alloc(1, NULL, NULL))) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ games = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!games) {</span><br><span> goto error;</span><br><span> }</span><br><span> </span><br><span>diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c</span><br><span>index 554363a..595c2dc 100644</span><br><span>--- a/apps/app_voicemail.c</span><br><span>+++ b/apps/app_voicemail.c</span><br><span>@@ -15066,11 +15066,14 @@</span><br><span> my_umask = umask(0);</span><br><span> umask(my_umask);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(inprocess_container = ao2_container_alloc(573, inprocess_hash_fn, inprocess_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ inprocess_container = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 573,</span><br><span style="color: hsl(120, 100%, 40%);">+ inprocess_hash_fn, NULL, inprocess_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!inprocess_container) {</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- poll_list = ao2_container_alloc(POLL_LIST_BUCKETS, poll_state_hash_fn, poll_state_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ poll_list = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, POLL_LIST_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ poll_state_hash_fn, NULL, poll_state_cmp_fn);</span><br><span> if (!poll_list) {</span><br><span> ast_log(LOG_ERROR, "Unable to create poll_list container\n");</span><br><span> ao2_cleanup(inprocess_container);</span><br><span>diff --git a/apps/confbridge/conf_config_parser.c b/apps/confbridge/conf_config_parser.c</span><br><span>index 9e56b36..53061ba 100644</span><br><span>--- a/apps/confbridge/conf_config_parser.c</span><br><span>+++ b/apps/confbridge/conf_config_parser.c</span><br><span>@@ -1987,15 +1987,21 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cfg->user_profiles = ao2_container_alloc(283, user_hash_cb, user_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg->user_profiles = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 283,</span><br><span style="color: hsl(120, 100%, 40%);">+ user_hash_cb, NULL, user_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cfg->user_profiles) {</span><br><span> goto error;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cfg->bridge_profiles = ao2_container_alloc(283, bridge_hash_cb, bridge_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg->bridge_profiles = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 283,</span><br><span style="color: hsl(120, 100%, 40%);">+ bridge_hash_cb, NULL, bridge_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cfg->bridge_profiles) {</span><br><span> goto error;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cfg->menus = ao2_container_alloc(283, menu_hash_cb, menu_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg->menus = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 283,</span><br><span style="color: hsl(120, 100%, 40%);">+ menu_hash_cb, NULL, menu_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cfg->menus) {</span><br><span> goto error;</span><br><span> }</span><br><span> </span><br><span>diff --git a/channels/chan_console.c b/channels/chan_console.c</span><br><span>index 7692b26..9113ffa 100644</span><br><span>--- a/channels/chan_console.c</span><br><span>+++ b/channels/chan_console.c</span><br><span>@@ -1534,7 +1534,9 @@</span><br><span> </span><br><span> init_pvt(&globals, NULL);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(pvts = ao2_container_alloc(NUM_PVT_BUCKETS, pvt_hash_cb, pvt_cmp_cb)))</span><br><span style="color: hsl(120, 100%, 40%);">+ pvts = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NUM_PVT_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ pvt_hash_cb, NULL, pvt_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!pvts)</span><br><span> goto return_error;</span><br><span> </span><br><span> if (load_config(0))</span><br><span>diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c</span><br><span>index 0ca4234..6f88d09 100644</span><br><span>--- a/channels/chan_iax2.c</span><br><span>+++ b/channels/chan_iax2.c</span><br><span>@@ -14714,23 +14714,54 @@</span><br><span> peers = users = iax_peercallno_pvts = iax_transfercallno_pvts = NULL;</span><br><span> peercnts = callno_limits = calltoken_ignores = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(peers = ao2_container_alloc(MAX_PEER_BUCKETS, peer_hash_cb, peer_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ peers = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, MAX_PEER_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ peer_hash_cb, NULL, peer_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!peers) {</span><br><span> goto container_fail;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (!(users = ao2_container_alloc(MAX_USER_BUCKETS, user_hash_cb, user_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ users = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, MAX_USER_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ user_hash_cb, NULL, user_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!users) {</span><br><span> goto container_fail;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (!(iax_peercallno_pvts = ao2_container_alloc(IAX_MAX_CALLS, pvt_hash_cb, pvt_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ iax_peercallno_pvts = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ IAX_MAX_CALLS, pvt_hash_cb, NULL, pvt_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!iax_peercallno_pvts) {</span><br><span> goto container_fail;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (!(iax_transfercallno_pvts = ao2_container_alloc(IAX_MAX_CALLS, transfercallno_pvt_hash_cb, transfercallno_pvt_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ iax_transfercallno_pvts = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ IAX_MAX_CALLS, transfercallno_pvt_hash_cb, NULL, transfercallno_pvt_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!iax_transfercallno_pvts) {</span><br><span> goto container_fail;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (!(peercnts = ao2_container_alloc(MAX_PEER_BUCKETS, peercnt_hash_cb, peercnt_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ peercnts = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, MAX_PEER_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ peercnt_hash_cb, NULL, peercnt_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!peercnts) {</span><br><span> goto container_fail;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (!(callno_limits = ao2_container_alloc(MAX_PEER_BUCKETS, addr_range_hash_cb, addr_range_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ callno_limits = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ MAX_PEER_BUCKETS, addr_range_hash_cb, NULL, addr_range_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!callno_limits) {</span><br><span> goto container_fail;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (!(calltoken_ignores = ao2_container_alloc(MAX_PEER_BUCKETS, addr_range_hash_cb, addr_range_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ calltoken_ignores = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ MAX_PEER_BUCKETS, addr_range_hash_cb, NULL, addr_range_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!calltoken_ignores) {</span><br><span> goto container_fail;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (create_callno_pools()) {</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (create_callno_pools()) {</span><br><span> goto container_fail;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (!(transmit_processor = ast_taskprocessor_get("iax2_transmit", TPS_REF_DEFAULT))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ transmit_processor = ast_taskprocessor_get("iax2_transmit", TPS_REF_DEFAULT);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!transmit_processor) {</span><br><span> goto container_fail;</span><br><span> }</span><br><span> </span><br><span>diff --git a/channels/chan_motif.c b/channels/chan_motif.c</span><br><span>index 05184ca..a9dd2af 100644</span><br><span>--- a/channels/chan_motif.c</span><br><span>+++ b/channels/chan_motif.c</span><br><span>@@ -471,7 +471,9 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(state->sessions = ao2_container_alloc(SESSION_BUCKETS, jingle_session_hash, jingle_session_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ state->sessions = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ SESSION_BUCKETS, jingle_session_hash, NULL, jingle_session_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!state->sessions) {</span><br><span> ao2_ref(state, -1);</span><br><span> return NULL;</span><br><span> }</span><br><span>@@ -601,7 +603,9 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cfg->endpoints = ao2_container_alloc(ENDPOINT_BUCKETS, jingle_endpoint_hash, jingle_endpoint_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg->endpoints = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ ENDPOINT_BUCKETS, jingle_endpoint_hash, NULL, jingle_endpoint_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cfg->endpoints) {</span><br><span> ao2_ref(cfg, -1);</span><br><span> return NULL;</span><br><span> }</span><br><span>diff --git a/channels/chan_sip.c b/channels/chan_sip.c</span><br><span>index cb81901..ac68f3d 100644</span><br><span>--- a/channels/chan_sip.c</span><br><span>+++ b/channels/chan_sip.c</span><br><span>@@ -1815,8 +1815,9 @@</span><br><span> {</span><br><span> int i, res = 0;</span><br><span> for (i = 0; i < ARRAY_LEN(event_state_compositors); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!((event_state_compositors[i].compositor) =</span><br><span style="color: hsl(0, 100%, 40%);">- ao2_container_alloc(ESC_MAX_BUCKETS, esc_hash_fn, esc_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ event_state_compositors[i].compositor = ao2_container_alloc_hash(</span><br><span style="color: hsl(120, 100%, 40%);">+ AO2_ALLOC_OPT_LOCK_MUTEX, 0, ESC_MAX_BUCKETS, esc_hash_fn, NULL, esc_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!event_state_compositors[i].compositor) {</span><br><span> res = -1;</span><br><span> }</span><br><span> }</span><br><span>@@ -35548,7 +35549,9 @@</span><br><span> unload_module();</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(sip_monitor_instances = ao2_container_alloc(37, sip_monitor_instance_hash_fn, sip_monitor_instance_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ sip_monitor_instances = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 37,</span><br><span style="color: hsl(120, 100%, 40%);">+ sip_monitor_instance_hash_fn, NULL, sip_monitor_instance_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!sip_monitor_instances) {</span><br><span> unload_module();</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span>diff --git a/channels/chan_unistim.c b/channels/chan_unistim.c</span><br><span>index 28d84ee..7051961 100644</span><br><span>--- a/channels/chan_unistim.c</span><br><span>+++ b/channels/chan_unistim.c</span><br><span>@@ -813,7 +813,9 @@</span><br><span> char tmp[1024], *p, *p_orig = NULL, *p_trans = NULL;</span><br><span> FILE *f;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(lang->trans = ao2_container_alloc(8, lang_hash_fn, lang_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ lang->trans = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 8,</span><br><span style="color: hsl(120, 100%, 40%);">+ lang_hash_fn, NULL, lang_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!lang->trans) {</span><br><span> ast_log(LOG_ERROR, "Unable to allocate container for translation!\n");</span><br><span> return str;</span><br><span> }</span><br><span>diff --git a/channels/sig_pri.c b/channels/sig_pri.c</span><br><span>index ec6d666..3675b0e 100644</span><br><span>--- a/channels/sig_pri.c</span><br><span>+++ b/channels/sig_pri.c</span><br><span>@@ -10133,8 +10133,8 @@</span><br><span> </span><br><span> #if defined(HAVE_PRI_CCSS)</span><br><span> sig_pri_cc_type_name = cc_type_name;</span><br><span style="color: hsl(0, 100%, 40%);">- sig_pri_cc_monitors = ao2_container_alloc(37, sig_pri_cc_monitor_instance_hash_fn,</span><br><span style="color: hsl(0, 100%, 40%);">- sig_pri_cc_monitor_instance_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ sig_pri_cc_monitors = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 37,</span><br><span style="color: hsl(120, 100%, 40%);">+ sig_pri_cc_monitor_instance_hash_fn, NULL, sig_pri_cc_monitor_instance_cmp_fn);</span><br><span> if (!sig_pri_cc_monitors) {</span><br><span> return -1;</span><br><span> }</span><br><span>diff --git a/funcs/func_dialgroup.c b/funcs/func_dialgroup.c</span><br><span>index e578000..9a98b3c 100644</span><br><span>--- a/funcs/func_dialgroup.c</span><br><span>+++ b/funcs/func_dialgroup.c</span><br><span>@@ -221,7 +221,8 @@</span><br><span> grhead = ao2_alloc(sizeof(*grhead), group_destroy);</span><br><span> if (!grhead)</span><br><span> return -1;</span><br><span style="color: hsl(0, 100%, 40%);">- grhead->entries = ao2_container_alloc(37, entry_hash_fn, entry_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ grhead->entries = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 37,</span><br><span style="color: hsl(120, 100%, 40%);">+ entry_hash_fn, NULL, entry_cmp_fn);</span><br><span> if (!grhead->entries) {</span><br><span> ao2_ref(grhead, -1);</span><br><span> return -1;</span><br><span>@@ -236,7 +237,9 @@</span><br><span> </span><br><span> /* Remove all existing */</span><br><span> ao2_ref(grhead->entries, -1);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(grhead->entries = ao2_container_alloc(37, entry_hash_fn, entry_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ grhead->entries = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 37,</span><br><span style="color: hsl(120, 100%, 40%);">+ entry_hash_fn, NULL, entry_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!grhead->entries) {</span><br><span> ao2_unlink(group_container, grhead);</span><br><span> ao2_ref(grhead, -1);</span><br><span> return -1;</span><br><span>@@ -297,7 +300,9 @@</span><br><span> struct ast_db_entry *dbtree, *tmp;</span><br><span> char groupname[AST_MAX_EXTENSION], *ptr;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if ((group_container = ao2_container_alloc(37, group_hash_fn, group_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ group_container = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 37,</span><br><span style="color: hsl(120, 100%, 40%);">+ group_hash_fn, NULL, group_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (group_container) {</span><br><span> /* Refresh groups from astdb */</span><br><span> if ((dbtree = ast_db_gettree("dialgroup", NULL))) {</span><br><span> for (tmp = dbtree; tmp; tmp = tmp->next) {</span><br><span>diff --git a/funcs/func_lock.c b/funcs/func_lock.c</span><br><span>index 5cb8310..acb5fc9 100644</span><br><span>--- a/funcs/func_lock.c</span><br><span>+++ b/funcs/func_lock.c</span><br><span>@@ -215,12 +215,6 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int ast_channel_hash_cb(const void *obj, const int flags)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- const struct ast_channel *chan = obj;</span><br><span style="color: hsl(0, 100%, 40%);">- return ast_str_case_hash(ast_channel_name(chan));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int ast_channel_cmp_cb(void *obj, void *arg, int flags)</span><br><span> {</span><br><span> struct ast_channel *chan = obj, *cmp_args = arg;</span><br><span>@@ -296,7 +290,9 @@</span><br><span> AST_LIST_UNLOCK(&locklist);</span><br><span> return -1;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(current->requesters = ao2_container_alloc(1, ast_channel_hash_cb, ast_channel_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ current->requesters = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ NULL, ast_channel_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!current->requesters) {</span><br><span> ast_mutex_destroy(¤t->mutex);</span><br><span> ast_cond_destroy(¤t->cond);</span><br><span> ast_free(current);</span><br><span>diff --git a/funcs/func_odbc.c b/funcs/func_odbc.c</span><br><span>index 66722df..9a124c1 100644</span><br><span>--- a/funcs/func_odbc.c</span><br><span>+++ b/funcs/func_odbc.c</span><br><span>@@ -1793,7 +1793,8 @@</span><br><span> dsns = NULL;</span><br><span> </span><br><span> if (single_db_connection) {</span><br><span style="color: hsl(0, 100%, 40%);">- dsns = ao2_container_alloc(DSN_BUCKETS, dsn_hash, dsn_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ dsns = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, DSN_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ dsn_hash, NULL, dsn_cmp);</span><br><span> if (!dsns) {</span><br><span> ast_log(LOG_ERROR, "Could not initialize DSN container\n");</span><br><span> ast_rwlock_unlock(&single_db_connection_lock);</span><br><span>@@ -1891,7 +1892,8 @@</span><br><span> }</span><br><span> </span><br><span> if (single_db_connection) {</span><br><span style="color: hsl(0, 100%, 40%);">- dsns = ao2_container_alloc(DSN_BUCKETS, dsn_hash, dsn_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ dsns = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, DSN_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ dsn_hash, NULL, dsn_cmp);</span><br><span> if (!dsns) {</span><br><span> ast_log(LOG_ERROR, "Could not initialize DSN container\n");</span><br><span> ast_rwlock_unlock(&single_db_connection_lock);</span><br><span>diff --git a/include/asterisk/astobj2.h b/include/asterisk/astobj2.h</span><br><span>index 39933c7..312daa5 100644</span><br><span>--- a/include/asterisk/astobj2.h</span><br><span>+++ b/include/asterisk/astobj2.h</span><br><span>@@ -93,7 +93,8 @@</span><br><span> </span><br><span> struct ao2_container *c;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- c = ao2_container_alloc(MAX_BUCKETS, my_hash_fn, my_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ c = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, MAX_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ my_hash_fn, NULL, my_cmp_fn);</span><br><span> \endcode</span><br><span> </span><br><span> where</span><br><span>@@ -109,7 +110,7 @@</span><br><span> other than the fact that they have been created by ao2_alloc().</span><br><span> All knowledge of the (user-defined) internals of the objects</span><br><span> is left to the (user-supplied) functions passed as arguments</span><br><span style="color: hsl(0, 100%, 40%);">-to ao2_container_alloc().</span><br><span style="color: hsl(120, 100%, 40%);">+to ao2_container_alloc_hash().</span><br><span> </span><br><span> If we want to insert an object in a container, we should</span><br><span> initialize its fields -- especially, those used by my_hash_fn() --</span><br><span>@@ -936,20 +937,8 @@</span><br><span> Internally, objects are stored in lists, hash tables or other</span><br><span> data structures depending on the needs.</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-\note NOTA BENE: at the moment the only container we support is the</span><br><span style="color: hsl(0, 100%, 40%);">- hash table and its degenerate form, the list.</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> Operations on container include:</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- - c = \b ao2_container_alloc(size, hash_fn, cmp_fn)</span><br><span style="color: hsl(0, 100%, 40%);">- allocate a container with desired size and default compare</span><br><span style="color: hsl(0, 100%, 40%);">- and hash function</span><br><span style="color: hsl(0, 100%, 40%);">- -The compare function returns an int, which</span><br><span style="color: hsl(0, 100%, 40%);">- can be 0 for not found, CMP_STOP to stop end a traversal,</span><br><span style="color: hsl(0, 100%, 40%);">- or CMP_MATCH if they are equal</span><br><span style="color: hsl(0, 100%, 40%);">- -The hash function returns an int. The hash function</span><br><span style="color: hsl(0, 100%, 40%);">- takes two argument, the object pointer and a flags field,</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> - \b ao2_find(c, arg, flags)</span><br><span> returns zero or more elements matching a given criteria</span><br><span> (specified as arg). 'c' is the container pointer. Flags</span><br><span>@@ -1298,26 +1287,6 @@</span><br><span> struct ao2_container;</span><br><span> </span><br><span> /*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \deprecated</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Allocate and initialize a hash container with the desired number of buckets.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * \details</span><br><span style="color: hsl(0, 100%, 40%);">- * We allocate space for a struct astobj_container, struct container</span><br><span style="color: hsl(0, 100%, 40%);">- * and the buckets[] array.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * \param n_buckets Number of buckets for hash</span><br><span style="color: hsl(0, 100%, 40%);">- * \param hash_fn Pointer to a function computing a hash value. (NULL if everyting goes in first bucket.)</span><br><span style="color: hsl(0, 100%, 40%);">- * \param cmp_fn Pointer to a compare function used by ao2_find. (NULL to match everything)</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * \return A pointer to a struct container.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * \note Destructor is set implicitly.</span><br><span style="color: hsl(0, 100%, 40%);">- * \note This is legacy container creation that is mapped to the new method.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-#define ao2_container_alloc(n_buckets, hash_fn, cmp_fn) \</span><br><span style="color: hsl(0, 100%, 40%);">- ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, (n_buckets), (hash_fn), NULL, (cmp_fn))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span> * \brief Allocate and initialize a hash container with the desired number of buckets.</span><br><span> *</span><br><span> * \details</span><br><span>diff --git a/main/cel.c b/main/cel.c</span><br><span>index 0ec728e..feb3bee 100644</span><br><span>--- a/main/cel.c</span><br><span>+++ b/main/cel.c</span><br><span>@@ -1561,15 +1561,16 @@</span><br><span> {</span><br><span> struct ao2_container *container;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- container = ao2_container_alloc(NUM_APP_BUCKETS, cel_linkedid_hash_fn, cel_linkedid_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ container = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ NUM_APP_BUCKETS, cel_linkedid_hash_fn, NULL, cel_linkedid_cmp_fn);</span><br><span> ao2_global_obj_replace_unref(cel_linkedids, container);</span><br><span> ao2_cleanup(container);</span><br><span> if (!container) {</span><br><span> return AST_MODULE_LOAD_FAILURE;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- container = ao2_container_alloc(NUM_DIALSTATUS_BUCKETS,</span><br><span style="color: hsl(0, 100%, 40%);">- cel_dialstatus_hash_fn, cel_dialstatus_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ container = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ NUM_DIALSTATUS_BUCKETS, cel_dialstatus_hash_fn, NULL, cel_dialstatus_cmp_fn);</span><br><span> ao2_global_obj_replace_unref(cel_dialstatus_store, container);</span><br><span> ao2_cleanup(container);</span><br><span> if (!container) {</span><br><span>@@ -1584,7 +1585,8 @@</span><br><span> return AST_MODULE_LOAD_FAILURE;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- container = ao2_container_alloc(BACKEND_BUCKETS, cel_backend_hash_fn, cel_backend_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ container = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, BACKEND_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ cel_backend_hash_fn, NULL, cel_backend_cmp_fn);</span><br><span> ao2_global_obj_replace_unref(cel_backends, container);</span><br><span> ao2_cleanup(container);</span><br><span> if (!container) {</span><br><span>diff --git a/main/channel.c b/main/channel.c</span><br><span>index a72439c..6c6e9f7 100644</span><br><span>--- a/main/channel.c</span><br><span>+++ b/main/channel.c</span><br><span>@@ -7856,8 +7856,8 @@</span><br><span> </span><br><span> int ast_channels_init(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- channels = ao2_container_alloc(NUM_CHANNEL_BUCKETS,</span><br><span style="color: hsl(0, 100%, 40%);">- ast_channel_hash_cb, ast_channel_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ channels = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NUM_CHANNEL_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_channel_hash_cb, NULL, ast_channel_cmp_cb);</span><br><span> if (!channels) {</span><br><span> return -1;</span><br><span> }</span><br><span>diff --git a/main/channel_internal_api.c b/main/channel_internal_api.c</span><br><span>index b926514..a963a7d 100644</span><br><span>--- a/main/channel_internal_api.c</span><br><span>+++ b/main/channel_internal_api.c</span><br><span>@@ -1302,7 +1302,9 @@</span><br><span> return ast_channel_unref(tmp);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(tmp->dialed_causes = ao2_container_alloc(DIALED_CAUSES_BUCKETS, pvt_cause_hash_fn, pvt_cause_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ tmp->dialed_causes = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ DIALED_CAUSES_BUCKETS, pvt_cause_hash_fn, NULL, pvt_cause_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!tmp->dialed_causes) {</span><br><span> return ast_channel_unref(tmp);</span><br><span> }</span><br><span> </span><br><span>diff --git a/main/config.c b/main/config.c</span><br><span>index 1961b24..f694c2b 100644</span><br><span>--- a/main/config.c</span><br><span>+++ b/main/config.c</span><br><span>@@ -2536,7 +2536,8 @@</span><br><span> struct ao2_container *fileset;</span><br><span> struct inclfile *fi;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- fileset = ao2_container_alloc(1023, hash_string, hashtab_compare_strings);</span><br><span style="color: hsl(120, 100%, 40%);">+ fileset = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 1023,</span><br><span style="color: hsl(120, 100%, 40%);">+ hash_string, NULL, hashtab_compare_strings);</span><br><span> if (!fileset) {</span><br><span> /* Container creation failed. */</span><br><span> return -1;</span><br><span>@@ -4104,8 +4105,12 @@</span><br><span> config_hook_cb hook_cb)</span><br><span> {</span><br><span> struct cfg_hook *hook;</span><br><span style="color: hsl(0, 100%, 40%);">- if (!cfg_hooks && !(cfg_hooks = ao2_container_alloc(17, hook_hash, hook_cmp))) {</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cfg_hooks) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg_hooks = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 17,</span><br><span style="color: hsl(120, 100%, 40%);">+ hook_hash, NULL, hook_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cfg_hooks) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> if (!(hook = ao2_alloc(sizeof(*hook), hook_destroy))) {</span><br><span>diff --git a/main/config_options.c b/main/config_options.c</span><br><span>index 2d5e09c..cbd7622 100644</span><br><span>--- a/main/config_options.c</span><br><span>+++ b/main/config_options.c</span><br><span>@@ -405,7 +405,8 @@</span><br><span> </span><br><span> struct ao2_container *aco_option_container_alloc(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return ao2_container_alloc(CONFIG_OPT_BUCKETS, config_opt_hash, config_opt_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ return ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, CONFIG_OPT_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ config_opt_hash, NULL, config_opt_cmp);</span><br><span> }</span><br><span> </span><br><span> static int internal_aco_type_category_check(struct aco_type *match, const char *category)</span><br><span>diff --git a/main/datastore.c b/main/datastore.c</span><br><span>index 5edad24..f37ee6c 100644</span><br><span>--- a/main/datastore.c</span><br><span>+++ b/main/datastore.c</span><br><span>@@ -94,7 +94,8 @@</span><br><span> </span><br><span> struct ao2_container *ast_datastores_alloc(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return ao2_container_alloc(DATASTORE_BUCKETS, ast_datastore_hash_fn, ast_datastore_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ return ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ DATASTORE_BUCKETS, ast_datastore_hash_fn, NULL, ast_datastore_cmp_fn);</span><br><span> }</span><br><span> </span><br><span> int ast_datastores_add(struct ao2_container *datastores, struct ast_datastore *datastore)</span><br><span>diff --git a/main/endpoints.c b/main/endpoints.c</span><br><span>index 3129fb4..030e26c 100644</span><br><span>--- a/main/endpoints.c</span><br><span>+++ b/main/endpoints.c</span><br><span>@@ -482,14 +482,14 @@</span><br><span> {</span><br><span> ast_register_cleanup(endpoint_cleanup);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- endpoints = ao2_container_alloc(ENDPOINT_BUCKETS, ast_endpoint_hash_fn,</span><br><span style="color: hsl(0, 100%, 40%);">- ast_endpoint_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ endpoints = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, ENDPOINT_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_endpoint_hash_fn, NULL, ast_endpoint_cmp_fn);</span><br><span> if (!endpoints) {</span><br><span> return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- tech_endpoints = ao2_container_alloc(TECH_ENDPOINT_BUCKETS, ast_endpoint_hash_fn,</span><br><span style="color: hsl(0, 100%, 40%);">- ast_endpoint_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ tech_endpoints = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ TECH_ENDPOINT_BUCKETS, ast_endpoint_hash_fn, NULL, ast_endpoint_cmp_fn);</span><br><span> if (!tech_endpoints) {</span><br><span> return -1;</span><br><span> }</span><br><span>diff --git a/main/indications.c b/main/indications.c</span><br><span>index 77755a9..1f77ca1 100644</span><br><span>--- a/main/indications.c</span><br><span>+++ b/main/indications.c</span><br><span>@@ -1133,8 +1133,8 @@</span><br><span> /*! \brief Load indications module */</span><br><span> static int load_module(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- ast_tone_zones = ao2_container_alloc(NUM_TONE_ZONE_BUCKETS,</span><br><span style="color: hsl(0, 100%, 40%);">- ast_tone_zone_hash, ast_tone_zone_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_tone_zones = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ NUM_TONE_ZONE_BUCKETS, ast_tone_zone_hash, NULL, ast_tone_zone_cmp);</span><br><span> if (!ast_tone_zones) {</span><br><span> return AST_MODULE_LOAD_FAILURE;</span><br><span> }</span><br><span>diff --git a/main/manager.c b/main/manager.c</span><br><span>index 0da023a..0469a73 100644</span><br><span>--- a/main/manager.c</span><br><span>+++ b/main/manager.c</span><br><span>@@ -2224,8 +2224,8 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- newsession->whitefilters = ao2_container_alloc(1, NULL, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- newsession->blackfilters = ao2_container_alloc(1, NULL, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ newsession->whitefilters = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ newsession->blackfilters = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, NULL);</span><br><span> if (!newsession->whitefilters || !newsession->blackfilters) {</span><br><span> ao2_ref(newsession, -1);</span><br><span> return NULL;</span><br><span>@@ -7639,7 +7639,8 @@</span><br><span> if (xml) {</span><br><span> ast_str_append(out, 0, "<response type='object' id='%s'><%s", dest, objtype);</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- vco = ao2_container_alloc(37, variable_count_hash_fn, variable_count_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ vco = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 37,</span><br><span style="color: hsl(120, 100%, 40%);">+ variable_count_hash_fn, NULL, variable_count_cmp_fn);</span><br><span> inobj = 1;</span><br><span> }</span><br><span> </span><br><span>@@ -9067,7 +9068,7 @@</span><br><span> #endif</span><br><span> </span><br><span> /* If you have a NULL hash fn, you only need a single bucket */</span><br><span style="color: hsl(0, 100%, 40%);">- sessions = ao2_container_alloc(1, NULL, mansession_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ sessions = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, mansession_cmp_fn);</span><br><span> if (!sessions) {</span><br><span> return -1;</span><br><span> }</span><br><span>@@ -9323,8 +9324,8 @@</span><br><span> /* Default allowmultiplelogin from [general] */</span><br><span> user->allowmultiplelogin = allowmultiplelogin;</span><br><span> user->writetimeout = 100;</span><br><span style="color: hsl(0, 100%, 40%);">- user->whitefilters = ao2_container_alloc(1, NULL, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- user->blackfilters = ao2_container_alloc(1, NULL, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ user->whitefilters = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ user->blackfilters = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, NULL);</span><br><span> if (!user->whitefilters || !user->blackfilters) {</span><br><span> manager_free_user(user);</span><br><span> break;</span><br><span>diff --git a/main/media_index.c b/main/media_index.c</span><br><span>index bfaa580..2d1bc6b 100644</span><br><span>--- a/main/media_index.c</span><br><span>+++ b/main/media_index.c</span><br><span>@@ -121,7 +121,8 @@</span><br><span> </span><br><span> memcpy(info->name, name, name_sz);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- info->variants = ao2_container_alloc(VARIANT_BUCKETS, media_variant_hash, media_variant_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ info->variants = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ VARIANT_BUCKETS, media_variant_hash, NULL, media_variant_cmp);</span><br><span> if (!info->variants) {</span><br><span> ao2_ref(info, -1);</span><br><span> </span><br><span>@@ -169,7 +170,8 @@</span><br><span> </span><br><span> memcpy(index->base_dir, base_dir, base_dir_sz);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- index->index = ao2_container_alloc(INDEX_BUCKETS, media_info_hash, media_info_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ index->index = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, INDEX_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ media_info_hash, NULL, media_info_cmp);</span><br><span> if (!index->index) {</span><br><span> ao2_ref(index, -1);</span><br><span> </span><br><span>diff --git a/main/message.c b/main/message.c</span><br><span>index b7d14f1..4874162 100644</span><br><span>--- a/main/message.c</span><br><span>+++ b/main/message.c</span><br><span>@@ -367,12 +367,6 @@</span><br><span> ao2_ref(msg, -1);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int msg_data_hash_fn(const void *obj, const int flags)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- const struct msg_data *data = obj;</span><br><span style="color: hsl(0, 100%, 40%);">- return ast_str_case_hash(data->name);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int msg_data_cmp_fn(void *obj, void *arg, int flags)</span><br><span> {</span><br><span> const struct msg_data *one = obj, *two = arg;</span><br><span>@@ -406,7 +400,9 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(msg->vars = ao2_container_alloc(1, msg_data_hash_fn, msg_data_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ msg->vars = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ NULL, msg_data_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!msg->vars) {</span><br><span> ao2_ref(msg, -1);</span><br><span> return NULL;</span><br><span> }</span><br><span>diff --git a/main/named_acl.c b/main/named_acl.c</span><br><span>index 8cf09c2..8e9da3a 100644</span><br><span>--- a/main/named_acl.c</span><br><span>+++ b/main/named_acl.c</span><br><span>@@ -131,7 +131,9 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cfg->named_acl_list = ao2_container_alloc(37, named_acl_hash_fn, named_acl_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg->named_acl_list = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 37,</span><br><span style="color: hsl(120, 100%, 40%);">+ named_acl_hash_fn, NULL, named_acl_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cfg->named_acl_list) {</span><br><span> goto error;</span><br><span> }</span><br><span> </span><br><span>diff --git a/main/pbx.c b/main/pbx.c</span><br><span>index 0a23735..9e19f35 100644</span><br><span>--- a/main/pbx.c</span><br><span>+++ b/main/pbx.c</span><br><span>@@ -3953,7 +3953,7 @@</span><br><span> AST_VECTOR_INIT(&hint_new->devices, 8);</span><br><span> </span><br><span> /* Initialize new hint. */</span><br><span style="color: hsl(0, 100%, 40%);">- hint_new->callbacks = ao2_container_alloc(1, NULL, hint_id_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ hint_new->callbacks = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, hint_id_cmp);</span><br><span> if (!hint_new->callbacks) {</span><br><span> ao2_ref(hint_new, -1);</span><br><span> return -1;</span><br><span>@@ -8912,11 +8912,13 @@</span><br><span> </span><br><span> int ast_pbx_init(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- hints = ao2_container_alloc(HASH_EXTENHINT_SIZE, hint_hash, hint_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ hints = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ HASH_EXTENHINT_SIZE, hint_hash, NULL, hint_cmp);</span><br><span> if (hints) {</span><br><span> ao2_container_register("hints", hints, print_hints_key);</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- hintdevices = ao2_container_alloc(HASH_EXTENHINT_SIZE, hintdevice_hash_cb, hintdevice_cmp_multiple);</span><br><span style="color: hsl(120, 100%, 40%);">+ hintdevices = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ HASH_EXTENHINT_SIZE, hintdevice_hash_cb, NULL, hintdevice_cmp_multiple);</span><br><span> if (hintdevices) {</span><br><span> ao2_container_register("hintdevices", hintdevices, print_hintdevices_key);</span><br><span> }</span><br><span>@@ -8926,7 +8928,7 @@</span><br><span> if (autohints) {</span><br><span> ao2_container_register("autohints", autohints, print_autohint_key);</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- statecbs = ao2_container_alloc(1, NULL, statecbs_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ statecbs = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, statecbs_cmp);</span><br><span> if (statecbs) {</span><br><span> ao2_container_register("statecbs", statecbs, print_statecbs_key);</span><br><span> }</span><br><span>diff --git a/main/stasis.c b/main/stasis.c</span><br><span>index 93112d9..f4b992e 100644</span><br><span>--- a/main/stasis.c</span><br><span>+++ b/main/stasis.c</span><br><span>@@ -1283,8 +1283,8 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- pool->pool_container = ao2_container_alloc(TOPIC_POOL_BUCKETS,</span><br><span style="color: hsl(0, 100%, 40%);">- topic_pool_entry_hash, topic_pool_entry_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ pool->pool_container = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ TOPIC_POOL_BUCKETS, topic_pool_entry_hash, NULL, topic_pool_entry_cmp);</span><br><span> if (!pool->pool_container) {</span><br><span> ao2_cleanup(pool);</span><br><span> return NULL;</span><br><span>diff --git a/main/stasis_channels.c b/main/stasis_channels.c</span><br><span>index 8041c8e..0da8005 100644</span><br><span>--- a/main/stasis_channels.c</span><br><span>+++ b/main/stasis_channels.c</span><br><span>@@ -615,8 +615,8 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- obj->channel_snapshots = ao2_container_alloc(NUM_MULTI_CHANNEL_BLOB_BUCKETS,</span><br><span style="color: hsl(0, 100%, 40%);">- channel_role_hash_cb, channel_role_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ obj->channel_snapshots = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ NUM_MULTI_CHANNEL_BLOB_BUCKETS, channel_role_hash_cb, NULL, channel_role_cmp_cb);</span><br><span> if (!obj->channel_snapshots) {</span><br><span> ao2_ref(obj, -1);</span><br><span> return NULL;</span><br><span>@@ -719,8 +719,9 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ret_container = ao2_container_alloc(NUM_MULTI_CHANNEL_BLOB_BUCKETS,</span><br><span style="color: hsl(0, 100%, 40%);">- channel_snapshot_hash_cb, channel_snapshot_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ ret_container = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ NUM_MULTI_CHANNEL_BLOB_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ channel_snapshot_hash_cb, NULL, channel_snapshot_cmp_cb);</span><br><span> if (!ret_container) {</span><br><span> return NULL;</span><br><span> }</span><br><span>diff --git a/main/taskprocessor.c b/main/taskprocessor.c</span><br><span>index 68bd29c..30aeddb 100644</span><br><span>--- a/main/taskprocessor.c</span><br><span>+++ b/main/taskprocessor.c</span><br><span>@@ -278,7 +278,9 @@</span><br><span> /* initialize the taskprocessor container and register CLI operations */</span><br><span> int ast_tps_init(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(tps_singletons = ao2_container_alloc(TPS_MAX_BUCKETS, tps_hash_cb, tps_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ tps_singletons = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ TPS_MAX_BUCKETS, tps_hash_cb, NULL, tps_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!tps_singletons) {</span><br><span> ast_log(LOG_ERROR, "taskprocessor container failed to initialize!\n");</span><br><span> return -1;</span><br><span> }</span><br><span>diff --git a/main/threadpool.c b/main/threadpool.c</span><br><span>index 7729930..2ab0936 100644</span><br><span>--- a/main/threadpool.c</span><br><span>+++ b/main/threadpool.c</span><br><span>@@ -420,15 +420,18 @@</span><br><span> if (!pool->control_tps) {</span><br><span> return NULL;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- pool->active_threads = ao2_container_alloc(THREAD_BUCKETS, worker_thread_hash, worker_thread_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ pool->active_threads = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ THREAD_BUCKETS, worker_thread_hash, NULL, worker_thread_cmp);</span><br><span> if (!pool->active_threads) {</span><br><span> return NULL;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- pool->idle_threads = ao2_container_alloc(THREAD_BUCKETS, worker_thread_hash, worker_thread_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ pool->idle_threads = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ THREAD_BUCKETS, worker_thread_hash, NULL, worker_thread_cmp);</span><br><span> if (!pool->idle_threads) {</span><br><span> return NULL;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- pool->zombie_threads = ao2_container_alloc(THREAD_BUCKETS, worker_thread_hash, worker_thread_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ pool->zombie_threads = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ THREAD_BUCKETS, worker_thread_hash, NULL, worker_thread_cmp);</span><br><span> if (!pool->zombie_threads) {</span><br><span> return NULL;</span><br><span> }</span><br><span>diff --git a/main/xmldoc.c b/main/xmldoc.c</span><br><span>index 43ae074..8b273f0 100644</span><br><span>--- a/main/xmldoc.c</span><br><span>+++ b/main/xmldoc.c</span><br><span>@@ -2657,7 +2657,9 @@</span><br><span> struct documentation_tree *doctree;</span><br><span> const char *name;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(docs = ao2_container_alloc(127, ast_xml_doc_item_hash, ast_xml_doc_item_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ docs = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 127,</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_xml_doc_item_hash, NULL, ast_xml_doc_item_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!docs) {</span><br><span> ast_log(AST_LOG_ERROR, "Failed to create container for xml document item instances\n");</span><br><span> return NULL;</span><br><span> }</span><br><span>diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c</span><br><span>index 29d2e08..75e6654 100644</span><br><span>--- a/pbx/pbx_realtime.c</span><br><span>+++ b/pbx/pbx_realtime.c</span><br><span>@@ -401,7 +401,9 @@</span><br><span> </span><br><span> static int load_module(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cache = ao2_container_alloc(573, cache_hash, cache_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cache = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 573,</span><br><span style="color: hsl(120, 100%, 40%);">+ cache_hash, NULL, cache_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cache) {</span><br><span> return AST_MODULE_LOAD_FAILURE;</span><br><span> }</span><br><span> </span><br><span>diff --git a/res/ari/resource_events.c b/res/ari/resource_events.c</span><br><span>index 5a8e898..5983f7b 100644</span><br><span>--- a/res/ari/resource_events.c</span><br><span>+++ b/res/ari/resource_events.c</span><br><span>@@ -467,9 +467,8 @@</span><br><span> int ast_ari_websocket_events_event_websocket_init(void)</span><br><span> {</span><br><span> /* Try to instantiate the registry */</span><br><span style="color: hsl(0, 100%, 40%);">- event_session_registry = ao2_container_alloc(EVENT_SESSION_NUM_BUCKETS,</span><br><span style="color: hsl(0, 100%, 40%);">- event_session_hash,</span><br><span style="color: hsl(0, 100%, 40%);">- event_session_compare);</span><br><span style="color: hsl(120, 100%, 40%);">+ event_session_registry = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ EVENT_SESSION_NUM_BUCKETS, event_session_hash, NULL, event_session_compare);</span><br><span> if (!event_session_registry) {</span><br><span> /* This is bad, bad. */</span><br><span> ast_log(LOG_WARNING,</span><br><span>diff --git a/res/res_calendar.c b/res/res_calendar.c</span><br><span>index c46307f..f629e3d 100644</span><br><span>--- a/res/res_calendar.c</span><br><span>+++ b/res/res_calendar.c</span><br><span>@@ -415,7 +415,9 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cal->events = ao2_container_alloc(CALENDAR_BUCKETS, event_hash_fn, event_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cal->events = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ CALENDAR_BUCKETS, event_hash_fn, NULL, event_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cal->events) {</span><br><span> ast_log(LOG_ERROR, "Could not allocate events container for %s\n", cat);</span><br><span> cal = unref_calendar(cal);</span><br><span> return NULL;</span><br><span>@@ -686,7 +688,8 @@</span><br><span> </span><br><span> struct ao2_container *ast_calendar_event_container_alloc(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return ao2_container_alloc(CALENDAR_BUCKETS, event_hash_fn, event_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ return ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, CALENDAR_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ event_hash_fn, NULL, event_cmp_fn);</span><br><span> }</span><br><span> </span><br><span> static void event_notification_destroy(void *data)</span><br><span>@@ -1896,7 +1899,9 @@</span><br><span> */</span><br><span> static int load_module(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(calendars = ao2_container_alloc(CALENDAR_BUCKETS, calendar_hash_fn, calendar_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ calendars = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, CALENDAR_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ calendar_hash_fn, NULL, calendar_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!calendars) {</span><br><span> ast_log(LOG_ERROR, "Unable to allocate calendars container!\n");</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span>diff --git a/res/res_clialiases.c b/res/res_clialiases.c</span><br><span>index eaf9b9f..9658c17 100644</span><br><span>--- a/res/res_clialiases.c</span><br><span>+++ b/res/res_clialiases.c</span><br><span>@@ -282,7 +282,9 @@</span><br><span> */</span><br><span> static int load_module(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cli_aliases = ao2_container_alloc(MAX_ALIAS_BUCKETS, alias_hash_cb, alias_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cli_aliases = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ MAX_ALIAS_BUCKETS, alias_hash_cb, NULL, alias_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cli_aliases) {</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span> </span><br><span>diff --git a/res/res_config_sqlite3.c b/res/res_config_sqlite3.c</span><br><span>index 854034f..6446f17 100644</span><br><span>--- a/res/res_config_sqlite3.c</span><br><span>+++ b/res/res_config_sqlite3.c</span><br><span>@@ -1194,7 +1194,9 @@</span><br><span> return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(columns = ao2_container_alloc(31, str_hash_fn, str_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ columns = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 31,</span><br><span style="color: hsl(120, 100%, 40%);">+ str_hash_fn, NULL, str_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!columns) {</span><br><span> unref_db(&db);</span><br><span> return -1;</span><br><span> }</span><br><span>@@ -1369,7 +1371,9 @@</span><br><span> {</span><br><span> discover_sqlite3_caps();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!((databases = ao2_container_alloc(DB_BUCKETS, db_hash_fn, db_cmp_fn)))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ databases = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, DB_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ db_hash_fn, NULL, db_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!databases) {</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span> </span><br><span>diff --git a/res/res_corosync.c b/res/res_corosync.c</span><br><span>index 50dd510..bf172e3 100644</span><br><span>--- a/res/res_corosync.c</span><br><span>+++ b/res/res_corosync.c</span><br><span>@@ -1125,7 +1125,8 @@</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- nodes = ao2_container_alloc(23, corosync_node_hash_fn, corosync_node_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ nodes = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 23,</span><br><span style="color: hsl(120, 100%, 40%);">+ corosync_node_hash_fn, NULL, corosync_node_cmp_fn);</span><br><span> if (!nodes) {</span><br><span> goto failed;</span><br><span> }</span><br><span>diff --git a/res/res_fax.c b/res/res_fax.c</span><br><span>index f03fdc9..39a7a64 100644</span><br><span>--- a/res/res_fax.c</span><br><span>+++ b/res/res_fax.c</span><br><span>@@ -4724,7 +4724,9 @@</span><br><span> /* initialize the registry */</span><br><span> faxregistry.active_sessions = 0;</span><br><span> faxregistry.reserved_sessions = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(faxregistry.container = ao2_container_alloc(FAX_MAXBUCKETS, session_hash_cb, session_cmp_cb))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ faxregistry.container = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ FAX_MAXBUCKETS, session_hash_cb, NULL, session_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!faxregistry.container) {</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span> </span><br><span>diff --git a/res/res_http_websocket.c b/res/res_http_websocket.c</span><br><span>index d64ecba..0b75721 100644</span><br><span>--- a/res/res_http_websocket.c</span><br><span>+++ b/res/res_http_websocket.c</span><br><span>@@ -147,7 +147,8 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- server->protocols = ao2_container_alloc(MAX_PROTOCOL_BUCKETS, protocol_hash_fn, protocol_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ server->protocols = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ MAX_PROTOCOL_BUCKETS, protocol_hash_fn, NULL, protocol_cmp_fn);</span><br><span> if (!server->protocols) {</span><br><span> return NULL;</span><br><span> }</span><br><span>diff --git a/res/res_odbc.c b/res/res_odbc.c</span><br><span>index 1c82e3f..a9fe7c7 100644</span><br><span>--- a/res/res_odbc.c</span><br><span>+++ b/res/res_odbc.c</span><br><span>@@ -178,11 +178,6 @@</span><br><span> ast_cond_destroy(&class->cond);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int null_hash_fn(const void *obj, const int flags)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void odbc_obj_destructor(void *data)</span><br><span> {</span><br><span> struct odbc_obj *obj = data;</span><br><span>@@ -1001,7 +996,8 @@</span><br><span> </span><br><span> static int load_module(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(class_container = ao2_container_alloc(1, null_hash_fn, ao2_match_by_addr))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ class_container = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, ao2_match_by_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!class_container) {</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span> </span><br><span>diff --git a/res/res_parking.c b/res/res_parking.c</span><br><span>index fa76c48..470396d 100644</span><br><span>--- a/res/res_parking.c</span><br><span>+++ b/res/res_parking.c</span><br><span>@@ -382,7 +382,9 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cfg->parking_lots = ao2_container_alloc(37, parking_lot_cfg_hash_fn, parking_lot_cfg_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg->parking_lots = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 37,</span><br><span style="color: hsl(120, 100%, 40%);">+ parking_lot_cfg_hash_fn, NULL, parking_lot_cfg_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cfg->parking_lots) {</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span>diff --git a/res/res_phoneprov.c b/res/res_phoneprov.c</span><br><span>index 70e1333..9b26ab2 100644</span><br><span>--- a/res/res_phoneprov.c</span><br><span>+++ b/res/res_phoneprov.c</span><br><span>@@ -1413,13 +1413,15 @@</span><br><span> */</span><br><span> static int load_module(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- profiles = ao2_container_alloc(MAX_PROFILE_BUCKETS, phone_profile_hash_fn, phone_profile_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ profiles = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, MAX_PROFILE_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ phone_profile_hash_fn, NULL, phone_profile_cmp_fn);</span><br><span> if (!profiles) {</span><br><span> ast_log(LOG_ERROR, "Unable to allocate profiles container.\n");</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- http_routes = ao2_container_alloc(MAX_ROUTE_BUCKETS, http_route_hash_fn, http_route_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ http_routes = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, MAX_ROUTE_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ http_route_hash_fn, NULL, http_route_cmp_fn);</span><br><span> if (!http_routes) {</span><br><span> ast_log(LOG_ERROR, "Unable to allocate routes container.\n");</span><br><span> goto error;</span><br><span>@@ -1430,13 +1432,15 @@</span><br><span> goto error;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- users = ao2_container_alloc(MAX_USER_BUCKETS, user_hash_fn, user_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ users = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, MAX_USER_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ user_hash_fn, NULL, user_cmp_fn);</span><br><span> if (!users) {</span><br><span> ast_log(LOG_ERROR, "Unable to allocate users container.\n");</span><br><span> goto error;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- providers = ao2_container_alloc(MAX_PROVIDER_BUCKETS, phoneprov_provider_hash_fn, phoneprov_provider_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ providers = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ MAX_PROVIDER_BUCKETS, phoneprov_provider_hash_fn, NULL, phoneprov_provider_cmp_fn);</span><br><span> if (!providers) {</span><br><span> ast_log(LOG_ERROR, "Unable to allocate providers container.\n");</span><br><span> goto error;</span><br><span>diff --git a/res/res_pjsip/config_transport.c b/res/res_pjsip/config_transport.c</span><br><span>index a84fee0..404f513 100644</span><br><span>--- a/res/res_pjsip/config_transport.c</span><br><span>+++ b/res/res_pjsip/config_transport.c</span><br><span>@@ -1575,7 +1575,8 @@</span><br><span> </span><br><span> struct ao2_container *ast_sip_get_transport_states(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct ao2_container *states = ao2_container_alloc(DEFAULT_STATE_BUCKETS, transport_state_hash, transport_state_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ao2_container *states = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ DEFAULT_STATE_BUCKETS, transport_state_hash, NULL, transport_state_cmp);</span><br><span> </span><br><span> if (!states) {</span><br><span> return NULL;</span><br><span>@@ -1592,7 +1593,8 @@</span><br><span> struct ao2_container *transports = NULL;</span><br><span> </span><br><span> /* Create outbound registration states container. */</span><br><span style="color: hsl(0, 100%, 40%);">- transport_states = ao2_container_alloc(DEFAULT_STATE_BUCKETS, internal_state_hash, internal_state_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ transport_states = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ DEFAULT_STATE_BUCKETS, internal_state_hash, NULL, internal_state_cmp);</span><br><span> if (!transport_states) {</span><br><span> ast_log(LOG_ERROR, "Unable to allocate transport states container\n");</span><br><span> return -1;</span><br><span>diff --git a/res/res_pjsip/pjsip_transport_management.c b/res/res_pjsip/pjsip_transport_management.c</span><br><span>index efacb58..a3cfde9 100644</span><br><span>--- a/res/res_pjsip/pjsip_transport_management.c</span><br><span>+++ b/res/res_pjsip/pjsip_transport_management.c</span><br><span>@@ -354,8 +354,8 @@</span><br><span> {</span><br><span> struct ao2_container *transports;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- transports = ao2_container_alloc(TRANSPORTS_BUCKETS, monitored_transport_hash_fn,</span><br><span style="color: hsl(0, 100%, 40%);">- monitored_transport_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ transports = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, TRANSPORTS_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ monitored_transport_hash_fn, NULL, monitored_transport_cmp_fn);</span><br><span> if (!transports) {</span><br><span> ast_log(LOG_ERROR, "Could not create container for transports to perform keepalive on.\n");</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span>diff --git a/res/res_pjsip_exten_state.c b/res/res_pjsip_exten_state.c</span><br><span>index 47ec8b4..df9a35f 100644</span><br><span>--- a/res/res_pjsip_exten_state.c</span><br><span>+++ b/res/res_pjsip_exten_state.c</span><br><span>@@ -959,8 +959,8 @@</span><br><span> </span><br><span> static int load_module(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- publishers = ao2_container_alloc(PUBLISHER_BUCKETS, exten_state_publisher_hash,</span><br><span style="color: hsl(0, 100%, 40%);">- exten_state_publisher_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ publishers = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ PUBLISHER_BUCKETS, exten_state_publisher_hash, NULL, exten_state_publisher_cmp);</span><br><span> if (!publishers) {</span><br><span> ast_log(LOG_WARNING, "Unable to create container to store extension state publishers\n");</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span>diff --git a/res/res_pjsip_mwi.c b/res/res_pjsip_mwi.c</span><br><span>index 83bff88..eeb8a18 100644</span><br><span>--- a/res/res_pjsip_mwi.c</span><br><span>+++ b/res/res_pjsip_mwi.c</span><br><span>@@ -361,7 +361,8 @@</span><br><span> sub->sip_sub = sip_sub;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- sub->stasis_subs = ao2_container_alloc(STASIS_BUCKETS, stasis_sub_hash, stasis_sub_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ sub->stasis_subs = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ STASIS_BUCKETS, stasis_sub_hash, NULL, stasis_sub_cmp);</span><br><span> if (!sub->stasis_subs) {</span><br><span> ao2_cleanup(sub);</span><br><span> return NULL;</span><br><span>diff --git a/res/res_pjsip_outbound_publish.c b/res/res_pjsip_outbound_publish.c</span><br><span>index d9a8b64..68699a2 100644</span><br><span>--- a/res/res_pjsip_outbound_publish.c</span><br><span>+++ b/res/res_pjsip_outbound_publish.c</span><br><span>@@ -1437,14 +1437,16 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- state->client->datastores = ao2_container_alloc(DATASTORE_BUCKETS, datastore_hash, datastore_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ state->client->datastores = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ DATASTORE_BUCKETS, datastore_hash, NULL, datastore_cmp);</span><br><span> if (!state->client->datastores) {</span><br><span> ao2_ref(state, -1);</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- state->client->publishers = ao2_container_alloc(DATASTORE_BUCKETS, sip_outbound_publisher_hash_fn,</span><br><span style="color: hsl(0, 100%, 40%);">- sip_outbound_publisher_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ state->client->publishers = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ DATASTORE_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ sip_outbound_publisher_hash_fn, NULL, sip_outbound_publisher_cmp_fn);</span><br><span> if (!state->client->publishers) {</span><br><span> ao2_ref(state, -1);</span><br><span> return NULL;</span><br><span>diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c</span><br><span>index 33129c8..da597a9 100644</span><br><span>--- a/res/res_pjsip_outbound_registration.c</span><br><span>+++ b/res/res_pjsip_outbound_registration.c</span><br><span>@@ -2444,8 +2444,8 @@</span><br><span> }</span><br><span> </span><br><span> /* Create outbound registration states container. */</span><br><span style="color: hsl(0, 100%, 40%);">- new_states = ao2_container_alloc(DEFAULT_STATE_BUCKETS,</span><br><span style="color: hsl(0, 100%, 40%);">- registration_state_hash, registration_state_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ new_states = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ DEFAULT_STATE_BUCKETS, registration_state_hash, NULL, registration_state_cmp);</span><br><span> if (!new_states) {</span><br><span> ast_log(LOG_ERROR, "Unable to allocate registration states container\n");</span><br><span> unload_module();</span><br><span>diff --git a/res/res_pjsip_pubsub.c b/res/res_pjsip_pubsub.c</span><br><span>index 9e8a32b..394b1ac 100644</span><br><span>--- a/res/res_pjsip_pubsub.c</span><br><span>+++ b/res/res_pjsip_pubsub.c</span><br><span>@@ -2676,8 +2676,9 @@</span><br><span> return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(handler->publications = ao2_container_alloc(PUBLICATIONS_BUCKETS,</span><br><span style="color: hsl(0, 100%, 40%);">- publication_hash_fn, publication_cmp_fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ handler->publications = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ PUBLICATIONS_BUCKETS, publication_hash_fn, NULL, publication_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!handler->publications) {</span><br><span> ast_log(LOG_ERROR, "Could not allocate publications container for event '%s'\n",</span><br><span> handler->event_name);</span><br><span> return -1;</span><br><span>diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c</span><br><span>index 4ce35c9..94240d3 100644</span><br><span>--- a/res/res_pjsip_session.c</span><br><span>+++ b/res/res_pjsip_session.c</span><br><span>@@ -2181,7 +2181,8 @@</span><br><span> if (!session->direct_media_cap) {</span><br><span> return NULL;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- session->datastores = ao2_container_alloc(DATASTORE_BUCKETS, datastore_hash, datastore_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ session->datastores = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ DATASTORE_BUCKETS, datastore_hash, NULL, datastore_cmp);</span><br><span> if (!session->datastores) {</span><br><span> return NULL;</span><br><span> }</span><br><span>@@ -4271,8 +4272,8 @@</span><br><span> }</span><br><span> nat_hook->outgoing_external_message = session_outgoing_nat_hook;</span><br><span> ast_sorcery_create(ast_sip_get_sorcery(), nat_hook);</span><br><span style="color: hsl(0, 100%, 40%);">- sdp_handlers = ao2_container_alloc(SDP_HANDLER_BUCKETS,</span><br><span style="color: hsl(0, 100%, 40%);">- sdp_handler_list_hash, sdp_handler_list_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ sdp_handlers = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ SDP_HANDLER_BUCKETS, sdp_handler_list_hash, NULL, sdp_handler_list_cmp);</span><br><span> if (!sdp_handlers) {</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span>diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c</span><br><span>index 465f9bc..00d8883 100644</span><br><span>--- a/res/res_rtp_asterisk.c</span><br><span>+++ b/res/res_rtp_asterisk.c</span><br><span>@@ -686,9 +686,12 @@</span><br><span> return;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!rtp->ice_proposed_remote_candidates &&</span><br><span style="color: hsl(0, 100%, 40%);">- !(rtp->ice_proposed_remote_candidates = ao2_container_alloc(1, NULL, ice_candidate_cmp))) {</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!rtp->ice_proposed_remote_candidates) {</span><br><span style="color: hsl(120, 100%, 40%);">+ rtp->ice_proposed_remote_candidates = ao2_container_alloc_list(</span><br><span style="color: hsl(120, 100%, 40%);">+ AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, ice_candidate_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!rtp->ice_proposed_remote_candidates) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> /* If this is going to exceed the maximum number of ICE candidates don't even add it */</span><br><span>@@ -1103,8 +1106,12 @@</span><br><span> </span><br><span> pj_ice_calc_foundation(rtp->ice->real_ice->pool, &foundation, type, addr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!rtp->ice_local_candidates && !(rtp->ice_local_candidates = ao2_container_alloc(1, NULL, ice_candidate_cmp))) {</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!rtp->ice_local_candidates) {</span><br><span style="color: hsl(120, 100%, 40%);">+ rtp->ice_local_candidates = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ NULL, ice_candidate_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!rtp->ice_local_candidates) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> if (!(candidate = ao2_alloc(sizeof(*candidate), ast_rtp_ice_candidate_destroy))) {</span><br><span>diff --git a/res/res_sorcery_memory.c b/res/res_sorcery_memory.c</span><br><span>index 6c91dad..1e8bef9 100644</span><br><span>--- a/res/res_sorcery_memory.c</span><br><span>+++ b/res/res_sorcery_memory.c</span><br><span>@@ -250,7 +250,8 @@</span><br><span> </span><br><span> static void *sorcery_memory_open(const char *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return ao2_container_alloc(OBJECT_BUCKETS, sorcery_memory_hash, sorcery_memory_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ return ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, OBJECT_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ sorcery_memory_hash, NULL, sorcery_memory_cmp);</span><br><span> }</span><br><span> </span><br><span> static void sorcery_memory_close(void *data)</span><br><span>diff --git a/res/res_sorcery_memory_cache.c b/res/res_sorcery_memory_cache.c</span><br><span>index 9a1ade0..42da727 100644</span><br><span>--- a/res/res_sorcery_memory_cache.c</span><br><span>+++ b/res/res_sorcery_memory_cache.c</span><br><span>@@ -3528,7 +3528,8 @@</span><br><span> {</span><br><span> int res;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- caches = ao2_container_alloc(CACHES_CONTAINER_BUCKET_SIZE, sorcery_memory_cache_hash,</span><br><span style="color: hsl(120, 100%, 40%);">+ caches = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ CACHES_CONTAINER_BUCKET_SIZE, sorcery_memory_cache_hash, NULL,</span><br><span> sorcery_memory_cache_cmp);</span><br><span> if (!caches) {</span><br><span> ast_log(LOG_ERROR, "Failed to create container for configured caches\n");</span><br><span>diff --git a/res/res_stasis.c b/res/res_stasis.c</span><br><span>index 82d8792..704d779 100644</span><br><span>--- a/res/res_stasis.c</span><br><span>+++ b/res/res_stasis.c</span><br><span>@@ -2167,9 +2167,12 @@</span><br><span> if (STASIS_MESSAGE_TYPE_INIT(end_message_type) != 0) {</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- apps_registry = ao2_container_alloc(APPS_NUM_BUCKETS, app_hash, app_compare);</span><br><span style="color: hsl(0, 100%, 40%);">- app_controls = ao2_container_alloc(CONTROLS_NUM_BUCKETS, control_hash, control_compare);</span><br><span style="color: hsl(0, 100%, 40%);">- app_bridges = ao2_container_alloc(BRIDGES_NUM_BUCKETS, bridges_hash, bridges_compare);</span><br><span style="color: hsl(120, 100%, 40%);">+ apps_registry = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ APPS_NUM_BUCKETS, app_hash, NULL, app_compare);</span><br><span style="color: hsl(120, 100%, 40%);">+ app_controls = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ CONTROLS_NUM_BUCKETS, control_hash, NULL, control_compare);</span><br><span style="color: hsl(120, 100%, 40%);">+ app_bridges = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ BRIDGES_NUM_BUCKETS, bridges_hash, NULL, bridges_compare);</span><br><span> app_bridges_moh = ao2_container_alloc_hash(</span><br><span> AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span> 37, bridges_channel_hash_fn, NULL, NULL);</span><br><span>diff --git a/res/res_stasis_device_state.c b/res/res_stasis_device_state.c</span><br><span>index 1c80f9e..71b9c15 100644</span><br><span>--- a/res/res_stasis_device_state.c</span><br><span>+++ b/res/res_stasis_device_state.c</span><br><span>@@ -461,9 +461,10 @@</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(device_state_subscriptions = ao2_container_alloc(</span><br><span style="color: hsl(0, 100%, 40%);">- DEVICE_STATE_BUCKETS, device_state_subscriptions_hash,</span><br><span style="color: hsl(0, 100%, 40%);">- device_state_subscriptions_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ device_state_subscriptions = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ DEVICE_STATE_BUCKETS, device_state_subscriptions_hash, NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+ device_state_subscriptions_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!device_state_subscriptions) {</span><br><span> ast_devstate_prov_del(DEVICE_STATE_PROVIDER_STASIS);</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span>diff --git a/res/res_stasis_playback.c b/res/res_stasis_playback.c</span><br><span>index a25a300..4a8e84d 100644</span><br><span>--- a/res/res_stasis_playback.c</span><br><span>+++ b/res/res_stasis_playback.c</span><br><span>@@ -738,8 +738,8 @@</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- playbacks = ao2_container_alloc(PLAYBACK_BUCKETS, playback_hash,</span><br><span style="color: hsl(0, 100%, 40%);">- playback_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ playbacks = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, PLAYBACK_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ playback_hash, NULL, playback_cmp);</span><br><span> if (!playbacks) {</span><br><span> STASIS_MESSAGE_TYPE_CLEANUP(stasis_app_playback_snapshot_type);</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span>diff --git a/res/res_stasis_recording.c b/res/res_stasis_recording.c</span><br><span>index 755bdcf..4077fc8 100644</span><br><span>--- a/res/res_stasis_recording.c</span><br><span>+++ b/res/res_stasis_recording.c</span><br><span>@@ -634,8 +634,8 @@</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- recordings = ao2_container_alloc(RECORDING_BUCKETS, recording_hash,</span><br><span style="color: hsl(0, 100%, 40%);">- recording_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ recordings = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, RECORDING_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ recording_hash, NULL, recording_cmp);</span><br><span> if (!recordings) {</span><br><span> STASIS_MESSAGE_TYPE_CLEANUP(stasis_app_recording_snapshot_type);</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span>diff --git a/res/res_timing_pthread.c b/res/res_timing_pthread.c</span><br><span>index bcc9eb0..c101579 100644</span><br><span>--- a/res/res_timing_pthread.c</span><br><span>+++ b/res/res_timing_pthread.c</span><br><span>@@ -440,8 +440,9 @@</span><br><span> </span><br><span> static int load_module(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(pthread_timers = ao2_container_alloc(PTHREAD_TIMER_BUCKETS,</span><br><span style="color: hsl(0, 100%, 40%);">- pthread_timer_hash, pthread_timer_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ pthread_timers = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ PTHREAD_TIMER_BUCKETS, pthread_timer_hash, NULL, pthread_timer_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!pthread_timers) {</span><br><span> return AST_MODULE_LOAD_DECLINE;</span><br><span> }</span><br><span> </span><br><span>diff --git a/res/res_xmpp.c b/res/res_xmpp.c</span><br><span>index 838bed8..218262c 100644</span><br><span>--- a/res/res_xmpp.c</span><br><span>+++ b/res/res_xmpp.c</span><br><span>@@ -614,7 +614,9 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(client->buddies = ao2_container_alloc(BUDDY_BUCKETS, xmpp_buddy_hash, xmpp_buddy_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ client->buddies = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, BUDDY_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ xmpp_buddy_hash, NULL, xmpp_buddy_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!client->buddies) {</span><br><span> ast_log(LOG_ERROR, "Could not initialize buddy container for '%s'\n", name);</span><br><span> ao2_ref(client, -1);</span><br><span> return NULL;</span><br><span>@@ -680,7 +682,9 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cfg->buddies = ao2_container_alloc(BUDDY_BUCKETS, xmpp_buddy_hash, xmpp_buddy_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg->buddies = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, BUDDY_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+ xmpp_buddy_hash, NULL, xmpp_buddy_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cfg->buddies) {</span><br><span> ao2_ref(cfg, -1);</span><br><span> return NULL;</span><br><span> }</span><br><span>@@ -698,14 +702,6 @@</span><br><span> ao2_cleanup(cfg->clients);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Hashing function for configuration */</span><br><span style="color: hsl(0, 100%, 40%);">-static int xmpp_config_hash(const void *obj, const int flags)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- const struct ast_xmpp_client_config *cfg = obj;</span><br><span style="color: hsl(0, 100%, 40%);">- const char *name = (flags & OBJ_KEY) ? obj : cfg->name;</span><br><span style="color: hsl(0, 100%, 40%);">- return ast_str_case_hash(name);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /*! \brief Comparator function for configuration */</span><br><span> static int xmpp_config_cmp(void *obj, void *arg, int flags)</span><br><span> {</span><br><span>@@ -727,7 +723,9 @@</span><br><span> goto error;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cfg->clients = ao2_container_alloc(1, xmpp_config_hash, xmpp_config_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg->clients = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ NULL, xmpp_config_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cfg->clients) {</span><br><span> goto error;</span><br><span> }</span><br><span> </span><br><span>@@ -2169,7 +2167,9 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!(buddy->resources = ao2_container_alloc(RESOURCE_BUCKETS, xmpp_resource_hash, xmpp_resource_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ buddy->resources = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ RESOURCE_BUCKETS, xmpp_resource_hash, NULL, xmpp_resource_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!buddy->resources) {</span><br><span> ao2_ref(buddy, -1);</span><br><span> return NULL;</span><br><span> }</span><br><span>diff --git a/tests/test_astobj2.c b/tests/test_astobj2.c</span><br><span>index 4abe28a..399cdc0 100644</span><br><span>--- a/tests/test_astobj2.c</span><br><span>+++ b/tests/test_astobj2.c</span><br><span>@@ -459,7 +459,7 @@</span><br><span> c2 = ao2_t_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, NULL, "test");</span><br><span> </span><br><span> if (!c1 || !c2) {</span><br><span style="color: hsl(0, 100%, 40%);">- ast_test_status_update(test, "ao2_container_alloc failed.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_test_status_update(test, "ao2_container_alloc_list failed.\n");</span><br><span> res = AST_TEST_FAIL;</span><br><span> goto cleanup;</span><br><span> }</span><br><span>@@ -712,9 +712,9 @@</span><br><span> break;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- c = ao2_container_alloc(1, NULL, test_cmp_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ c = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, test_cmp_cb);</span><br><span> if (!c) {</span><br><span style="color: hsl(0, 100%, 40%);">- ast_test_status_update(test, "ao2_container_alloc failed.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_test_status_update(test, "ao2_container_alloc_list failed.\n");</span><br><span> res = AST_TEST_FAIL;</span><br><span> goto cleanup;</span><br><span> }</span><br><span>diff --git a/tests/test_astobj2_thrash.c b/tests/test_astobj2_thrash.c</span><br><span>index a359246..8a7e64c 100644</span><br><span>--- a/tests/test_astobj2_thrash.c</span><br><span>+++ b/tests/test_astobj2_thrash.c</span><br><span>@@ -267,8 +267,8 @@</span><br><span> data.preload = MAX_HASH_ENTRIES / 2;</span><br><span> data.max_grow = MAX_HASH_ENTRIES - data.preload;</span><br><span> data.deadline = ast_tvadd(ast_tvnow(), ast_tv(MAX_TEST_SECONDS, 0));</span><br><span style="color: hsl(0, 100%, 40%);">- data.to_be_thrashed = ao2_container_alloc(HASH_BUCKETS, hash_string,</span><br><span style="color: hsl(0, 100%, 40%);">- compare_strings);</span><br><span style="color: hsl(120, 100%, 40%);">+ data.to_be_thrashed = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ HASH_BUCKETS, hash_string, NULL, compare_strings);</span><br><span> </span><br><span> if (data.to_be_thrashed == NULL) {</span><br><span> ast_test_status_update(test, "Allocation failed\n");</span><br><span>diff --git a/tests/test_cel.c b/tests/test_cel.c</span><br><span>index c9ceaf9..0b17d48 100644</span><br><span>--- a/tests/test_cel.c</span><br><span>+++ b/tests/test_cel.c</span><br><span>@@ -1837,8 +1837,8 @@</span><br><span> ast_cel_set_config(cel_test_config);</span><br><span> </span><br><span> /* init CEL event storage (degenerate hash table becomes a linked list) */</span><br><span style="color: hsl(0, 100%, 40%);">- cel_received_events = ao2_container_alloc(1, NULL, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- cel_expected_events = ao2_container_alloc(1, NULL, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ cel_received_events = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ cel_expected_events = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, NULL);</span><br><span> </span><br><span> /* start the CEL event callback */</span><br><span> if (ast_cel_backend_register(TEST_BACKEND_NAME, test_sub)) {</span><br><span>diff --git a/tests/test_config.c b/tests/test_config.c</span><br><span>index e00b30b..c429bbe 100644</span><br><span>--- a/tests/test_config.c</span><br><span>+++ b/tests/test_config.c</span><br><span>@@ -1364,12 +1364,6 @@</span><br><span> struct ao2_container *items;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int test_item_hash(const void *obj, const int flags)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- const struct test_item *item = obj;</span><br><span style="color: hsl(0, 100%, 40%);">- const char *name = (flags & OBJ_KEY) ? obj : item->name;</span><br><span style="color: hsl(0, 100%, 40%);">- return ast_str_case_hash(name);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span> static int test_item_cmp(void *obj, void *arg, int flags)</span><br><span> {</span><br><span> struct test_item *one = obj, *two = arg;</span><br><span>@@ -1422,7 +1416,8 @@</span><br><span> if (!(cfg->global_defaults = test_item_alloc("global_defaults"))) {</span><br><span> goto error;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(cfg->items = ao2_container_alloc(1, test_item_hash, test_item_cmp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg->items = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, test_item_cmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cfg->items) {</span><br><span> goto error;</span><br><span> }</span><br><span> return cfg;</span><br><span>diff --git a/tests/test_scoped_lock.c b/tests/test_scoped_lock.c</span><br><span>index 1881bce..0be86eb 100644</span><br><span>--- a/tests/test_scoped_lock.c</span><br><span>+++ b/tests/test_scoped_lock.c</span><br><span>@@ -199,8 +199,8 @@</span><br><span> enum ast_test_result_state res = AST_TEST_PASS;</span><br><span> struct ao2_iterator iter;</span><br><span> struct test_struct *object_iter;</span><br><span style="color: hsl(0, 100%, 40%);">- RAII_VAR(struct ao2_container*, container, ao2_container_alloc(13, NULL, NULL), ao2_cleanup);</span><br><span style="color: hsl(0, 100%, 40%);">- RAII_VAR(struct test_struct *, object, ao2_alloc(sizeof(*object), NULL), ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+ RAII_VAR(struct ao2_container*, container, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+ RAII_VAR(struct test_struct *, object, NULL, ao2_cleanup);</span><br><span> </span><br><span> switch(cmd) {</span><br><span> case TEST_INIT:</span><br><span>@@ -216,6 +216,8 @@</span><br><span> }</span><br><span> current_test = test;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ container = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 13, NULL, NULL, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ object = ao2_alloc(sizeof(*object), NULL);</span><br><span> if (!object || !container) {</span><br><span> /* Allocation failure. We can't even pretend to do this test properly */</span><br><span> return AST_TEST_FAIL;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/10700">change 10700</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/10700"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I0907d78bc66efc775672df37c8faad00f2f6c088 </div>
<div style="display:none"> Gerrit-Change-Number: 10700 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Corey Farrell <git@cfware.com> </div>