Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_cycle_modules

聲明在?src/core/ngx_module.h

ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle);

實現在?src/core/ngx_module.c

ngx_int_t
ngx_cycle_modules(ngx_cycle_t *cycle)
{/** create a list of modules to be used for this cycle,* copy static modules to it*/cycle->modules = ngx_pcalloc(cycle->pool, (ngx_max_module + 1)* sizeof(ngx_module_t *));if (cycle->modules == NULL) {return NGX_ERROR;}ngx_memcpy(cycle->modules, ngx_modules,ngx_modules_n * sizeof(ngx_module_t *));cycle->modules_n = ngx_modules_n;return NGX_OK;
}

這個函數ngx_cycle_modules的作用是為當前Nginx服務器周期(cycle)初始化并設置模塊列表。具體來說:

  1. 函數為當前周期分配內存,用于存儲模塊指針數組

  2. 將靜態定義的模塊列表(ngx_modules)復制到當前周期的模塊列表中

  3. 設置當前周期的模塊數量


ngx_cycle_modules?函數的簽名如下:

ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle);

以下是對函數簽名的詳細解析:


1. 返回值類型 ngx_int_t
類型定義:ngx_int_t 是 Nginx 自定義的整數類型,用于統一跨平臺的整數表示。
語義:
NGX_OK(值為 0):表示函數執行成功。
NGX_ERROR(值為 -1):表示函數執行失敗(如內存分配失敗)。
作用:通過返回狀態碼,通知調用者函數執行結果。



2. 參數 ngx_cycle_t *cycle
參數類型:ngx_cycle_t 是 Nginx 的核心結構體,表示一個運行周期(如啟動、重載配置時的實例)。



詳解


注釋部分
/** create a list of modules to be used for this cycle,* copy static modules to it*/

作用:說明函數的核心目標。


背景:
Nginx 的模塊在編譯時靜態注冊到全局數組 ngx_modules。
每個運行周期(cycle)需要獨立的模塊列表,以支持配置重載時的多實例隔離。


設計思想:
隔離性:通過復制全局模塊到 cycle,避免不同周期(如舊配置與新配置)的模塊相互干擾。


分配模塊數組內存

cycle->modules = ngx_pcalloc(cycle->pool, (ngx_max_module + 1) * sizeof(ngx_module_t *));

作用:在 cycle 的內存池中分配內存,存儲模塊指針數組。


關鍵參數:
cycle->pool:Nginx 內存池,確保高效內存管理(避免頻繁 malloc/free)。
ngx_max_module + 1ngx_max_module 是編譯時定義的最大模塊數,+1?用于預留終止標記(如 NULL)


檢查內存分配

if (cycle->modules == NULL) {return NGX_ERROR;
}
  • 作用:驗證內存分配是否成功。

  • 邏輯:若?ngx_pcalloc?返回?NULL,直接返回錯誤碼?NGX_ERROR


復制全局模塊到周期模塊列表

ngx_memcpy(cycle->modules, ngx_modules, ngx_modules_n * sizeof(ngx_module_t *));

作用:將全局模塊數組 ngx_modules 拷貝到 cycle->modules


關鍵變量:
ngx_modules:全局靜態模塊數組,編譯時生成。

ngx_modules_n:全局模塊數量,編譯時確定。

僅復制實際存在的模塊(ngx_modules_n 個),而非整個預分配空間。


記錄模塊數量

cycle->modules_n = ngx_modules_n;
  • 作用:將全局模塊數量?ngx_modules_n?賦值給?cycle->modules_n

  • 邏輯

    • cycle->modules_n?后續用于遍歷模塊(如初始化模塊時)


返回成功狀態

return NGX_OK;
  • 作用:通知調用者函數執行成功。

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_modules-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71703.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71703.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71703.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue3實戰學習(IDEA中打開、啟動與搭建Vue3工程極簡腳手架教程(2025超詳細教程)、Windows系統命令行啟動Vue3工程)(2)

目錄 一、命令行中重新啟動已搭建好的Vue3工程。(快速上手) (0)Windows環境下使用命令行從零到一手動搭建Vue3工程教程。 (1)首先找到已建Vue3工程的目錄。 (2)無需再下載依賴包,直接執行npm ru…

使用websocket,注入依賴service的bean為null

問題:依賴注入失敗,service獲取不到,提示null 這是參考代碼 package com.shier.ws;import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.google.gson.Gson; import com.s…

《A++ 敏捷開發》- 18 軟件需求

需求并不是關于需求 (Requirements are not really about requirements) 大家去公共圖書館寄存物品,以前都是掃二維碼開箱,有些圖書館升級了使用指紋識別。 “是否新方法比以前好?”我問年輕的開發人員。 “當然用指紋識別好。新技術&#x…

基于AMD AU15P FPGA的SLVS-EC橋PCIe設計方案分享

作者:Hello,Panda 各位FPGAer周末愉快,今天熊貓君分享一個基于AMD AU15P FPGA的SLVS-EC橋PCIe設計方案。 一、方案背景 先說方案的應用背景:眾所周知,較為上層的如基于AI的機器視覺應用,大多基于高端的專用SoC、AI專…

Redis|Springboot集成Redis

文章目錄 總體概述本地Java連接Redis常見問題集成Jedis集成lettuce集成RedisTemplate——推薦使用連接單機連接集群 總體概述 jedis-lettuce-RedisTemplate三者的聯系 jedis第一代lettuce承上啟下redistemplate著重使用 本地Java連接Redis常見問題 bind配置請注釋掉保護模式…

