您的位置:首页 > Web前端

6.9.1 qmgr_ defer.c:销毁活动数据

2016-04-07 15:31 141 查看
qmgr_ defer.c函数用来处理邮件的延迟发送。

当邮件被延迟,要进行两个方面的处理:邮件文件本身和邮件在内存中的“活动数据”(即“in-core”数据)。

虽然邮件被延迟了,但邮件文件本身依然在active队列中,这显然不是长久之计。active队列应该仅放置可以发送的邮件,再说active队列中的邮件数也是有限的,不能让延迟信件占据宝贵的空间。所以最终要将信件移出active队列,这通过qmgr_active.c中的一系列函数完成。

QMGR_QUEUE维持着两个QMGR_ENTRY_LIST链表:todo和busy,分别表示待发邮件和已经处于发信流程的邮件。虽然邮件被延迟了,但已经处于发信流程的邮件不会受影响。关键是要处理有待发送的邮件。因为每一次qmgr_job_entry_select的运行都将导致一个QMGR_ENTRY结构体从todo链表搬运到busy链表,而如果邮件被延迟,这样的搬运会变得毫无意义,所以要销毁延迟邮件的todo链表中的QMGR_ENTRY结构体。

qmgr_defer.c函数的主要作用就是根据是否存在retry模块分情况处理todo链表。虽然最终将销毁todo链表中的QMGR_ENTRY结构体,但由于retry模块是一个独立的进程,所以其销毁工作是并行开展的。否则将在原QMGR_QUEUE上实施销毁工作,这将影响qmgr模块的效率。无论是否存在retry模块,均将使用qmgr_entry_done函数完成销毁工作。“done”意味着对QMGR_ENTRY结构体进行最终的处理。

qmgr_defer.c循环所有QMGR_TRANSPORT,为每个QMGR_TRANSPORT调用qmgr_defer_todo函数:

for (queue = transport->queue_list.next;queue; queue = next)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: