GFS: fix bend_assoc_is_alive
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 30 Dec 2011 13:36:47 +0000 (14:36 +0100)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 30 Dec 2011 13:38:39 +0000 (14:38 +0100)
When cs_get returns 0 the association is marked dead, rather then
being destroyed. If not, the session memory is being free'd before
the search/scan handler is finished. Also destroy request memory
in request_release rather than in various places, which resulted in
leaks from time to time.

src/requestq.c
src/seshigh.c

index 41517d9..43eadfb 100644 (file)
@@ -91,6 +91,8 @@ request *request_get(request_q *q)
 void request_release(request *r)
 {
     request_q *q = r->q;
 void request_release(request *r)
 {
     request_q *q = r->q;
+    if (r->request_mem)
+        nmem_destroy(r->request_mem);
     r->next = q->list;
     q->list = r;
 }
     r->next = q->list;
     q->list = r;
 }
index 92627c2..6aa2fe0 100644 (file)
@@ -270,11 +270,10 @@ int ir_read(IOCHAN h, int event)
     
     if ((assoc->cs_put_mask & EVENT_INPUT) == 0 && (event & assoc->cs_get_mask))
     {
     
     if ((assoc->cs_put_mask & EVENT_INPUT) == 0 && (event & assoc->cs_get_mask))
     {
-        yaz_log(YLOG_DEBUG, "ir_session (input)");
         /* We aren't speaking to this fellow */
         if (assoc->state == ASSOC_DEAD)
         {
         /* We aren't speaking to this fellow */
         if (assoc->state == ASSOC_DEAD)
         {
-            yaz_log(log_sessiondetail, "Connection closed - end of session");
+            yaz_log(log_session, "Connection closed - end of session");
             cs_close(conn);
             destroy_association(assoc);
             iochan_destroy(h);
             cs_close(conn);
             destroy_association(assoc);
             iochan_destroy(h);
@@ -297,10 +296,8 @@ int ir_read(IOCHAN h, int event)
             }
             else if (res <= 0)
             {
             }
             else if (res <= 0)
             {
+                assoc->state = ASSOC_DEAD;
                 yaz_log(log_session, "Connection closed by client");
                 yaz_log(log_session, "Connection closed by client");
-                cs_close(conn);
-                destroy_association(assoc);
-                iochan_destroy(h);
                 return 0;
             }
             else if (res == 1) /* incomplete read - wait for more  */
                 return 0;
             }
             else if (res == 1) /* incomplete read - wait for more  */
@@ -447,7 +444,6 @@ void ir_session(IOCHAN h, int event)
             yaz_log(YLOG_DEBUG, "HTTP out:\n%.*s", req->len_response,
                     req->response);
 #endif
             yaz_log(YLOG_DEBUG, "HTTP out:\n%.*s", req->len_response,
                     req->response);
 #endif
-            nmem_destroy(req->request_mem);
             request_deq(&assoc->outgoing);
             request_release(req);
             if (!request_head(&assoc->outgoing))
             request_deq(&assoc->outgoing);
             request_release(req);
             if (!request_head(&assoc->outgoing))