Tianyi's Blog Tianyi's Blog
首页
  • 计算机网络
  • 操作系统
  • 计算机科学
  • Nginx
  • Vue框架
  • 环境配置
  • Java
  • JVM
  • Spring框架
  • Redis
  • MySQL
  • RabbitMQ
  • Kafka
  • Mirror Sites
  • Dev Tools
  • Docker
  • Jenkins
  • Scripts
  • Windows
  • 科学上网
  • 旅行
  • 网站日记
  • 软件
  • 电子产品
  • 杂野
  • 分类
  • 友情链接
GitHub (opens new window)

Tianyi

一直向前,永不停止
首页
  • 计算机网络
  • 操作系统
  • 计算机科学
  • Nginx
  • Vue框架
  • 环境配置
  • Java
  • JVM
  • Spring框架
  • Redis
  • MySQL
  • RabbitMQ
  • Kafka
  • Mirror Sites
  • Dev Tools
  • Docker
  • Jenkins
  • Scripts
  • Windows
  • 科学上网
  • 旅行
  • 网站日记
  • 软件
  • 电子产品
  • 杂野
  • 分类
  • 友情链接
GitHub (opens new window)
  • Nginx

    • nginx概述
    • nginx安装的三种方式
    • nginx配置-基本配置
    • nginx配置-请求定位
    • nginx配置-默认配置
    • nginx配置-最佳实践
    • nginx配置-生产配置
    • nginx常用指令
    • nginx实现原理
    • nginx源码阅读
  • Vue框架

  • 前端环境配置

  • 前端文档

  • 前端
  • Nginx
tianyi
2023-10-28

nginx源码阅读

event_base_loop是核心代码,用于监听事件以实现实现高性能和高并发的网络服务。 17kk 有空再完善

event_base_loop源码如下:

int event_base_loop(struct event_base *base, int flags)
        {
    const struct eventop *evsel = base->evsel;
    struct timeval tv;
    struct timeval *tv_p;
    int res, done, retval = 0;
    
    EVBASE_ACQUIRE_LOCK(base, th_base_lock);
    if (base->running_loop) {
        event_warnx("%s: reentrant invocation.  Only one event_base_loop"
                                       " can run on each event_base at once.", __func__);
        EVBASE_RELEASE_LOCK(base, th_base_lock);
        return -1;
    }
    base->running_loop = 1;
    clear_time_cache(base);
    if (base->sig.ev_signal_added && base->sig.ev_n_signals_added)
                            evsig_set_base(base);
    done = 0;
    #ifndef _EVENT_DISABLE_THREAD_SUPPORT
                            base->th_owner_id = EVTHREAD_GET_ID();
    #endif
                    base->event_gotterm = base->event_break = 0;
    while (!done) {
        base->event_continue = 0;
        
        if (base->event_gotterm) {
            break;
        }
        if (base->event_break) {
            break;
        }
        timeout_correct(base, &tv);
        tv_p = &tv;
        if (!N_ACTIVE_CALLBACKS(base) && !(flags & EVLOOP_NONBLOCK)) {
            timeout_next(base, &tv_p);
        } else {
            
            evutil_timerclear(&tv);
        }
        
        if (!event_haveevents(base) && !N_ACTIVE_CALLBACKS(base)) {
            event_debug(("%s: no events registered.", __func__));
            retval = 1;
            goto done;
        }
        
        gettime(base, &base->event_tv);
        clear_time_cache(base);
        res = evsel->dispatch(base, tv_p);
        if (res == -1) {
            event_debug(("%s: dispatch returned unsuccessfully.",
                                                __func__));
            retval = -1;
            goto done;
        }
        update_time_cache(base);
        timeout_process(base);
        if (N_ACTIVE_CALLBACKS(base)) {
            int n = event_process_active(base);
            if ((flags & EVLOOP_ONCE)
                                           && N_ACTIVE_CALLBACKS(base) == 0
                                           && n != 0)
                                                done = 1;
        } else if (flags & EVLOOP_NONBLOCK)
                                    done = 1;
    }
    event_debug(("%s: asked to terminate loop.", __func__));
    done:
                clear_time_cache(base);
    base->running_loop = 0;
    EVBASE_RELEASE_LOCK(base, th_base_lock);
    return (retval);
} 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
完善页面 (opens new window)
nginx实现原理
前端代码规范

← nginx实现原理 前端代码规范→

最近更新
01
JDK
02-23
02
BadTasteCode && 优化
09-11
03
Gradle 实践操作指南及最佳实践
09-11
更多文章>
Theme by Vdoing | Copyright © 2021-2025 Tandy | 粤ICP备2023113440号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式