4.3.2.1 master_avail_listen函数:挂载或卸载回调函数master_avail_event

来源:互联网 发布:质检总局网络培训学院 编辑:程序博客网 时间:2024/06/09 17:39

master_avail_listen用来将回调函数挂载到监听的文件描述符上,或从其上卸载。

         由于创建子进程后子进程要进行监听,所以master_avail_listen不会直接进行event_enable_read挂载回调函数,而是根据情况执行event_enable_read或event_disable_readwrite。

/master/master_avail.c124 void    master_avail_listen(MASTER_SERV *serv)125 {126     const char *myname ="master_avail_listen";127     int    listen_flag;128     time_t now;129     int    n;130131     /*132      * Caution: several other master_XXXmodules call master_avail_listen(),133      * master_avail_more() ormaster_avail_less(). To avoid mutual dependency134      * problems, the code below invokes no codein other master_XXX modules,135      * and modifies no data that is maintainedby other master_XXX modules.136      *137      * When no-one else is monitoring theservice's listen socket, start138      * monitoring the socket for connectionrequests. All this under the139      * restriction that we have sufficientresources to service a connection140      * request.141      */142     if (msg_verbose)143         msg_info("%s: %s avail %d total%d max %d", myname, serv->name,144                  serv->avail_proc,serv->total_proc, serv->max_proc);145     if (MASTER_THROTTLED(serv) ||serv->avail_proc > 0) {146         listen_flag = 0;147     } else if(MASTER_LIMIT_OK(serv->max_proc, serv->total_proc)) {148         listen_flag = 1;149     } else {150         listen_flag = 0;151         if (serv->stress_param_val != 0) {152             now = event_time();153             if (serv->busy_warn_time <now - 1000) {154                 serv->busy_warn_time = now;155                 msg_warn("service\"%s\" (%s) has reached its process limit \"%d\": "156                          "new clients mayexperience noticeable delays",157                          serv->ext_name,serv->name, serv->max_proc);158                 msg_warn("to avoid thiscondition, increase the process count "159                       "in master.cf orreduce the service time per client");160                 msg_warn("seehttp://www.postfix.org/STRESS_README.html for "161                       "examples ofstress-adapting configuration settings");162             }163         }164     }

145-164 设置一个标志位listen_flag,用来判断是挂载还是卸载回调函数

master_avail_listen有3个调用点:master_service函数,master_avail_more和master_avail_less函数。

 

首先一定会通过master_service函数调用,这时由于没有创建子进程,MASTER_THROTTLED(serv) || serv->avail_proc > 0

不成立,listen_flag为1,表示可以挂载master_avail_event回调函数进行进程创建。

 

如果通过master_avail_more函数调用,则serv->avail_proc> 0成立,卸载回调函数。

 

如果通过master_avail_less函数调用,当avail_proc不被减小到0时,卸载回调函数,否则挂载回调函数。

165     if (listen_flag &&!MASTER_LISTENING(serv)) {166         if (msg_verbose)167             msg_info("%s: enable events%s", myname, serv->name);168         for (n = 0; n <serv->listen_fd_count; n++)169            event_enable_read(serv->listen_fd[n], master_avail_event,170                               (void *) serv);171         serv->flags |= MASTER_FLAG_LISTEN;172     } else if (!listen_flag &&MASTER_LISTENING(serv)) {173         if (msg_verbose)174             msg_info("%s: disable events%s", myname, serv->name);175         for (n = 0; n < serv->listen_fd_count;n++)176            event_disable_readwrite(serv->listen_fd[n]);177         serv->flags &=~MASTER_FLAG_LISTEN;178     }179 }


165-178卸载或挂载回调函数。
0 0
原创粉丝点击