Fix mutex handling in host resolver
[pazpar2-moved-to-github.git] / src / connection.c
index c1f3ff3..f9b0e0b 100644 (file)
@@ -42,7 +42,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include <yaz/comstack.h>
 #include <yaz/tcpip.h>
 #include "connection.h"
-#include "pazpar2.h"
+#include "session.h"
 #include "host.h"
 #include "client.h"
 #include "settings.h"
@@ -264,7 +264,6 @@ void connection_release(struct connection *co)
 {
     struct client *cl = co->client;
 
-    yaz_log(YLOG_DEBUG, "Connection release %s", co->host->hostport);
     if (!cl)
         return;
     client_set_connection(cl, 0);
@@ -275,6 +274,7 @@ void connect_resolver_host(struct host *host, iochan_man_t iochan_man)
 {
     struct connection *con;
 
+start:
     yaz_mutex_enter(host->mutex);
     con = host->connections;
     while (con)
@@ -285,22 +285,22 @@ void connect_resolver_host(struct host *host, iochan_man_t iochan_man)
             {
                 yaz_mutex_leave(host->mutex);
                 connection_destroy(con);
+                goto start;
                 /* start all over .. at some point it will be NULL */
-                con = host->connections;
             }
             else if (!con->client)
             {
                 yaz_mutex_leave(host->mutex);
                 connection_destroy(con);
                 /* start all over .. at some point it will be NULL */
-                con = host->connections;
+                goto start;
             }
             else
             {
                 yaz_mutex_leave(host->mutex);
                 connection_connect(con, iochan_man);
                 client_start_search(con->client);
-                con = host->connections;
+                goto start;
             }
         }
         else
@@ -444,7 +444,7 @@ int client_prep_connection(struct client *cl,
         yaz_mutex_enter(host->mutex);
         for (co = host->connections; co; co = co->next)
             if (connection_is_idle(co) &&
-                (!co->client || client_get_session(co->client) != se) &&
+                (!co->client || client_get_state(co->client) == Client_Idle) &&
                 !strcmp(ZOOM_connection_option_get(co->link, "user"),
                         session_setting_oneval(client_get_database(cl),
                                                PZ_AUTHENTICATION)))