]> code.citadel.org Git - citadel.git/blobdiff - citadel/event_client.c
One more place were we have to check whether this is still our context first.
[citadel.git] / citadel / event_client.c
index d64e95bacc6da8b6ad648a931d3a9931c1fad697..c46429337da7f1db65dff1b53db14ea916679d38 100644 (file)
@@ -122,7 +122,7 @@ eNextState QueueDBOperation(AsyncIO *IO, IO_CallBack CB)
        ev_async_send (event_db, &DBAddJob);
        pthread_mutex_unlock(&DBEventExitQueueMutex);
 
-       EVM_syslog(LOG_DEBUG, "DBEVENT Q Done.\n");
+       EVQM_syslog(LOG_DEBUG, "DBEVENT Q Done.\n");
        return eDBQuery;
 }
 
@@ -257,9 +257,9 @@ eNextState QueueEventContext(AsyncIO *IO, IO_CallBack CB)
        return eSendReply;
 }
 
-eNextState EventQueueDBOperation(AsyncIO *IO, IO_CallBack CB)
+eNextState EventQueueDBOperation(AsyncIO *IO, IO_CallBack CB, int CloseFDs)
 {
-       StopClientWatchers(IO, 0);
+       StopClientWatchers(IO, CloseFDs);
        return QueueDBOperation(IO, CB);
 }
 eNextState DBQueueEventContext(AsyncIO *IO, IO_CallBack CB)
@@ -314,7 +314,6 @@ eNextState CurlQueueDBOperation(AsyncIO *IO, IO_CallBack CB)
 }
 
 
-void DestructCAres(AsyncIO *IO);
 void FreeAsyncIOContents(AsyncIO *IO)
 {
        CitContext *Ctx = IO->CitContext;
@@ -323,8 +322,6 @@ void FreeAsyncIOContents(AsyncIO *IO)
        FreeStrBuf(&IO->SendBuf.Buf);
        FreeStrBuf(&IO->RecvBuf.Buf);
 
-       DestructCAres(IO);
-
        FreeURL(&IO->ConnectMe);
        FreeStrBuf(&IO->HttpReq.ReplyData);
 
@@ -336,10 +333,13 @@ void FreeAsyncIOContents(AsyncIO *IO)
 }
 
 
+void DestructCAres(AsyncIO *IO);
 void StopClientWatchers(AsyncIO *IO, int CloseFD)
 {
        EVM_syslog(LOG_DEBUG, "EVENT StopClientWatchers");
        
+       DestructCAres(IO);
+
        ev_timer_stop (event_base, &IO->rw_timeout);
        ev_timer_stop(event_base, &IO->conn_fail);
        ev_idle_stop(event_base, &IO->unwind_stack);
@@ -493,10 +493,18 @@ eReadState HandleInbound(AsyncIO *IO)
                }
 
                if (Finished != eMustReadMore) {
+                       eNextState rc;
                        assert(IO->ReadDone);
                        ev_io_stop(event_base, &IO->recv_event);
-                       IO->NextState = IO->ReadDone(IO);
-                       Finished = StrBufCheckBuffer(&IO->RecvBuf);
+                       rc = IO->ReadDone(IO);
+                       if  (rc != eDBQuery) {
+                               IO->NextState = rc;
+                               Finished = StrBufCheckBuffer(&IO->RecvBuf);
+                       }
+                       else {
+                               return rc;
+
+                       }
                }
        }