libevent Migration
authorWilfried Goesgens <dothebart@citadel.org>
Sun, 26 Dec 2010 10:40:54 +0000 (11:40 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Sun, 26 Dec 2010 10:40:54 +0000 (11:40 +0100)
 - add a state 'terminate' to the event handlers
 - use the Terminate-callback to free all members.

citadel/event_client.c
citadel/event_client.h
citadel/modules/smtp/serv_smtpeventclient.c

index 0f04757eaaafae7a251b521e7363be9e17be225a..bd28d10ef0e40ecf388775bdb84a9eddb3482191 100644 (file)
@@ -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, 
index ecaf7f2e5ec0509183b7fa13a9bcd26bf4286d59..e9c1a9d73b777110d7c23a9c5021bd1f13a5c88c 100644 (file)
@@ -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);
index 0395addabb90c6b180850dd541fd518601105070..09bf0ea2472030ea75871680b40d90f681d23865 100644 (file)
@@ -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;