boa源码分析

boa 应用从 src/boa.c 启动,进入核心的 select_loop 循环,实现非阻塞服务。request 结构体全局关键,所有操作围绕其展开。select_loop 包含 fdset_update 和 process_requests,后者遍历并处理 ready queue 中的请求,-1 表示转到 block queue,0 表示请求结束,1 则继续处理 ready queue。
摘要由CSDN通过智能技术生成

boa应用程序从src/boa.c开始运行,进入关键的select_loop中,boa将处于无阻塞轮询运行服务中。

/* boa里边有三个请求链表
* request *request_ready = NULL;  /* ready list head */
* request *request_block = NULL;   /* blocked list head */
* request *request_free = NULL;      /* free list head */
*
/


#include "boa.h"

static void fdset_update(void);
fd_set block_read_fdset;
fd_set block_write_fdset;
static struct timeval req_timeout;     /* timeval for select */

void select_loop(int server_s)
{
    FD_ZERO(&block_read_fdset);           //清空,block_read_fdset、block_write_fdset;
    FD_ZERO(&block_write_fdset);
    /* set server_s and req_timeout */       //设置server_s和请求超时时间。
    req_timeout.tv_sec = (ka_timeout ? ka_timeout : REQUEST_TIMEOUT);
    req_timeout.tv_usec = 0l;   /* reset timeout */

    /* preset max_fd */   
    max_fd = -1;           

    while (1) {       //进入web server服务主循环
        if (sighup_flag)         //处理sighup 、  sigchld 、 sigalrm、 sigterm等信号。
            sighup_run();      
        if (sigchld_flag)
            sigchld_run();
        if (sigalrm_flag)
            sigalrm_run();

        if (sigterm_flag) {
            if (sigterm_flag == 1)
                sigterm_stage1_run(server_s);
            if (sigterm_flag == 2 && !request_ready && !request_block) {
                sigterm_stage2_run();
            }
        }

        /* reset max_fd */
        max_fd = -1;         //重置max_fd为-1;

        if (request_block)       //如果request_block里面有request,则将合适的request从block链表里移到ready链表里。
            /* move selected req's from request_block to request_ready */
            fdset_update();

        /* any blocked req's move from request_ready to request_block */
        process_requests(server_s);   //处理request ,将blocked request从ready链移至block链

        if (!sigterm_flag && total_connections < (max_connections - 10)) {
            BOA_FD_SET(server_s, &block_read_fdset); /* server always set */
        }
                                         //重置时间
        req_timeout.tv_sec = (request_ready ? 0 :
                              (ka_timeout ? ka_timeout : REQUEST_TIMEOUT));
        req_timeout.tv_usec = 0l;   /* reset timeout */

        if (select(max_fd + 1, &block_read_fdset,     //进入select轮询
                   &block_write_fdset, NULL,
                   (request_ready || request_block ? &req_timeout : NULL)) &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值