]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
move sofia locking contention outside of cache_db handle management
authorAnthony Minessale <anthm@freeswitch.org>
Mon, 8 Oct 2012 18:28:01 +0000 (13:28 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Mon, 8 Oct 2012 18:28:01 +0000 (13:28 -0500)
src/mod/endpoints/mod_sofia/sofia_glue.c
src/mod/endpoints/mod_sofia/sofia_reg.c

index a39a8e9e7100b948abdaaf8cc913dee9c7d6f111..0e7ed4db0a571ee7f9f90750481f8a40aa4ea99f 100644 (file)
@@ -6394,18 +6394,16 @@ void sofia_glue_actually_execute_sql_trans(sofia_profile_t *profile, char *sql,
 {
        switch_cache_db_handle_t *dbh = NULL;
 
-       if (mutex) {
-               switch_mutex_lock(mutex);
-       }
-
        if (!(dbh = sofia_glue_get_db_handle(profile))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB\n");
-               goto end;
+               return;
        }
 
-       switch_cache_db_persistant_execute_trans(dbh, sql, 1);
+       if (mutex) {
+               switch_mutex_lock(mutex);
+       }
 
- end:
+       switch_cache_db_persistant_execute_trans(dbh, sql, 1);
 
        switch_cache_db_release_db_handle(&dbh);
 
@@ -6419,29 +6417,27 @@ void sofia_glue_actually_execute_sql(sofia_profile_t *profile, char *sql, switch
        switch_cache_db_handle_t *dbh = NULL;
        char *err = NULL;
 
-       if (mutex) {
-               switch_mutex_lock(mutex);
-       }
-
        if (!(dbh = sofia_glue_get_db_handle(profile))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB\n");
-               goto end;
+               return;
+       }
+
+       if (mutex) {
+               switch_mutex_lock(mutex);
        }
 
        switch_cache_db_execute_sql(dbh, sql, &err);
 
+       if (mutex) {
+               switch_mutex_unlock(mutex);
+       }
+
        if (err) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SQL ERR: [%s]\n%s\n", err, sql);
                free(err);
        }
 
- end:
-
        switch_cache_db_release_db_handle(&dbh);
-
-       if (mutex) {
-               switch_mutex_unlock(mutex);
-       }
 }
 
 switch_bool_t sofia_glue_execute_sql_callback(sofia_profile_t *profile,
@@ -6451,30 +6447,28 @@ switch_bool_t sofia_glue_execute_sql_callback(sofia_profile_t *profile,
        char *errmsg = NULL;
        switch_cache_db_handle_t *dbh = NULL;
 
-       if (mutex) {
-               switch_mutex_lock(mutex);
-       }
-
        if (!(dbh = sofia_glue_get_db_handle(profile))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB\n");
-               goto end;
+               return ret;
+       }
+
+       if (mutex) {
+               switch_mutex_lock(mutex);
        }
 
        switch_cache_db_execute_sql_callback(dbh, sql, callback, pdata, &errmsg);
 
+       if (mutex) {
+               switch_mutex_unlock(mutex);
+       }
+
        if (errmsg) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SQL ERR: [%s] %s\n", sql, errmsg);
                free(errmsg);
        }
 
- end:
-
        switch_cache_db_release_db_handle(&dbh);
 
-       if (mutex) {
-               switch_mutex_unlock(mutex);
-       }
-
        return ret;
 }
 
@@ -6495,15 +6489,15 @@ char *sofia_glue_execute_sql2str(sofia_profile_t *profile, switch_mutex_t *mutex
 
        ret = switch_cache_db_execute_sql2str(dbh, sql, resbuf, len, &err);
 
+       if (mutex) {
+               switch_mutex_unlock(mutex);
+       }
+
        if (err) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SQL ERR: [%s]\n%s\n", err, sql);
                free(err);
        }
 
-       if (mutex) {
-               switch_mutex_unlock(mutex);
-       }
-
        switch_cache_db_release_db_handle(&dbh);
 
        return ret;
index 1142534401f71ff963a36074a39412c5f24a1e30..98299a784be344c49775d5a668b3f866d7534233 100644 (file)
@@ -690,9 +690,8 @@ void sofia_reg_expire_call_id(sofia_profile_t *profile, const char *call_id, int
                                                 ",user_agent,server_user,server_host,profile_name,network_ip"
                                                 ",%d from sip_registrations where call_id='%q' %s", reboot, call_id, sqlextra);
 
-       switch_mutex_lock(profile->ireg_mutex);
-       sofia_glue_execute_sql_callback(profile, NULL, sql, sofia_reg_del_callback, profile);
-       switch_mutex_unlock(profile->ireg_mutex);
+
+       sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, sofia_reg_del_callback, profile);
        switch_safe_free(sql);
 
        sql = switch_mprintf("delete from sip_registrations where call_id='%q' %s", call_id, sqlextra);
@@ -708,7 +707,7 @@ void sofia_reg_check_expire(sofia_profile_t *profile, time_t now, int reboot)
 {
        char sql[1024];
 
-       switch_mutex_lock(profile->ireg_mutex);
+
 
        if (now) {
                switch_snprintf(sql, sizeof(sql), "select call_id,sip_user,sip_host,contact,status,rpid,expires"
@@ -719,7 +718,7 @@ void sofia_reg_check_expire(sofia_profile_t *profile, time_t now, int reboot)
                                                ",user_agent,server_user,server_host,profile_name,network_ip" ",%d from sip_registrations where expires > 0", reboot);
        }
 
-       sofia_glue_execute_sql_callback(profile, NULL, sql, sofia_reg_del_callback, profile);
+       sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, sofia_reg_del_callback, profile);
        if (now) {
                switch_snprintfv(sql, sizeof(sql), "delete from sip_registrations where expires > 0 and expires <= %ld and hostname='%q'",
                                                (long) now, mod_sofia_globals.hostname);
@@ -727,7 +726,7 @@ void sofia_reg_check_expire(sofia_profile_t *profile, time_t now, int reboot)
                switch_snprintfv(sql, sizeof(sql), "delete from sip_registrations where expires > 0 and hostname='%q'", mod_sofia_globals.hostname);
        }
 
-       sofia_glue_actually_execute_sql(profile, sql, NULL);
+       sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex);
 
 
 
