From 6dff20bfbfea2067b7d4a324171a9534ef9778af Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Sat, 15 Jan 2011 16:18:10 +0100 Subject: [PATCH] Libev Migration; fix aborting on connection establishing problems - libev doesn't care whether a watcher is already registered or not, we don't need to remember which to stop and which not. - cast to the right structure while aborting - put timeout callback in - register timeout callback - close our socket in the right place. --- citadel/event_client.c | 30 +++++++-------------- citadel/event_client.h | 3 ++- citadel/modules/smtp/serv_smtpeventclient.c | 19 ++++++------- 3 files changed, 21 insertions(+), 31 deletions(-) diff --git a/citadel/event_client.c b/citadel/event_client.c index b9f90d00c..0d9c7b998 100644 --- a/citadel/event_client.c +++ b/citadel/event_client.c @@ -72,8 +72,6 @@ extern citthread_mutex_t EventQueueMutex; extern HashList *InboundEventQueue; extern struct ev_loop *event_base; -#define SEND_EVENT 1 -#define RECV_EVENT 2 int QueueEventContext(void *Ctx, AsyncIO *IO, EventContextAttach CB) { @@ -147,19 +145,17 @@ void FreeAsyncIOContents(AsyncIO *IO) void ShutDownCLient(AsyncIO *IO) { CtdlLogPrintf(CTDL_DEBUG, "EVENT x %d\n", IO->sock); - switch (IO->active_event) { - case SEND_EVENT: + + if (IO->sock != 0) + { ev_io_stop(event_base, &IO->send_event); - break; - case RECV_EVENT: ev_io_stop(event_base, &IO->recv_event); - break; - case 0: - // no event active here; just bail out. - break; + close(IO->sock); + IO->sock = 0; + IO->SendBuf.fd = 0; + IO->RecvBuf.fd = 0; } - IO->active_event = 0; IO->Terminate(IO->Data); } @@ -195,7 +191,6 @@ eReadState HandleInbound(AsyncIO *IO) if (Finished != eMustReadMore) { ev_io_stop(event_base, &IO->recv_event); - IO->active_event = 0; IO->NextState = IO->ReadDone(IO->Data); Finished = StrBufCheckBuffer(&IO->RecvBuf); } @@ -207,9 +202,6 @@ eReadState HandleInbound(AsyncIO *IO) { IO->NextState = IO->SendDone(IO->Data); ev_io_start(event_base, &IO->send_event); - - IO->active_event = SEND_EVENT; - } else if ((IO->NextState == eTerminateConnection) || (IO->NextState == eAbort) ) @@ -263,7 +255,6 @@ IO_send_callback(struct ev_loop *loop, ev_io *watcher, int revents) } #endif ev_io_stop(event_base, &IO->send_event); - IO->active_event = 0; switch (IO->NextState) { case eSendReply: break; @@ -275,8 +266,6 @@ IO_send_callback(struct ev_loop *loop, ev_io *watcher, int revents) ShutDownCLient(IO); else { ev_io_start(event_base, &IO->send_event); - - IO->active_event = SEND_EVENT; } break; case eReadMessage: @@ -285,8 +274,6 @@ IO_send_callback(struct ev_loop *loop, ev_io *watcher, int revents) } else { ev_io_start(event_base, &IO->recv_event); - - IO->active_event = RECV_EVENT; } break; @@ -356,7 +343,6 @@ set_start_callback(struct ev_loop *loop, AsyncIO *IO, int revents, int first_rw_ switch(IO->NextState) { case eReadMessage: ev_io_start(event_base, &IO->recv_event); - IO->active_event = RECV_EVENT; break; case eSendReply: case eSendMore: @@ -438,6 +424,7 @@ IO->curr_ai->ai_family, IO_connfail_callback, conn_timeout, 0); IO->conn_fail.data = IO; + ev_timer_start(event_base, &IO->conn_fail); return 0; } @@ -470,6 +457,7 @@ void InitEventIO(AsyncIO *IO, IO->ReadDone = ReadDone; IO->Terminate = Terminate; IO->LineReader = LineReader; + IO->ConnFail = ConnFail; if (ReadFirst) { IO->NextState = eReadMessage; diff --git a/citadel/event_client.h b/citadel/event_client.h index 35ce4246e..e6b41f3bd 100644 --- a/citadel/event_client.h +++ b/citadel/event_client.h @@ -34,7 +34,6 @@ struct AsyncIO { struct hostent *HEnt; int sock; unsigned short dport; - int active_event; eNextState NextState; ev_timer conn_fail, @@ -98,3 +97,5 @@ void InitEventIO(AsyncIO *IO, int ReadFirst); int QueueQuery(ns_type Type, char *name, AsyncIO *IO, IO_CallBack PostDNS); + +void StopClient(AsyncIO *IO); diff --git a/citadel/modules/smtp/serv_smtpeventclient.c b/citadel/modules/smtp/serv_smtpeventclient.c index 676c1812f..d13f5238e 100644 --- a/citadel/modules/smtp/serv_smtpeventclient.c +++ b/citadel/modules/smtp/serv_smtpeventclient.c @@ -108,7 +108,7 @@ typedef enum _eSMTP_C_States { eMaxSMTPC } eSMTP_C_States; -const long SMTP_C_ConnTimeout = 300; /* wail 5 minutes for connections... */ +const long SMTP_C_ConnTimeout = 60; /* wail 1 minute for connections... */ const long SMTP_C_ReadTimeouts[eMaxSMTPC] = { 90, /* Greeting... */ 30, /* EHLO */ @@ -242,8 +242,6 @@ void FinalizeMessageSend(SmtpOutMsg *Msg) RemoveQItem(Msg->MyQItem); } - - close(Msg->IO.sock); DeleteSmtpOutMsg(Msg); } @@ -251,9 +249,9 @@ void FinalizeMessageSend(SmtpOutMsg *Msg) void get_one_mx_host_ip_done(void *Ctx, - int status, - int timeouts, - struct hostent *hostent) + int status, + int timeouts, + struct hostent *hostent) { AsyncIO *IO = Ctx; SmtpOutMsg *SendMsg = IO->Data; @@ -784,19 +782,22 @@ eNextState SMTP_C_DispatchWriteDone(void *Data) /*****************************************************************************/ eNextState SMTP_C_Terminate(void *Data) { - SmtpOutMsg *pMsg = Data; + AsyncIO *IO = Data; + SmtpOutMsg *pMsg = IO->Data; FinalizeMessageSend(pMsg); return 0; } eNextState SMTP_C_Timeout(void *Data) { - SmtpOutMsg *pMsg = Data; + AsyncIO *IO = Data; + SmtpOutMsg *pMsg = IO->Data; FinalizeMessageSend(pMsg); return 0; } eNextState SMTP_C_ConnFail(void *Data) { - SmtpOutMsg *pMsg = Data; + AsyncIO *IO = Data; + SmtpOutMsg *pMsg = IO->Data; FinalizeMessageSend(pMsg); return 0; } -- 2.30.2