]> code.citadel.org Git - citadel.git/blobdiff - citadel/event_client.c
Cleanup of shutdown of event contexts
[citadel.git] / citadel / event_client.c
index 5f418fa6a33b396f2d76f41adb4ba875d06a2c85..cea9a24f748e47515b3ff61ff63e6b93c48c3e03 100644 (file)
@@ -121,9 +121,6 @@ void ShutDownDBCLient(AsyncIO *IO)
 
        assert(IO->Terminate);
        IO->Terminate(IO);      
-
-       Ctx->state = CON_IDLE;
-       Ctx->kill_me = 1;
 }
 
 void
@@ -227,23 +224,34 @@ eNextState QueueCurlContext(AsyncIO *IO)
        return eSendReply;
 }
 
+void DestructCAres(AsyncIO *IO);
 void FreeAsyncIOContents(AsyncIO *IO)
 {
+       CitContext *Ctx = IO->CitContext;
+
        FreeStrBuf(&IO->IOBuf);
        FreeStrBuf(&IO->SendBuf.Buf);
        FreeStrBuf(&IO->RecvBuf.Buf);
+
+       DestructCAres(IO);
+
+       FreeURL(&IO->ConnectMe);
+       FreeStrBuf(&IO->HttpReq.ReplyData);
+
+       Ctx->state = CON_IDLE;
+       Ctx->kill_me = 1;
 }
 
 
 void StopClientWatchers(AsyncIO *IO)
 {
+       ev_timer_stop (event_base, &IO->rw_timeout);
        ev_timer_stop(event_base, &IO->conn_fail);
-       ev_io_stop(event_base, &IO->conn_event);
        ev_idle_stop(event_base, &IO->unwind_stack);
 
+       ev_io_stop(event_base, &IO->conn_event);
        ev_io_stop(event_base, &IO->send_event);
        ev_io_stop(event_base, &IO->recv_event);
-       ev_timer_stop (event_base, &IO->rw_timeout);
        close(IO->SendBuf.fd);
        IO->SendBuf.fd = 0;
        IO->RecvBuf.fd = 0;
@@ -267,8 +275,6 @@ void ShutDownCLient(AsyncIO *IO)
        }
        assert(IO->Terminate);
        IO->Terminate(IO);
-       Ctx->state = CON_IDLE;
-       Ctx->kill_me = 1;
 }
 
 
@@ -693,7 +699,6 @@ IO_postdns_callback(struct ev_loop *loop, ev_idle *watcher, int revents)
                        ShutDownCLient(IO);
                default:
                        break;
-                       
                }
        default:
                break;
@@ -876,3 +881,28 @@ void InitIOStruct(AsyncIO *IO,
        IO->IOBuf         = NewStrBuf();
 
 }
+
+extern int evcurl_init(AsyncIO *IO);
+
+int InitcURLIOStruct(AsyncIO *IO,
+                    void *Data,
+                    const char* Desc,
+                    IO_CallBack SendDone,
+                    IO_CallBack Terminate,
+                    IO_CallBack ShutdownAbort)
+{
+       IO->Data          = Data;
+
+       IO->CitContext    = CloneContext(CC);
+       ((CitContext *)IO->CitContext)->session_specific_data = (char*) Data;
+
+       IO->SendDone = SendDone;
+       IO->Terminate = Terminate;
+       IO->ShutdownAbort = ShutdownAbort;
+
+       strcpy(IO->HttpReq.errdesc, Desc);
+
+
+       return  evcurl_init(IO);
+
+}