@@ -735,12 +734,12 @@ void sofia_reg_check_expire(sofia_profile_t *profile, time_t now, int reboot)
                switch_snprintfv(sql, sizeof(sql), "select call_id from sip_shared_appearance_dialogs where hostname='%q' "
                                                "and profile_name='%s' and expires <= %ld", mod_sofia_globals.hostname, profile->name, (long) now);
 
-               sofia_glue_execute_sql_callback(profile, NULL, sql, sofia_sla_dialog_del_callback, profile);
+               sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, sofia_sla_dialog_del_callback, profile);
                switch_snprintfv(sql, sizeof(sql), "delete from sip_shared_appearance_dialogs where expires > 0 and hostname='%q' and expires <= %ld",
                                                mod_sofia_globals.hostname, (long) now);
 
 
-               sofia_glue_actually_execute_sql(profile, sql, NULL);
+               sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex);
        }
 
 
@@ -751,7 +750,7 @@ void sofia_reg_check_expire(sofia_profile_t *profile, time_t now, int reboot)
                switch_snprintfv(sql, sizeof(sql), "delete from sip_presence where expires > 0 and hostname='%q'", mod_sofia_globals.hostname);
        }
 
-       sofia_glue_actually_execute_sql(profile, sql, NULL);
+       sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex);
 
        if (now) {
                switch_snprintfv(sql, sizeof(sql), "delete from sip_authentication where expires > 0 and expires <= %ld and hostname='%q'",
@@ -760,7 +759,7 @@ void sofia_reg_check_expire(sofia_profile_t *profile, time_t now, int reboot)
                switch_snprintfv(sql, sizeof(sql), "delete from sip_authentication where expires > 0 and hostname='%q'", mod_sofia_globals.hostname);
        }
 
-       sofia_glue_actually_execute_sql(profile, sql, NULL);
+       sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex);
        
        sofia_presence_check_subscriptions(profile, now);
 
@@ -771,7 +770,7 @@ void sofia_reg_check_expire(sofia_profile_t *profile, time_t now, int reboot)
                switch_snprintfv(sql, sizeof(sql), "delete from sip_dialogs where expires >= -1 and hostname='%q'", mod_sofia_globals.hostname);
        }
 
-       sofia_glue_actually_execute_sql(profile, sql, NULL);
+       sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex);
 
 
        if (now) {
@@ -781,7 +780,7 @@ void sofia_reg_check_expire(sofia_profile_t *profile, time_t now, int reboot)
  " from sip_registrations where hostname='%s' and " 
  "profile_name='%s'", mod_sofia_globals.hostname, profile->name); 
                        
