From: Wilfried Goesgens Date: Mon, 29 Dec 2014 10:10:53 +0000 (+0100) Subject: Fix terminating of other contexts X-Git-Tag: v9.01~70 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=35e0c7f2ab7f61a604e9d0134aaf91ae3ff5205c Fix terminating of other contexts - adjust pointer magic - if the other context wants to do a DB-Operation for finalization, we have to follow his advise. --- diff --git a/citadel/event_client.c b/citadel/event_client.c index 959aa542d..c745c52c8 100644 --- a/citadel/event_client.c +++ b/citadel/event_client.c @@ -518,7 +518,10 @@ eReadState HandleInbound(AsyncIO *IO) ev_io_stop(event_base, &IO->recv_event); IO->NextState = IO->ReadDone(IO); if (IO->NextState == eDBQuery) { - return QueueAnDBOperation(IO); + if (QueueAnDBOperation(IO) == eAbort) + return eReadFail; + else + return eReadSuccess; } else { Finished = StrBufCheckBuffer(&IO->RecvBuf); @@ -1217,8 +1220,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 +1265,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: