res_pjsip: Make aor named lock a mutex.
authorRichard Mudgett <rmudgett@digium.com>
Wed, 3 Aug 2016 21:24:39 +0000 (16:24 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Thu, 11 Aug 2016 16:58:38 +0000 (11:58 -0500)
The named aor lock was always being locked for writes so a rwlock adds no
benefit and may be slower because rwlocks are biased toward read locking.

Change-Id: I8c5c2c780eb30ce5441832257beeb3506fd12b28

main/named_locks.c
res/res_pjsip/location.c
res/res_pjsip_registrar.c
res/res_pjsip_registrar_expire.c

index b977b55..5960483 100644 (file)
@@ -87,8 +87,8 @@ static void named_locks_shutdown(void)
 
 int ast_named_locks_init(void)
 {
-       named_locks = ao2_container_alloc_hash(0, 0, NAMED_LOCKS_BUCKETS, named_locks_hash, NULL,
-               named_locks_cmp);
+       named_locks = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,
+               NAMED_LOCKS_BUCKETS, named_locks_hash, NULL, named_locks_cmp);
        if (!named_locks) {
                return -1;
        }
index 46278dd..c0c4a1f 100644 (file)
@@ -209,12 +209,12 @@ struct ao2_container *ast_sip_location_retrieve_aor_contacts(const struct ast_si
        struct ao2_container *contacts;
        struct ast_named_lock *lock;
 
-       lock = ast_named_lock_get(AST_NAMED_LOCK_TYPE_RWLOCK, "aor", ast_sorcery_object_get_id(aor));
+       lock = ast_named_lock_get(AST_NAMED_LOCK_TYPE_MUTEX, "aor", ast_sorcery_object_get_id(aor));
        if (!lock) {
                return NULL;
        }
 
-       ao2_wrlock(lock);
+       ao2_lock(lock);
        contacts = ast_sip_location_retrieve_aor_contacts_nolock(aor);
        ao2_unlock(lock);
        ast_named_lock_put(lock);
@@ -368,12 +368,12 @@ int ast_sip_location_add_contact(struct ast_sip_aor *aor, const char *uri,
        int res;
        struct ast_named_lock *lock;
 
-       lock = ast_named_lock_get(AST_NAMED_LOCK_TYPE_RWLOCK, "aor", ast_sorcery_object_get_id(aor));
+       lock = ast_named_lock_get(AST_NAMED_LOCK_TYPE_MUTEX, "aor", ast_sorcery_object_get_id(aor));
        if (!lock) {
                return -1;
        }
 
-       ao2_wrlock(lock);
+       ao2_lock(lock);
        res = ast_sip_location_add_contact_nolock(aor, uri, expiration_time, path_info, user_agent,
                via_addr, via_port, call_id,
                endpoint);
index a39dac6..f99a3b8 100644 (file)
@@ -525,12 +525,12 @@ static int register_aor(pjsip_rx_data *rdata,
        struct ao2_container *contacts = NULL;
        struct ast_named_lock *lock;
 
-       lock = ast_named_lock_get(AST_NAMED_LOCK_TYPE_RWLOCK, "aor", aor_name);
+       lock = ast_named_lock_get(AST_NAMED_LOCK_TYPE_MUTEX, "aor", aor_name);
        if (!lock) {
                return PJ_TRUE;
        }
 
-       ao2_wrlock(lock);
+       ao2_lock(lock);
        contacts = ast_sip_location_retrieve_aor_contacts_nolock(aor);
        if (!contacts) {
                ao2_unlock(lock);
index 0d979a1..61841a0 100644 (file)
@@ -44,7 +44,7 @@ static int expire_contact(void *obj, void *arg, int flags)
        struct ast_sip_contact *contact = obj;
        struct ast_named_lock *lock;
 
-       lock = ast_named_lock_get(AST_NAMED_LOCK_TYPE_RWLOCK, "aor", contact->aor);
+       lock = ast_named_lock_get(AST_NAMED_LOCK_TYPE_MUTEX, "aor", contact->aor);
        if (!lock) {
                return 0;
        }
@@ -53,7 +53,7 @@ static int expire_contact(void *obj, void *arg, int flags)
         * We need to check the expiration again with the aor lock held
         * in case another thread is attempting to renew the contact.
         */
-       ao2_wrlock(lock);
+       ao2_lock(lock);
        if (ast_tvdiff_ms(ast_tvnow(), contact->expiration_time) > 0) {
                ast_sip_location_delete_contact(contact);
        }