-                       sofia_glue_execute_sql_callback(profile, NULL, sql, sofia_reg_nat_callback, profile);
+                       sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, sofia_reg_nat_callback, profile);
                } else if (sofia_test_pflag(profile, PFLAG_NAT_OPTIONS_PING)) {
                        switch_snprintf(sql, sizeof(sql), "select call_id,sip_user,sip_host,contact,status,rpid,"
                                                        "expires,user_agent,server_user,server_host,profile_name"
@@ -789,12 +788,10 @@ void sofia_reg_check_expire(sofia_profile_t *profile, time_t now, int reboot)
  "or contact like '%%fs_nat=yes%%') and hostname='%s' " 
  "and profile_name='%s'", mod_sofia_globals.hostname, profile->name); 
                        
-                       sofia_glue_execute_sql_callback(profile, NULL, sql, sofia_reg_nat_callback, profile);
+                       sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, sofia_reg_nat_callback, profile);
                }
        }
 
-       switch_mutex_unlock(profile->ireg_mutex);
-
 }
 
 
@@ -837,9 +834,9 @@ void sofia_reg_check_call_id(sofia_profile_t *profile, const char *call_id)
                                                 ",user_agent,server_user,server_host,profile_name,network_ip"
                                                 " from sip_registrations where call_id='%q' %s", call_id, sqlextra);
 
-       switch_mutex_lock(profile->ireg_mutex);
-       sofia_glue_execute_sql_callback(profile, NULL, sql, sofia_reg_check_callback, profile);
-       switch_mutex_unlock(profile->ireg_mutex);
+
+       sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, sofia_reg_check_callback, profile);
+
 
        switch_safe_free(sql);
        switch_safe_free(sqlextra);
@@ -851,31 +848,28 @@ void sofia_reg_check_sync(sofia_profile_t *profile)
 {
        char sql[1024];
 
-       switch_mutex_lock(profile->ireg_mutex);
 
        switch_snprintf(sql, sizeof(sql), "select call_id,sip_user,sip_host,contact,status,rpid,expires"
                                        ",user_agent,server_user,server_host,profile_name,network_ip" 
                                        " from sip_registrations where expires > 0");
 
 
-       sofia_glue_execute_sql_callback(profile, NULL, sql, sofia_reg_del_callback, profile);
+       sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, sofia_reg_del_callback, profile);
        switch_snprintfv(sql, sizeof(sql), "delete from sip_registrations where expires > 0 and hostname='%q'", mod_sofia_globals.hostname);
-       sofia_glue_actually_execute_sql(profile, sql, NULL);
+       sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex);
 
 
        switch_snprintfv(sql, sizeof(sql), "delete from sip_presence where expires > 0 and hostname='%q'", mod_sofia_globals.hostname);
-       sofia_glue_actually_execute_sql(profile, sql, NULL);
+       sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex);
 
        switch_snprintfv(sql, sizeof(sql), "delete from sip_authentication where expires > 0 and hostname='%q'", mod_sofia_globals.hostname);
-       sofia_glue_actually_execute_sql(profile, sql, NULL);
+       sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex);
        
        switch_snprintfv(sql, sizeof(sql), "delete from sip_subscriptions where expires >= -1 and hostname='%q'", mod_sofia_globals.hostname);
-       sofia_glue_actually_execute_sql(profile, sql, NULL);
+       sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex);
 
        switch_snprintfv(sql, sizeof(sql), "delete from sip_dialogs where expires >= -1 and hostname='%q'", mod_sofia_globals.hostname);
-       sofia_glue_actually_execute_sql(profile, sql, NULL);
-
-       switch_mutex_unlock(profile->ireg_mutex);
+       sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex);
 
 }
 
@@ -1558,13 +1552,13 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand
                        } else {
                                sql = switch_mprintf("delete from sip_registrations where sip_user='%q' and sip_host='%q'", to_user, reg_host);
                        }
-                       switch_mutex_lock(profile->ireg_mutex);
+                       
                        sofia_glue_execute_sql_now(profile, &sql, SWITCH_TRUE);
                } else {
                        char buf[32] = "";
                        sql = switch_mprintf("select count(*) from sip_registrations where sip_user='%q' and sip_host='%q' and contact='%q'", to_user, reg_host, contact_str);
 
-                       switch_mutex_lock(profile->ireg_mutex);
+
 
                        sofia_glue_execute_sql2str(profile, profile->ireg_mutex, sql, buf, sizeof(buf));
                        switch_safe_free(sql);
@@ -1616,7 +1610,7 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand
                        sofia_glue_execute_sql_now(profile, &sql, SWITCH_TRUE);
                }
 
-               switch_mutex_unlock(profile->ireg_mutex);
+
 
                if (switch_event_create_subclass(&s_event, SWITCH_EVENT_CUSTOM, MY_EVENT_REGISTER) == SWITCH_STATUS_SUCCESS) {
                        switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "profile-name", profile->name);