Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_list_init

ngx_list_init


定義src\core\ngx_list.h

static ngx_inline ngx_int_t
ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size)
{list->part.elts = ngx_palloc(pool, n * size);if (list->part.elts == NULL) {return NGX_ERROR;}list->part.nelts = 0;list->part.next = NULL;list->last = &list->part;list->size = size;list->nalloc = n;list->pool = pool;return NGX_OK;
}

ngx_list_init 是 Nginx 中用于初始化鏈表結構的關鍵函數


函數簽名

static ngx_inline ngx_int_t 
ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size
);
1. static ngx_inline
  • static
    限制函數的作用域為當前編譯單元(即當前源文件),防止與其他文件中的同名函數沖突。

  • ngx_inline
    Nginx 定義的宏(通常展開為 inline),提示編譯器將函數內聯展開,減少函數調用開銷。適用于頻繁調用的小函數(如初始化、簡單操作)。


2. 返回值 ngx_int_t
  • 返回值含義
    • NGX_OK(成功):初始化成功,鏈表可用。
    • NGX_ERROR(失敗):內存分配失敗

3. 參數詳解
(1) ngx_list_t *list
  • 類型:指向 ngx_list_t 結構的指針。
  • 作用:需要被初始化的鏈表對象。
(2) ngx_pool_t *pool
  • 類型:指向 Nginx 內存池的指針。
  • 作用:為鏈表提供內存分配服務。
  • 意義
    • 所有鏈表相關的內存(包括初始數據塊和后續擴展的數據塊)均從該內存池分配。
    • 內存池管理簡化了內存釋放流程(銷毀池即可回收所有內存)。
(3) ngx_uint_t n
  • 類型:Nginx 自定義的無符號整型(typedef unsigned int ngx_uint_t)。
  • 作用:指定每個數據塊預分配的元素數量。
  • 影響
    • 決定初始內存塊的大小為 n * size
    • 值過大會浪費內存,過小會導致頻繁分配新數據塊。
(4) size_t size
  • 類型:標準庫的無符號整型(通常為 unsigned long)。
  • 作用:指定鏈表中每個元素的大小(字節)。
  • 要求
    • 必須與實際存儲的數據類型大小一致(如 sizeof(ngx_table_elt_t))。

詳解


1. 分配初始內存塊
list->part.elts = ngx_palloc(pool, n * size);

為鏈表的第一個數據塊分配內存,大小為 n * size

ngx_pallocpool 分配內存,返回指針賦給 part.elts


2. 檢查內存分配結果
if (list->part.elts == NULL) {return NGX_ERROR;
}

驗證內存分配是否成功。

內存分配失敗會導致后續操作崩潰,需立即返回錯誤。

eltsNULL,說明分配失敗,返回 NGX_ERROR


3. 初始化當前塊元素計數
list->part.nelts = 0;

設置當前塊已用元素數量為 0。

nelts(number of elements)記錄塊內已使用的元素數,初始時未添加元素。

提供計數功能,便于后續判斷是否需要分配新塊。


4. 初始化當前塊的后繼指針
list->part.next = NULL;

標記當前塊為最后一個塊,無后續塊。

鏈表初始僅包含一個塊,后續塊通過 next 指針鏈接。


5. 設置最后一個塊的指針
list->last = &list->part;

last 指向鏈表的第一個塊(即當前唯一塊)。

last 是指向鏈表最后一個塊的指針,用于快速追加元素。

&list->part 獲取第一個塊的地址,賦給 last

通過 last 直接定位到鏈表尾部,避免遍歷整個鏈表,提升插入效率。


6. 保存元素大小
list->size = size;

記錄每個元素的大小(字節)。

后續添加元素時需根據 size 計算內存偏移量。


7. 保存預分配元素數量
list->nalloc = n;

記錄每個塊預分配的元素數量。

新塊分配時需按 n 預分配內存,平衡內存使用與性能。

控制內存分配粒度,減少碎片化。


8. 關聯內存池
list->pool = pool;

保存內存池指針,用于后續內存分配。


9. 返回成功狀態
return NGX_OK;

通知調用者初始化成功。

明確函數執行結果,便于錯誤處理。


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

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

相關文章

Linux切換Python版本

1、更新apt sudo apt update2、查詢python安裝路徑 which python 或者which python33、查詢安裝版本 # 查看所有以 "python" 開頭的命令(包括版本號) ls -l 安裝路徑* 例如 ls -l /usr/bin/python*4、修改軟連接 udo unlink /usr/bin/pyt…

Spring Cloud之注冊中心之Nacos的使用

目錄 Naacos 服務注冊/服務發現 引?Spring Cloud Alibaba依賴 引入Nacos依賴 引入Load Balance依賴 配置Nacos地址 服務端調用 啟動服務 Naacos Nacos是Spring Cloud Alibaba的組件, Spring Cloud Alibaba遵循Spring Cloud中定義的服務注冊, 服務發現規范. 因此使?Na…

使用通義萬相Wan2.1進行視頻生成

使用通義萬相Wan2.1進行視頻生成 源代碼準備運行環境準備創建Python虛擬環境并激活安裝依賴包 模型下載生成視頻官網的視頻生成例子簡單描述場景視頻生成示例詳細描述場景視頻生成示例 最近通義萬相開源了其視頻生成模型。模型有兩個版本,一個是1.3B的,一…

鴻蒙HarmonyOS 開發簡介

鴻蒙開發入門教程 一、技術簡介 鴻蒙操作系統(HarmonyOS)是面向萬物互聯時代的全場景分布式操作系統,具備分布式軟總線、分布式數據管理、分布式任務調度等核心能力,能讓設備間實現無縫連接與協同,為用戶提供統一、流…

docker和containerd從TLS harbor拉取鏡像

