+ EV_syslog(LOG_DEBUG,
+ "EVENT: Session lives at %p IO at %p \n",
+ Data, IO);
+
+}
+
+extern int evcurl_init(AsyncIO *IO);
+
+int InitcURLIOStruct(AsyncIO *IO,
+ void *Data,
+ const char* Desc,
+ IO_CallBack SendDone,
+ IO_CallBack Terminate,
+ IO_CallBack DBTerminate,
+ IO_CallBack ShutdownAbort)
+{
+ IO->Data = Data;
+
+ IO->CitContext = CloneContext(CC);
+ IO->CitContext->session_specific_data = Data;
+ IO->CitContext->IO = IO;
+
+ IO->SendDone = SendDone;
+ IO->Terminate = Terminate;
+ IO->DBTerminate = DBTerminate;
+ IO->ShutdownAbort = ShutdownAbort;
+
+ strcpy(IO->HttpReq.errdesc, Desc);
+
+
+ return evcurl_init(IO);
+
+}
+
+
+typedef struct KillOtherSessionContext {
+ AsyncIO IO;
+ AsyncIO *OtherOne;
+}KillOtherSessionContext;
+
+eNextState KillTerminate(AsyncIO *IO)
+{
+ long id;
+ KillOtherSessionContext *Ctx = (KillOtherSessionContext*)IO->Data;
+ EV_syslog(LOG_DEBUG, "%s Exit\n", __FUNCTION__);
+ id = IO->ID;
+ FreeAsyncIOContents(IO);
+ memset(Ctx, 0, sizeof(KillOtherSessionContext));
+ IO->ID = id; /* just for the case we want to analyze it in a coredump */
+ free(Ctx);
+ return eAbort;
+
+}
+
+eNextState KillShutdown(AsyncIO *IO)
+{
+ return eTerminateConnection;
+}
+
+eNextState KillOtherContextNow(AsyncIO *IO)
+{
+ KillOtherSessionContext *Ctx = IO->Data;
+
+ SetEVState(IO, eKill);
+
+ if (Ctx->OtherOne->ShutdownAbort != NULL)
+ Ctx->OtherOne->ShutdownAbort(Ctx->OtherOne);
+ return eTerminateConnection;
+}
+
+void KillAsyncIOContext(AsyncIO *IO)
+{
+ KillOtherSessionContext *Ctx;