Merge branch 'master' into session_lock
[pazpar2-moved-to-github.git] / src / connection.c
index d5b5be2..5a5f207 100644 (file)
@@ -199,7 +199,7 @@ static struct connection *connection_create(struct client *cl,
     return co;
 }
 
-static void non_block_events(struct connection *co)
+static void non_block_events_unlocked(struct connection *co)
 {
     int got_records = 0;
     IOCHAN iochan = co->iochan;
@@ -280,11 +280,20 @@ static void non_block_events(struct connection *co)
     }
 }
 
+static void non_block_events(struct client *cl, struct connection *co)
+{
+    session_enter_rw(client_get_session(cl), "non_block_events");
+    non_block_events_unlocked(co);
+    session_leave_rw(client_get_session(cl), "non_block_events");
+}
+
 void connection_continue(struct connection *co)
 {
     int r = ZOOM_connection_exec_task(co->link);
     if (!r)
-        non_block_events(co);
+    {
+        non_block_events_unlocked(co);
+    }
     else
     {
         iochan_setflags(co->iochan, ZOOM_connection_get_mask(co->link));
@@ -313,9 +322,6 @@ static void connection_handler(IOCHAN iochan, int event)
     else if (event & EVENT_TIMEOUT)
     {
         ZOOM_connection_fire_event_timeout(co->link);
-        client_lock(cl);
-        non_block_events(co);
-        client_unlock(cl);
 
         remove_connection_from_host(co);
         yaz_mutex_leave(host->mutex);
@@ -325,13 +331,11 @@ static void connection_handler(IOCHAN iochan, int event)
     {
         yaz_mutex_leave(host->mutex);
 
-        client_lock(cl);
-        non_block_events(co);
+        non_block_events(cl, co);
 
         ZOOM_connection_fire_event_socket(co->link, event);
 
-        non_block_events(co);
-        client_unlock(cl);
+        non_block_events(cl, co);
 
         if (co->link)
         {