From: Wilfried Goesgens Date: Fri, 6 Apr 2012 21:20:29 +0000 (+0200) Subject: Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel X-Git-Tag: v8.11~105 X-Git-Url: https://code.citadel.org/?a=commitdiff_plain;h=5922d6ab5d9d36dafabcf0c5a01499be0f9d2f42;hp=8b205c8685728911def335ced64f35b5be86e7f5;p=citadel.git Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel --- diff --git a/citadel/modules/smtp/serv_smtpeventclient.c b/citadel/modules/smtp/serv_smtpeventclient.c index e5c1cee00..c8da5590e 100644 --- a/citadel/modules/smtp/serv_smtpeventclient.c +++ b/citadel/modules/smtp/serv_smtpeventclient.c @@ -126,6 +126,7 @@ eNextState FinalizeMessageSendDB(AsyncIO *IO); eNextState FinalizeMessageSend_DB1(AsyncIO *IO); eNextState FinalizeMessageSend_DB2(AsyncIO *IO); eNextState FinalizeMessageSend_DB3(AsyncIO *IO); +eNextState FinalizeMessageSend_DB4(AsyncIO *IO); /****************************************************************************** * So, we're finished with sending (regardless of success or failure) * @@ -217,11 +218,27 @@ inline void FinalizeMessageSend_DB_3(AsyncIO *IO) ""); FreeStrBuf(&Msg->QMsgData); } + DecreaseShutdownDeliveries(Msg->MyQItem); } eNextState FinalizeMessageSend_DB3(AsyncIO *IO) { + SmtpOutMsg *Msg = IO->Data; FinalizeMessageSend_DB_3(IO); - return eAbort; + if (!Msg->IDestructQueItem) + return eAbort; + return NextDBOperation(IO, FinalizeMessageSend_DB4); +} + +eNextState FinalizeMessageSend_DB4(AsyncIO *IO) +{ + int n; + SmtpOutMsg *Msg = IO->Data; + + n = GetShutdownDeliveries(Msg->MyQItem); + if (n > 0) + return NextDBOperation(IO, FinalizeMessageSend_DB4); + else + return eAbort; } eNextState FinalizeMessageSend_DB(AsyncIO *IO) diff --git a/citadel/modules/smtp/serv_smtpqueue.c b/citadel/modules/smtp/serv_smtpqueue.c index 2292df1c4..92bc9d625 100644 --- a/citadel/modules/smtp/serv_smtpqueue.c +++ b/citadel/modules/smtp/serv_smtpqueue.c @@ -141,6 +141,22 @@ int DecreaseQReference(OneQueItem *MyQItem) return IDestructQueItem; } +void DecreaseShutdownDeliveries(OneQueItem *MyQItem) +{ + pthread_mutex_lock(&ActiveQItemsLock); + MyQItem->NotYetShutdownDeliveries--; + pthread_mutex_unlock(&ActiveQItemsLock); +} + +int GetShutdownDeliveries(OneQueItem *MyQItem) +{ + int DestructNow; + + pthread_mutex_lock(&ActiveQItemsLock); + DestructNow = MyQItem->ActiveDeliveries == 0; + pthread_mutex_unlock(&ActiveQItemsLock); + return DestructNow; +} void RemoveQItem(OneQueItem *MyQItem) { long len; @@ -856,6 +872,7 @@ void smtp_do_procmsg(long msgnum, void *userdata) { } DeleteHashPos(&It); + MyQItem->NotYetShutdownDeliveries = MyQItem->ActiveDeliveries = CountActiveQueueEntries(MyQItem); /* failsafe against overload: diff --git a/citadel/modules/smtp/smtpqueue.h b/citadel/modules/smtp/smtpqueue.h index 6c6dc5311..c6cd97f58 100644 --- a/citadel/modules/smtp/smtpqueue.h +++ b/citadel/modules/smtp/smtpqueue.h @@ -56,6 +56,7 @@ typedef struct queueitem { time_t Retry; long ActiveDeliveries; + long NotYetShutdownDeliveries; StrBuf *EnvelopeFrom; StrBuf *BounceTo; StrBuf *SenderRoom; @@ -70,6 +71,8 @@ typedef struct __QItemHandlerStruct { QItemHandler H; } QItemHandlerStruct; int DecreaseQReference(OneQueItem *MyQItem); +void DecreaseShutdownDeliveries(OneQueItem *MyQItem); +int GetShutdownDeliveries(OneQueItem *MyQItem); void RemoveQItem(OneQueItem *MyQItem); int CountActiveQueueEntries(OneQueItem *MyQItem); StrBuf *SerializeQueueItem(OneQueItem *MyQItem);