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) *
"");
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)
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;
}
DeleteHashPos(&It);
+ MyQItem->NotYetShutdownDeliveries =
MyQItem->ActiveDeliveries = CountActiveQueueEntries(MyQItem);
/* failsafe against overload:
time_t Retry;
long ActiveDeliveries;
+ long NotYetShutdownDeliveries;
StrBuf *EnvelopeFrom;
StrBuf *BounceTo;
StrBuf *SenderRoom;
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);