process_requests()
昨天分析到了switch部分。
process_requests()还剩下的,也就是处理请求的switch部分和处理retval的swtich部分。先看下剩下这部分的源码:
switch (current->status) {
case READ_HEADER:
case ONE_CR:
case ONE_LF:
case TWO_CR:
retval = read_header(current);
break;
case BODY_READ:
retval = read_body(current);
break;
case BODY_WRITE:
retval = write_body(current);
break;
case WRITE:
retval = process_get(current);
break;
case PIPE_READ:
retval = read_from_pipe(current);
break;
case PIPE_WRITE:
retval = write_from_pipe(current);
break;
case DONE:
/* a non-status that will terminate the request */
retval = req_flush(current);
/*
* retval can be -2=error, -1=blocked, or bytes left
*/
if (retval == -2) { /* error */
current->status = DEAD;
retval = 0;
} else if (retval > 0) {
retval = 1;
}
break;
case DEAD:
retval = 0;
current->buffer_end = 0;
SQUASH_KA(current);
break;
default:
retval = 0;
fprintf(stderr, "Unknown status (%d), "

本文详细分析了BOA服务器的process_requests函数,包括处理请求的状态切换、处理retval的逻辑,以及block_request和free_requests的功能。主要内容涉及请求队列管理、内存释放、socket操作和HTTP请求处理。通过对BOA流程的了解,强调了其与传统以select为主的C/S模型的不同,重点在于链表操作而非select驱动。

1177

被折叠的 条评论
为什么被折叠?