機器學習(六)

一,決策樹: 簡介: 決策樹是一種通過構建類似樹狀的結構(顛倒的樹),從根節點開始逐步對數據進行劃分,最終在葉子節點做出預測結果的模型。 結構組成: 根節點:初始的數據集…

恢復IDEA的Load Maven Changes按鈕

寫代碼的時候不知道點到什么東西了,pom文件上的這個彈窗就是不出來了,重啟IDEA,reset windos都沒用,網上搜也沒收到解決方案 然后開打開其他項目窗口時,看到那個的功能名叫 Hide This Notification 于是跑到Setting里…

怎么使用Sam Helper修改手機屏幕分辨率,使得游戲視野變廣?

1.準備Shizuku 和Sam Helper軟件 2.打開設置,找到關于本機,連續點擊版本號五次打開開發者選項 3.找到開發者選項,打開USB調試和無線調試 4.返回桌面,我們接著打開shizuku,點擊配對,這里打開開發者選項,找…

【招聘精英】

我們公司是一個位于石家莊的一個科技型新型技術公司。主要做人力資源、用工、科技等方面。 有意向回石家莊的或者已經在石家莊的技術大咖、軟件大牛、產品大佬、UI大神可以來了解一下。 現在招聘 高級前端開發 高級java開發 其他崗位也可以聯系。 有意向的朋友可以私信我。 -…

大模型信息整理

1. Benchmarks Reasoning, conversation, Q&A benchmarks HellaSwagBIG-Bench HardSQuADIFEvalMuSRMMLU-PROMT-BenchDomain-specific benchmarks GPQAMedQAPubMedQAMath benchmarks GSM8KMATHMathEvalSecurity-related benchmarks PyRITPurple Llama CyberSecEval2. 國內外…

Redis-限流方案

在實際業務中,可能會遇到瞬時流量劇增的情況,大量的請求可能會導致服務器過載和宕機。為了保護系統自身和上下游服務,需要采用限流的方式,拒絕部分請求。 限流就是對請求的頻率進行控制,迅速拒絕超過請求閾值的請求。 …

無感方波開環強拖總結

一、強拖階段的核心原理與設計要點 開環換相邏輯 固定頻率斜坡:以預設斜率逐步提升換相頻率(如0.5-5Hz/ms),強制電機跟隨磁場旋轉。電壓-頻率協調控制:初始階段施加高電壓(80%-100%額定)克服靜摩…

Java虛擬機之垃圾收集(一)

目錄 一、如何判定對象“生死”? 1. 引用計數算法(理論參考) 2. 可達性分析算法(JVM 實際使用) 3. 對象的“緩刑”機制 二、引用類型與回收策略 三、何時觸發垃圾回收? 1. 分代回收策略 2. 手動觸發…

代碼隨想錄算法訓練營第22天 | 組合 組合總和 電話號碼的字母組合

77. 組合 77. 組合 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<Integer> path new ArrayList<>();List<List<Integer>> result new ArrayList<>();public void backTracking(int n,int k,int startIndex){if(path.size() …

#UVM# 關于field automation機制中的標志位及if的使用

通過前面文章的復習,我們知道了 uvm_field 機制帶來的好處,確實方便了我們很多代碼的coding 時間,但是會不會有一種情況呢? 比如,我們不想將實例中的某一些成員進行打包、復制、比較操作,怎么辦呢? 如果只執行 比較但不進行打包操作呢?是不是很復雜呢 ? 一 標志位…

RK3588 安裝ffmpeg6.1.2

在安裝 ffmpeg 在 RK3588 開發板上時,你需要確保你的開發環境(例如 Ubuntu、Debian 或其他 Linux 發行版)已經設置好了交叉編譯工具鏈,以便能夠針對 RK3588 架構編譯軟件。以下是一些步驟和指導,幫助你安裝 FFmpeg: 1. 安裝依賴項 首先,確保你的系統上安裝了所有必要的…

leetcode day25 28 KMP算法

28找出字符串中第一個匹配項的下標 給你兩個字符串 haystack 和 needle &#xff0c;請你在 haystack 字符串中找出 needle 字符串的第一個匹配項的下標&#xff08;下標從 0 開始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;則返回 -1 。 示例 1&#xff…

編程語言介紹:Rust

什么是Rust Rust是由Mozilla研究院開發的一種系統級編程語言&#xff0c;旨在提供更好的內存安全保證&#xff0c;同時保持高性能&#xff0c;自2010年首次發布以來&#xff0c;Rust以其安全性、并發性和實用性迅速獲得了廣泛的關注。Rust最獨特的特性之一是其所有權模型&#…

Java Spring MVC (2)

常見的Request Controller 和 Response Controller 的區別 用餐廳點餐來理解 想象你去一家餐廳吃飯&#xff1a; Request Controller&#xff08;接單員&#xff09;&#xff1a;負責處理你的點餐請求&#xff0c;記錄你的口味、桌號等信息。Response Controller&#xff08…

Oracle 字符類型對比

本文以 Oracle12c 為例 1.主要區別對比 類型存儲方式最大長度字符集支持適用場景備注?CHAR(M)固定長度空格填充2000 字節&#xff0c;M 代表字節長度默認字符集固定長度編碼實際存儲長度固定為定義長度&#xff08;如 CHAR(10) 始終占 10 字節&#xff09;?VARCHAR2(M)可變長…