私有鏡像倉庫配置了自簽名證書,https訪問,好處是不需要處理免費證書和付費證書帶來的證書文件變更,證書文件變更后需要重啟服務,自簽名證書需要將一套客戶端證書存放在/etc/docker/cert.d目錄下,或者/etc/containerd/c…

linux ununtu通過nginx-1.6.2.tar.gz安裝nginx并安裝在自定義目錄XXX下 的步驟

Ubuntu 下通過源碼安裝 Nginx 1.6.2 到自定義目錄 /home/aot/nginx 的步驟 以下是將 Nginx 1.6.2 源碼包離線安裝到自定義目錄的詳細流程,包含依賴管理、編譯配置和服務管理: 一、準備工作 1. 下載源碼包和依賴(需聯網環境準備)…

C++ 變量的輸入輸出教程

一、變量的基本概念 在 C 中,變量是用于存儲數據的命名內存位置。在使用變量之前,需要先聲明它的類型和名稱,這樣編譯器才能為其分配適當大小的內存空間。例如: int age; // 聲明一個整型變量 age double salary; // 聲明一個…

React底層常見的設計模式

在React中,常見的設計模式為開發者提供了結構化和可重用的解決方案,有助于提高代碼的可維護性和可擴展性。以下是對React中幾種常見設計模式的詳細解析,并附上示例代碼和注釋: 1. 容器組件與展示組件模式(Container/P…

【MATLAB例程】三維下的IMM(交互式多模型),模型使用CV(勻速)和CA(勻加速)

給出三維下的交互式多模型(IMM)matlab例程,模型使用勻速運動CV和勻加速運動CA,濾波使用EKF(擴展卡爾曼濾波) 文章目錄 代碼運行結果程序結構 代碼講解模型定義:軌跡生成:IMM核心流程…

物理內存組織與分配的核心概念

在 Linux 內核內存管理(尤其是 Buddy System 伙伴系統)中,node、zone、type 和 order 是描述物理內存組織與分配的核心概念。以下是它們的詳細解釋: 1. Node(NUMA 節點) 定義: 在 NUMA&#xf…

智科技賦能寵物關懷新時代

在科技日新月異的今天,智能寵物監控技術正悄然引領寵物護理領域的新變革。借助尖端的傳感器技術、高清攝像頭以及強大的數據分析能力,這些智能系統為寵物主人開辟了前所未有的寵物關懷途徑,讓愛與關懷跨越時空限制。 智能寵物監控系統的核心…

SOME/IP 教程知識點總結

總結關于SOME/IP的教程,首先通讀整個文件,理解各個部分的內容。看起來這個教程從介紹開始,講到了為什么在車輛中使用以太網,然后詳細講解了SOME/IP的概念、序列化、消息傳遞、服務發現(SOME/IP-SD)、發布/訂閱機制以及支持情況。 首先,我需要確認每個章節的主要知識點。…

playbin之autoplug_factories源碼剖析

一、autoplug_factories_cb /* Called when we must provide a list of factories to plug to pad with caps.* We first check if we have a sink that can handle the format and if we do, we* return NULL, to expose the pad. If we have no sink (or the sink does not…

58區間和+44開發商購買土地(前綴和)

58. 區間和(第九期模擬筆試) 題目描述 給定一個整數數組 Array,請計算該數組在每個指定區間內元素的總和。 輸入描述 第一行輸入為整數數組 Array 的長度 n,接下來 n 行,每行一個整數,表示數組的元素。…

laravel11設置中文語言包

安裝中文語言包 Laravel 11 默認沒有內置完整中文語言包,推薦使用第三方維護的完整翻譯: # 通過 Composer 安裝語言包 composer require laravel-lang/common --dev# 發布中文語言文件到項目 php artisan lang:add zh_CN這會自動將中文語言文件生成到 l…

智能文檔解析與語義分割:LlamaIndex 節點解析器模塊全解

節點解析器模塊 - LlamaIndex 文件內容的節點解析器 有幾種基于文件的節點解析器,它們會根據解析的內容類型(JSON、Markdown 等)創建節點。 最簡單的流程是將 FlatFileReader 與 SimpleFileNodeParser 結合使用,自動為每種內容類型選擇最佳節點解析器。然后,可以將基于…

實現遍歷Windows所有字體的基本屬性

參考podofo #include <windows.h> #include <string> #include <memory> #include <set> #include <unordered_map> #include <vector> #include <algorithm> #include <iostream> #include <iomanip> #include <fst…

postman--接口測試工具安裝和使用教程

postman–接口測試工具 postman是一款支持http協議的接口調試與測試工具&#xff0c;其主要特點就是功能強大&#xff0c;使用簡單且易用性好 。 無論是開發人員進行接口調試&#xff0c;還是測試人員做接口測試&#xff0c;postman都是我們的首選工具之一 。 下面先通過一張…

綜合練習 —— 遞歸、搜索與回溯算法

目錄 一、1863. 找出所有子集的異或總和再求和 - 力扣&#xff08;LeetCode&#xff09; 算法代碼&#xff1a; 代碼思路 問題分析 核心思想 實現細節 代碼解析 初始化 DFS 函數 時間復雜度 空間復雜度 示例運行 輸入 運行過程 總結 二、 47. 全排列 II - 力扣&a…

代碼隨想錄算法訓練day64---圖論系列8《拓撲排序dijkstra(樸素版)》

代碼隨想錄算法訓練 —day64 文章目錄 代碼隨想錄算法訓練前言一、53. 117. 軟件構建—拓撲排序二、47. 參加科學大會---dijkstra&#xff08;樸素版&#xff09;總結 前言 今天是算法營的第64天&#xff0c;希望自己能夠堅持下來&#xff01; 今天繼續圖論part&#xff01;今…