当前位置: 首页 > article >正文

ngx_queue_sort

1 定义ngx_queue_sort 函数 定义在 ./nginx-1.24.0/src/core/ngx_queue.cvoidngx_queue_sort(ngx_queue_t*queue,ngx_int_t(*cmp)(constngx_queue_t*,constngx_queue_t*)){ngx_queue_t*q,*prev,*next;qngx_queue_head(queue);if(qngx_queue_last(queue)){return;}for(qngx_queue_next(q);q!ngx_queue_sentinel(queue);qnext){prevngx_queue_prev(q);nextngx_queue_next(q);ngx_queue_remove(q);do{if(cmp(prev,q)0){break;}prevngx_queue_prev(prev);}while(prev!ngx_queue_sentinel(queue));ngx_queue_insert_after(prev,q);}}ngx_queue_sort 函数对 nginx 的双向链表进行原地插入排序。 它遍历链表中的每个元素将其从原位置移除 然后在已排序的部分中找到正确的位置插入 最终使整个链表按照用户提供的比较函数有序排列。2 详解1 函数签名voidngx_queue_sort(ngx_queue_t*queue,ngx_int_t(*cmp)(constngx_queue_t*,constngx_queue_t*))返回值 该函数不返回任何值。 排序操作直接在传入的链表上进行 即原地排序不需要返回新的链表头参数 ngx_queue_t *queue 该参数是一个指向链表哨兵节点的指针 通过它可以访问整个链表。 调用时queue 指向链表的哨兵 哨兵本身不存储数据仅作为头尾标记。 该链表是循环的哨兵的 next 指向第一个元素prev 指向最后一个元素。 ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *) 这是一个函数指针指向用户提供的比较函数。 其具体含义如下 返回类型 ngx_int_t nginx 中通常定义为 intptr_t 或 int用于返回比较结果。 参数列表 (const ngx_queue_t *, const ngx_queue_t *) 两个参数都是指向 ngx_queue_t 的常量指针分别代表待比较的两个链表节点元素。 比较逻辑由用户实现应返回 0 (负数) 第一个参数 小于 第二个参数 第一个参数排在前面 0 (零) 两个参数 相等 保持原有相对顺序 (稳定排序) 0 (正数) 第一个参数 大于 第二个参数 第二个参数排在前面 函数指针的使用方式 在 ngx_queue_sort 内部会通过 cmp(prev, q) 的形式调用该比较函数 以确定节点 q 应插入到 prev 的前面还是后面。2 逻辑流程1 局部变量 2 链表检查 3 遍历排序1 局部变量{ngx_queue_t*q,*prev,*next;2 链表检查qngx_queue_head(queue);if(qngx_queue_last(queue)){return;}目的排除不需要排序的情况 判断逻辑的三种情况 #1 链表为空 ngx_queue_head(queue) 和 ngx_queue_last(queue) 都等于哨兵 二者相等条件成立函数返回。空链表无需排序。 #2 链表只有一个有效节点 头节点和尾节点指向同一个有效节点 二者相等条件成立函数返回。单元素链表已有序。 #3 链表有两个或以上有效节点 头节点和尾节点不同条件不成立继续执行后续的插入排序循环。3 遍历排序for(qngx_queue_next(q);q!ngx_queue_sentinel(queue);qnext){prevngx_queue_prev(q);nextngx_queue_next(q);ngx_queue_remove(q);do{if(cmp(prev,q)0){break;}prevngx_queue_prev(prev);}while(prev!ngx_queue_sentinel(queue));ngx_queue_insert_after(prev,q);}}#1 循环初始化q ngx_queue_next(q) 这里将 q 更新为链表的第二个元素因为第一个元素作为已排序部分的基础不需要移动。 循环条件q ! ngx_queue_sentinel(queue) 当 q 没有指向哨兵节点时说明还有待处理的元素。 哨兵是链表的虚拟头尾标记遍历到哨兵意味着已经处理完所有有效节点。 循环增量q next 在每次迭代末尾将 q 更新为之前保存的 next即原链表中当前元素的下一个节点。 因为当前元素 q 可能在插入过程中被移动所以必须提前保存它的后继。#2 在移除 q 之前保存它在原链表中的前驱 prev 和后继 next。 prev 用于搜索插入位置从当前位置向前查找next 用于循环继续遍历。#3 将节点 q 从链表中临时移除使其脱离原位置。 这样后续的插入操作可以自由地将 q 放到任何地方。#4 搜索插入位置 从原前驱 prev 开始不断向前向链表头部方向移动直到找到正确的插入点。 比较逻辑 如果 cmp(prev, q) 0说明 prev 应该排在 q 之前或相等 则 q 应该插入在 prev 的后面此时终止循环。 否则继续向前移动 prev即 prev ngx_queue_prev(prev)。 边界条件 如果一直移动到哨兵节点prev ngx_queue_sentinel(queue) 说明 q 应该成为新的第一个元素即插入在哨兵之后。 为什么用 do-while 因为 prev 最初至少指向第一个元素q 至少是第二个元素 所以至少需要比较一次。 do-while 保证了至少执行一次比较逻辑简洁无需额外处理 prev 为哨兵的初始情况。#5 将节点 q 插入到 prev 的后面。 如果 prev 是哨兵则插入到链表头部 否则插入到已排序部分的适当位置。 插入后q 就位于已排序序列的正确位置已排序部分增长一个元素。

相关文章:

ngx_queue_sort

1 定义 ngx_queue_sort 函数 定义在 ./nginx-1.24.0/src/core/ngx_queue.cvoid ngx_queue_sort(ngx_queue_t *queue,ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)) {ngx_queue_t *q, *prev, *next;q ngx_queue_head(queue);if (q ngx_queue_last(queue)) {r…...

GLM-OCR与LSTM网络融合实践:提升连续手写体文本识别效果

GLM-OCR与LSTM网络融合实践:提升连续手写体文本识别效果 最近在折腾一个挺有意思的项目,朋友那边有个需求,要识别一些手写的病历和处方。你懂的,医生那笔迹,龙飞凤舞,连笔连得飞起,传统的OCR工…...

Java 开发 日志技术

1.概述为什么要在程序中记录日志呢?便于追踪应用程序中的数据信息、程序的执行过程。便于对应用程序的性能进行优化。便于应用程序出现问题之后,排查问题,解决问题。便于监控系统的运行状态。2.日志框架JUL:这是JavaSE平台提供的官…...

【2.0 教程】第 7 章:仪表盘,一眼看全局

🎉NocoBase V2 系列教程已在官网-教程专栏发布,点击链接前往查看。 https://docs.nocobase.com/cn/tutorials/v2/ 已发布教程速览: NocoBase 2.0 入门教程 —— IT 工单系统 第一章:认识 NocoBase — 5 分钟跑起来 第二章&…...

如何全面移除开源工具残留?四步环境净化实施方案

如何全面移除开源工具残留?四步环境净化实施方案 【免费下载链接】ralph-claude-code Autonomous AI development loop for Claude Code with intelligent exit detection 项目地址: https://gitcode.com/GitHub_Trending/ra/ralph-claude-code 一、问题诊断…...

避坑指南:解决多Livox雷达在ROS中TF树报错‘extrapolation into the past’的完整流程

避坑指南:解决多Livox雷达在ROS中TF树报错‘extrapolation into the past’的完整流程 当你在ROS系统中整合多个Livox雷达时,突然遭遇[WARN] Lookup would require extrapolation into the past的警告信息,Rviz中点云显示异常或TF树断裂&…...

比话降AI使用教程:从注册到拿到合格检测报告全流程详解

比话降AI使用教程:从注册到拿到合格检测报告全流程详解 不少同学找到比话降AI,是因为看到了那个承诺:AI率大于15%全额退款,还退检测费。 这个承诺确实不一样。其他工具一般只说"效果不好可重做",但重做了几…...

Qwen2.5-72B-GPTQ-Int4惊艳效果:128K上下文长文档摘要与重点提取

Qwen2.5-72B-GPTQ-Int4惊艳效果:128K上下文长文档摘要与重点提取 1. 模型概述与核心能力 1.1 Qwen2.5系列模型简介 Qwen2.5是通义千问大模型系列的最新版本,提供了从0.5B到72B不同参数规模的预训练和指令调优模型。相比前代Qwen2,这个版本…...

wangEditor 5移动端兼容性深度解析:终极跨平台富文本编辑实战指南

wangEditor 5移动端兼容性深度解析:终极跨平台富文本编辑实战指南 【免费下载链接】wangEditor wangEditor —— 开源 Web 富文本编辑器 项目地址: https://gitcode.com/gh_mirrors/wa/wangEditor 在移动优先的时代,富文本编辑器的移动端兼容性已…...

如何高效使用AI音频分离神器:Ultimate Vocal Remover GUI完全指南

如何高效使用AI音频分离神器:Ultimate Vocal Remover GUI完全指南 【免费下载链接】ultimatevocalremovergui 使用深度神经网络的声音消除器的图形用户界面。 项目地址: https://gitcode.com/GitHub_Trending/ul/ultimatevocalremovergui Ultimate Vocal Rem…...

VideoAgentTrek-ScreenFilter效果展示:Zoom/Teams会议窗口自动边界检测

VideoAgentTrek-ScreenFilter效果展示:Zoom/Teams会议窗口自动边界检测 你有没有遇到过这样的场景?在录制线上会议、网课或者远程演示时,屏幕上同时开着好几个窗口——Zoom会议、Teams聊天、PPT演示、还有一堆浏览器标签页。后期剪辑时&…...

Pixel Dream Workshop 对比测试:不同采样器与模型版本的出图效果

Pixel Dream Workshop 对比测试:不同采样器与模型版本的出图效果 1. 测试背景与目的 在AI绘画领域,采样器和模型版本的选择直接影响最终生成效果。本次测试旨在通过严谨的对比实验,帮助用户理解Pixel Dream Workshop中不同参数组合的实际表…...

AIO PathProb 时序概率路径系统

本文由(拓世网络技术开发工作室)技术支持,欢迎共同开发第一部分:伪代码 / 算法描述(给算法/工程侧)1. 全局定义(状态与概率)import numpy as npfrom dataclasses import dataclass# …...

电容选型实战指南

电容选型这件事,比电阻要复杂得多。电阻选错了,大多数情况是“烧了”或“不准了”;电容选错了,可能直接导致系统复位、EMI超标、寿命骤减、甚至爆炸。电容是电路中最“敏感”的元件之一,它的选型需要在电气性能、温度特性、寿命、成本、体积之间反复权衡。 一、 选型前的四…...

Xilinx ZYNQ/MPSOC开发者必看:如何为你的PetaLinux 2022.1工程搭建一个高效的本地缓存服务器(sstate downloads)

Xilinx ZYNQ/MPSOC团队开发实战:构建企业级PetaLinux缓存服务器集群 当五个工程师同时对着公司服务器发起全量编译时,机房里传出的风扇轰鸣声总让我想起波音747起飞——这是我们去年某个ZYNQ UltraScale项目的日常。直到我们在本地部署了分布式sstate缓存…...

UniHacker技术探索:Unity引擎全功能体验与开源研究指南

UniHacker技术探索:Unity引擎全功能体验与开源研究指南 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker 一、核心价值解析:技术研究视…...

AtlasOS系统Xbox控制器驱动问题:三步解决方案与预防指南

AtlasOS系统Xbox控制器驱动问题:三步解决方案与预防指南 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atl…...

如何让零基础快速掌握3D资产生成:颠覆式AI工具Hunyuan3D-2实战指南

如何让零基础快速掌握3D资产生成:颠覆式AI工具Hunyuan3D-2实战指南 【免费下载链接】Hunyuan3D-2 High-Resolution 3D Assets Generation with Large Scale Hunyuan3D Diffusion Models. 项目地址: https://gitcode.com/GitHub_Trending/hu/Hunyuan3D-2 技术…...

乙巳马年·皇城大门春联生成终端W数据库课程设计案例:用户作品管理平台

乙巳马年皇城大门春联生成终端W数据库课程设计案例:用户作品管理平台 又到了一年一度的数据库课程设计选题季,你是不是还在为“学生信息管理系统”、“图书管理系统”这类老掉牙的题目发愁?想找个既有技术深度,又能结合当下热点&…...

失真度测量仪校准 失真度测量仪校准检定装置应用方案 失真度仪校准器 失真度仪检定装置

在电子测量、计量检定、设备运维及科研生产等领域,失真度仪是检测信号纯净度的核心仪器,其测量精度直接决定产品质量管控、设备运维可靠性及科研数据准确性。但实际应用中,传统校准设备普遍存在精度不足、操作繁琐、场景适配性差、数据管理不…...

DAMOYOLO-S与数据库联动:检测结果实时入库与查询

DAMOYOLO-S与数据库联动:检测结果实时入库与查询 你有没有想过,当AI模型在摄像头前“看到”一个人、一辆车时,这些信息除了在屏幕上显示一下,还能做什么?如果这些“看见”的瞬间——谁、在哪儿、什么时候、有多确定—…...

终极指南:如何用jQuery.Flipster打造惊艳的3D封面流效果

终极指南:如何用jQuery.Flipster打造惊艳的3D封面流效果 【免费下载链接】jquery-flipster Responsive, CSS3, touch-enabled jQuery Coverflow plugin. 项目地址: https://gitcode.com/gh_mirrors/jq/jquery-flipster 还在为网站轮播图太单调而烦恼吗&#…...

Vant4移动端电商实战:用Card和Cell组件打造订单详情页(附完整代码)

Vant4移动端电商实战:用Card和Cell组件打造订单详情页(附完整代码) 在移动电商应用开发中,订单详情页是用户查看购买信息的重要界面。Vant4作为轻量、可靠的移动端组件库,其Card和Cell组件能够快速构建清晰、美观的订单…...

用Python和C语言两种解法,搞定ZZULIOJ 1091‘爬楼梯’问题(附多实例测试详解)

用Python和C语言两种解法,搞定ZZULIOJ 1091‘爬楼梯’问题(附多实例测试详解) 当你第一次看到这个题目时,可能会觉得它只是一个简单的递归问题。但深入思考后会发现,这实际上是动态规划的经典案例——斐波那契数列的变…...

InstructPix2Pix真实体验:保留原图结构的智能修图,到底有多好用?

InstructPix2Pix真实体验:保留原图结构的智能修图,到底有多好用? 1. 颠覆传统的修图体验 作为一名长期与图像处理打交道的技术从业者,我第一次使用InstructPix2Pix时的感受可以用"惊艳"来形容。传统的图像编辑工具需要…...

16张动图解析网络基础原理与应用

16张动图趣味解读网络原理1. 网络基础概念1.1 网络的定义与作用网络存在于日常生活中的每一个角落,电脑、打印机、手机、电视等设备都属于网络设备。通过网络连接这些设备,可以实现数据传输和共享,让工作生活更加便捷。典型的网络应用场景包括…...

AMD平台黑苹果智能配置引擎:从技术困境到自动化解决方案的完整指南

AMD平台黑苹果智能配置引擎:从技术困境到自动化解决方案的完整指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在传统黑苹果配置领域&…...

Harness设计——Anthropic实战:规划器、生成器、评估器三角色协作详解

Harness 设计是实现智能体编码前沿性能的关键。本文介绍了Anhtropic如何推动 Claude 在前端设计和长期自主软件开发方面更进一步。 有两个相互关联的问题: 让 AI Agent 生成高质量的前端设计。 让它无需人工干预就能构建完整的应用程序。 这项工作源于我们早期在前端设计技能…...

本地部署 LookScanned:轻松将 PDF 转为逼真扫描件,结合内网穿透实现远程访问

前言 本文主要介绍了 LookScanned 这款工具的部署与使用方法。LookScanned 可将普通电子 PDF 转换为高度逼真的纸质扫描件效果,全程本地处理保障隐私,操作简单且无需打印扫描的物理步骤。 文中详细讲解了在极空间通过 Docker 部署 LookScanned 的流程&…...

终极指南:5个简单步骤用eqMac提升macOS音频体验 [特殊字符]

终极指南:5个简单步骤用eqMac提升macOS音频体验 🎧 【免费下载链接】eqMac macOS System-wide Audio Equalizer & Volume Mixer 🎧 项目地址: https://gitcode.com/gh_mirrors/eq/eqMac 想为你的Mac打造专业级的音频体验吗&#x…...