X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fevent_client.c;h=999c9e4546c1b989efc6fb93c6f6ab8df8394b8f;hb=8357d67fb22adec3b854d61bdbd898dcfcc91959;hp=b3bb59eb8a2622585f51006651f765b4674f5614;hpb=dd59064e38dec85f201b6bb167c250b08e5fdfbf;p=citadel.git diff --git a/citadel/event_client.c b/citadel/event_client.c index b3bb59eb8..999c9e454 100644 --- a/citadel/event_client.c +++ b/citadel/event_client.c @@ -26,6 +26,7 @@ #include "ctdl_module.h" #include "event_client.h" +#include "citserver.h" ConstStr IOStates[] = { {HKEY("DB Queue")}, @@ -398,7 +399,7 @@ void StopCurlWatchers(AsyncIO *IO) IO->RecvBuf.fd = 0; } -void ShutDownCLient(AsyncIO *IO) +eNextState ShutDownCLient(AsyncIO *IO) { CitContext *Ctx =IO->CitContext; @@ -418,11 +419,12 @@ void ShutDownCLient(AsyncIO *IO) IO->DNS.Channel = NULL; } assert(IO->Terminate); - IO->Terminate(IO); + return IO->Terminate(IO); } void PostInbound(AsyncIO *IO) { + switch (IO->NextState) { case eSendFile: ev_io_start(event_base, &IO->send_event); @@ -444,6 +446,7 @@ void PostInbound(AsyncIO *IO) break; case eDBQuery: StopClientWatchers(IO, 0); + QueueAnDBOperation(IO); default: break; } @@ -454,17 +457,18 @@ void PostInbound(AsyncIO *IO) ev_io_start(event_base, &IO->recv_event); break; case eTerminateConnection: - ShutDownCLient(IO); - break; case eAbort: - ShutDownCLient(IO); + if (ShutDownCLient(IO) == eDBQuery) { + QueueAnDBOperation(IO); + } break; case eSendDNSQuery: case eReadDNSReply: - case eDBQuery: case eConnect: case eReadMessage: break; + case eDBQuery: + QueueAnDBOperation(IO); } } eReadState HandleInbound(AsyncIO *IO) @@ -512,15 +516,15 @@ eReadState HandleInbound(AsyncIO *IO) } if (Finished != eMustReadMore) { - eNextState rc; - assert(IO->ReadDone); ev_io_stop(event_base, &IO->recv_event); - rc = IO->ReadDone(IO); - if (rc == eDBQuery) { - return QueueAnDBOperation(IO); + IO->NextState = IO->ReadDone(IO); + if (IO->NextState == eDBQuery) { + if (QueueAnDBOperation(IO) == eAbort) + return eReadFail; + else + return eReadSuccess; } else { - IO->NextState = rc; Finished = StrBufCheckBuffer(&IO->RecvBuf); } } @@ -559,6 +563,11 @@ IO_send_callback(struct ev_loop *loop, ev_io *watcher, int revents) IO->SendBuf.fd); fd = fopen(fn, "a+"); + if (fd == NULL) { + syslog(LOG_EMERG, "failed to open file %s: %s", fn, strerror(errno)); + cit_backtrace(); + exit(1); + } fprintf(fd, "Send: BufSize: %ld BufContent: [", nbytes); rv = fwrite(pchh, nbytes, 1, fd); @@ -882,6 +891,11 @@ IO_recv_callback(struct ev_loop *loop, ev_io *watcher, int revents) IO->SendBuf.fd); fd = fopen(fn, "a+"); + if (fd == NULL) { + syslog(LOG_EMERG, "failed to open file %s: %s", fn, strerror(errno)); + cit_backtrace(); + exit(1); + } fprintf(fd, "Read: BufSize: %ld BufContent: [", nbytes); rv = fwrite(pchh, nbytes, 1, fd); @@ -930,9 +944,18 @@ IO_postdns_callback(struct ev_loop *loop, ev_idle *watcher, int revents) case eAbort: //// StopClientWatchers(IO); ShutDownCLient(IO); + break; + case eDBQuery: + StopClientWatchers(IO, 0); + QueueAnDBOperation(IO); + break; default: break; } + case eDBQuery: + StopClientWatchers(IO, 0); + QueueAnDBOperation(IO); + break; default: break; } @@ -1217,8 +1240,13 @@ eNextState KillOtherContextNow(AsyncIO *IO) SetEVState(IO, eKill); - if (Ctx->OtherOne->ShutdownAbort != NULL) - Ctx->OtherOne->ShutdownAbort(Ctx->OtherOne); + if (Ctx->OtherOne->ShutdownAbort != NULL) { + Ctx->OtherOne->NextState = eAbort; + if (Ctx->OtherOne->ShutdownAbort(Ctx->OtherOne) == eDBQuery) { + StopClientWatchers(Ctx->OtherOne, 0); + QueueAnDBOperation(Ctx->OtherOne); + } + } return eTerminateConnection; } @@ -1257,11 +1285,11 @@ void KillAsyncIOContext(AsyncIO *IO) case eReadMore: case eReadPayload: case eReadFile: - IO->ReAttachCB = KillOtherContextNow; + Ctx->IO.ReAttachCB = KillOtherContextNow; QueueAnEventContext(&Ctx->IO); break; case eDBQuery: - IO->ReAttachCB = KillOtherContextNow; + Ctx->IO.ReAttachCB = KillOtherContextNow; QueueAnDBOperation(&Ctx->IO); break; case eTerminateConnection: