]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-9691: don't call sql code inside hash_mutex due to circular mutex contention betwe...
authorMike Jerris <mike@jerris.com>
Thu, 3 Nov 2016 19:52:56 +0000 (14:52 -0500)
committerMike Jerris <mike@jerris.com>
Fri, 11 Nov 2016 15:49:20 +0000 (10:49 -0500)
src/mod/endpoints/mod_sofia/mod_sofia.c

index 25985343083709124fa57ea53e93c1a98146ca2e..558663115203f1918a921b82b7c502d6c25da053 100644 (file)
@@ -3897,6 +3897,8 @@ SWITCH_STANDARD_API(sofia_contact_function)
                sofia_glue_release_profile(profile);
 
        } else if (!zstr(domain)) {
+               sofia_profile_t *profiles[1024] = {0};
+               uint8_t i = 0, j;
                switch_mutex_lock(mod_sofia_globals.hash_mutex);
                if (mod_sofia_globals.profile_hash) {
                        switch_hash_index_t *hi;
@@ -3906,12 +3908,19 @@ SWITCH_STANDARD_API(sofia_contact_function)
                        for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) {
                                switch_core_hash_this(hi, &var, NULL, &val);
                                if ((profile = (sofia_profile_t *) val) && !strcmp((char *)var, profile->name)) {
-                                       select_from_profile(profile, user, domain, concat, exclude_contact, &mystream, SWITCH_TRUE);
+                                       sofia_glue_profile_rdlock(profile);
+                                       profiles[i++] = profile;
                                        profile = NULL;
                                }
                        }
                }
                switch_mutex_unlock(mod_sofia_globals.hash_mutex);
+               if (i) {
+                       for (j = 0; j < i; j++) {
+                               select_from_profile(profiles[j], user, domain, concat, exclude_contact, &mystream, SWITCH_TRUE);
+                               sofia_glue_release_profile(profiles[j]);
+                       }
+               }
        }
 
        reply = (char *) mystream.data;