From 933901571bf3f9e41d77218ed044b9ea7a7198c2 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Sun, 26 Dec 2010 11:40:54 +0100 Subject: [PATCH] libevent Migration - add a state 'terminate' to the event handlers - use the Terminate-callback to free all members. --- citadel/event_client.c | 27 +++++++++++++++++---- citadel/event_client.h | 3 ++- citadel/modules/smtp/serv_smtpeventclient.c | 11 +++++++-- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/citadel/event_client.c b/citadel/event_client.c index 0f04757ea..bd28d10ef 100644 --- a/citadel/event_client.c +++ b/citadel/event_client.c @@ -123,6 +123,19 @@ setup_signal_handlers(struct instance *instance) } */ +void ShutDownCLient(AsyncIO *IO) +{ + event_del(&IO->send_event); + event_del(&IO->recv_event); + IO->Terminate(IO->Data); + +// citthread_mutex_lock(&EventQueueMutex); + +///QueueEvents /// todo remove from hash. + +// citthread_mutex_unlock(&EventQueueMutex); +} + eReadState HandleInbound(AsyncIO *IO) { eReadState Finished = eBufferNotEmpty; @@ -169,10 +182,7 @@ eReadState HandleInbound(AsyncIO *IO) } else if ((IO->NextState == eTerminateConnection) || (IO->NextState == eAbort) ) -{ - - - } + ShutDownCLient(IO); return Finished; } @@ -198,7 +208,12 @@ IO_send_callback(int fd, short event, void *ctx) break; case eSendMore: IO->NextState = IO->SendDone(IO->Data); - event_add(&IO->send_event, NULL); + + if ((IO->NextState == eTerminateConnection) || + (IO->NextState == eAbort) ) + ShutDownCLient(IO); + else + event_add(&IO->send_event, NULL); break; case eReadMessage: if (StrBufCheckBuffer(&IO->RecvBuf) == eBufferNotEmpty) { @@ -255,12 +270,14 @@ void InitEventIO(AsyncIO *IO, void *pData, IO_CallBack ReadDone, IO_CallBack SendDone, + IO_CallBack Terminate, IO_LineReaderCallback LineReader, int ReadFirst) { IO->Data = pData; IO->SendDone = SendDone; IO->ReadDone = ReadDone; + IO->Terminate = Terminate; IO->LineReader = LineReader; event_set(&IO->recv_event, diff --git a/citadel/event_client.h b/citadel/event_client.h index ecaf7f2e5..e9c1a9d73 100644 --- a/citadel/event_client.h +++ b/citadel/event_client.h @@ -19,7 +19,7 @@ struct AsyncIO { struct event recv_event, send_event; IOBuffer SendBuf, RecvBuf; IO_LineReaderCallback LineReader; - IO_CallBack ReadDone, SendDone; + IO_CallBack ReadDone, SendDone, Terminate; StrBuf *IOBuf; void *Data; DeleteHashDataFunc DeleteData; /* data is expected to contain AsyncIO... */ @@ -34,5 +34,6 @@ void InitEventIO(AsyncIO *IO, void *pData, IO_CallBack ReadDone, IO_CallBack SendDone, + IO_CallBack Terminate, IO_LineReaderCallback LineReader, int ReadFirst); diff --git a/citadel/modules/smtp/serv_smtpeventclient.c b/citadel/modules/smtp/serv_smtpeventclient.c index 0395addab..09bf0ea24 100644 --- a/citadel/modules/smtp/serv_smtpeventclient.c +++ b/citadel/modules/smtp/serv_smtpeventclient.c @@ -222,7 +222,7 @@ void DeleteSmtpOutMsg(void *v) eNextState SMTP_C_DispatchReadDone(void *Data); eNextState SMTP_C_DispatchWriteDone(void *Data); - +eNextState SMTP_C_Terminate(void *Data); typedef eNextState (*SMTPReadHandler)(SmtpOutMsg *Msg); typedef eNextState (*SMTPSendHandler)(SmtpOutMsg *Msg); @@ -667,6 +667,7 @@ int connect_one_smtpsrv_xamine_result(void *Ctx) InitEventIO(&SendMsg->IO, SendMsg, SMTP_C_DispatchReadDone, SMTP_C_DispatchWriteDone, + SMTP_C_Terminate, SMTP_C_ReadServerStatus, 1); return 0; @@ -907,7 +908,7 @@ eNextState SMTPC_read_QUIT_reply(SmtpOutMsg *SendMsg) CtdlLogPrintf(CTDL_INFO, "SMTP client[%ld]: delivery to <%s> @ <%s> (%s) succeeded\n", SendMsg->n, SendMsg->user, SendMsg->node, SendMsg->name); - return eSendReply; + return eTerminateConnection; } eNextState SMTPC_read_dummy(SmtpOutMsg *SendMsg) @@ -1261,6 +1262,12 @@ SMTPSendHandler SendHandlers[eMaxSMTPC] = { SMTPC_send_QUIT }; +eNextState SMTP_C_Terminate(void *Data) +{ + SmtpOutMsg *pMsg = Data; + FinalizeMessageSend(pMsg); + +} eNextState SMTP_C_DispatchReadDone(void *Data) { SmtpOutMsg *pMsg = Data; -- 2.30.2