mORMot2 Daily每日上游提交速读

零延迟 WebSocket 正确唤醒,IOCP 取消订阅实现原子化

网络后端获得多项明确的并发修复:零延迟 WebSocket 帧会唤醒异步服务器,已连接的隧道 socket 进入正确处理路径,Windows IOCP 订阅只能被一个调用者取得并移除。TSynLog 线程槽复用也已完善,只有清除各日志中的线程命名位后才会发布槽位供复用。UI 使用者应检查新的 HAS_UI_PDF 条件及 HASUIPDF 的移除;其余 PDF 改动主要涉及测试与平台选择。

要点

  • 当 SendDelay=0 且发送队列由空变为非空时,TWebSocketAsyncConnections 现在会唤醒异步服务器主线程。
  • TWinIocp.Unsubscribe 原子地把调用方订阅指针改为 nil,防止并发移除者处理同一对象。
  • TTunnelLocal 现在区分已绑定的监听 socket 与已连接 socket,恢复后者的正确处理路径。
  • TSynLog 在把线程编号归还可复用槽池前,先清除各日志中的线程名位。
  • HASUIPDF 被 HAS_UI_PDF 替代,并新增 NO_UI、NO_UI_VCL 与 NO_UI_PDF 项目控制。

升级建议

异步 WebSocket、TTunnelLocal、Windows IOCP 或高频创建线程的 TSynLog 工作负载应升级到 build 2.4.16753;它包含本批次的完整修复。重新编译 UI/PDF 项目,并将应用层 HASUIPDF 检查替换为 HAS_UI_PDF。仅在需要排除相关子系统时评估 NO_UI、NO_UI_VCL 与 NO_UI_PDF。原始数据未报告本期还有后续替代提交。

版本号2.4.16737 → 2.4.16753
提交13
行数+995 -375
阅读1 分钟

12 条中的 12 条 · 上游 13 次提交

主题
# 条目 类别 单元
1 高 日志槽仅在线程名位清除后才发布复用 mormot.core.log 的 TSynLog.NotifyThreadEnded 现在先在 SynLogGlobalLock 下清除 fThreadNameLogged,再锁定 SynLogThreads.Safe 并把线程编号加入 IndexReleased。位图索引也直接写为 num - 1。 修复 mormot.core.log 68f8a3cb+16-17

core: fixed another paranoid race in TSynLog.NotifyThreadEnded

影响

其他线程无法在线程终止清除旧位之前取得复用编号并设置新名称位。频繁创建线程的 Delphi/FPC 服务不会再丢失新所有者的标记。

Arnaud · 22:01 UTC · 在 GitHub 上查看该提交 →

2 高 Windows IOCP 取消订阅原子取得调用方指针 mormot.net.sock.windows 的 TWinIocp.Unsubscribe 先本地复制订阅指针,再用 LockedExc 仅在调用方 var 参数仍匹配时原子改为 nil。后续 shutdown、receive 与 free 均使用已取得的本地指针。 修复 mormot.net.sock.windows 76d9d035+9-9

net: made TWinIocp.Unsubscribe atomic

影响

并发调用者无法同时通过非 nil 检查并取消或释放同一 IOCP 订阅。Windows 异步服务器可避免重复关闭及该路径上的潜在释放后使用。

公开 API

  • TWinIocp.Unsubscribebehaviour-changed — 开始移除前,var 订阅指针会被原子取得并清空。

Arnaud Bouchez · 09:58 UTC · 在 GitHub 上查看该提交 →

3 高 零延迟 WebSocket 帧现在立即唤醒异步服务器 TWebSocketAsyncConnections.NotifyOutgoing 在加入连接前记录 fOutgoingHandle 是否为空。首项到达且 Connection.fProcess.Settings^.SendDelay 为零时,会调用新的 THttpAsyncConnections.WakeupServerMainThread 并触发 fExecuteEvent。 修复 mormot.net.async+1 a7195425+15-2

net: fixed TWebSocketAsyncConnections with SendDelay=0

影响

SendDelay=0 时,发送帧不再等待无关 socket 事件或空闲轮询才由异步主循环发出,Delphi/FPC WebSocket 服务器恢复预期的即时发送行为。

公开 API

  • TWebSocketAsyncConnections with SendDelay=0behaviour-changed — 首个排队发送连接会立即唤醒服务器循环。

Arnaud Bouchez · 14:55 UTC · 在 GitHub 上查看该提交 →

4 高 已连接本地隧道不再进入监听 accept 路径 mormot.net.tunnel 的 TTunnelLocal 将内部标志 fSocketCreated 更名为 fSocketBound,并仅在端口为零且 NewSocket 完成 bind 后设置。TTunnelLocalThread.DoExecute 仅在该绑定标志存在时进入 accept 循环。 修复 mormot.net.tunnel 9cb2c9bc+5-5

net: fixed TTunnelLocal socket flag

影响

连接到现有本地地址创建的隧道现在直接进入 stProcessing,不再对已连接 socket 调用 accept。绑定临时端口的隧道仍保持监听行为。

Arnaud Bouchez · 19:20 UTC · 在 GitHub 上查看该提交 →

5 中 UI 编译控制更名,CountOccurrences 成为公开函数 mormot.defines 用 HAS_UI_PDF 替换 HASUIPDF,并新增 HAS_UI、HAS_UI_VCL_LCL 以及项目开关 NO_UI、NO_UI_VCL、NO_UI_PDF。mormot.core.unicode 增加公开 CountOccurrences,用于统计 RawUtf8 中不重叠匹配;mormot.core.text 也修正 UInt32DigitsToUtf8 传入的参数名。 破坏性变更 mormot.core.text+3 fe0b21d2+59-18

core: new CountOccurrences() function

影响

应用或包中检查 HASUIPDF 的条件在更名前将不再选择 PDF 分支。项目可明确排除全部 UI、Delphi VCL 路径或仅 PDF;Delphi 与 FPC 均可调用 CountOccurrences。

需要迁移

在项目源码、包文件及构建定义中搜索 HASUIPDF,替换为 HAS_UI_PDF,然后重新构建各 UI 与无界面目标。

公开 API

  • HASUIPDFremoved — 项目检查应改用 HAS_UI_PDF。
  • HAS_UI / HAS_UI_VCL_LCL / HAS_UI_PDFadded — 描述应用项目级排除后的已启用 UI 能力。
  • NO_UI / NO_UI_VCL / NO_UI_PDFadded — 用于禁用全部 UI、VCL/LCL 或 PDF 支持的项目级开关。
  • CountOccurrencesadded — 统计 RawUtf8 Text 中不重叠的 SubStr 匹配。

Arnaud Bouchez · 09:47 UTC · 在 GitHub 上查看该提交 →

6 中 线程名位图清理纳入全局日志锁 mormot.core.log 的 TSynLog.NotifyThreadEnded 使用 SynLogGlobalLock 保护 SynLogFamily 及各 fGlobalLog.fThreadNameLogged 位图;原有 SynLogThreads.Safe 工作最初嵌套在该保护内。 修复 mormot.core.log 6539d93d+24-19

core: fixed a paranoid race in TSynLog.NotifyThreadEnded

影响

终止线程不再与日志族生命周期操作并发修改各族名称位图。后续 68f8a3c 在槽位复用前完成了正确顺序。

Arnaud · 21:33 UTC · 在 GitHub 上查看该提交 →

7 中 异步维护计时统一使用单调时钟尺度 mormot.net.async 在 ProcessWaitingWrite 可能重入空闲处理前记录 fLastOperationMS,之后再刷新。非 IOCP 回调周期现从 GetTickCount64 shr 16 计算 tix,而非 GetTickSec shr 6,与周边毫秒 tick 逻辑一致。 修复 mormot.net.async f50a5e53+6-4

net: fixed async internal ticks computation

影响

异步 socket 维护避免在同一 tick 重入工作,并使用一致的约 65 秒回调桶。主要影响 POSIX poll 后端;公开 API 不变。

Arnaud Bouchez · 14:56 UTC · 在 GitHub 上查看该提交 →

8 低 可复用定长哈希与临时缓冲类型扩展至 4096 位 mormot.core.base 新增 THash1024、THash2048、THash4096 及其指针别名,并增加 TTemp128 与 TTemp256。SHA-512、CPU 集、SSPI、ISO、DHCP 与 TFTP 中现有定长数组改用等长命名类型。 新功能 mormot.core.base+7 487c21e6+29-21

core: new THash1024..4096 and TTemp128..512 types

影响

应用代码获得标准的 128、256、512 字节二进制及栈缓冲声明。现有记录保持相同存储布局,因此内部替换不改变线格式。

公开 API

  • THash1024 / PHash1024 / THash2048 / PHash2048 / THash4096 / PHash4096added — 用于 128、256、512 字节值的命名字节数组及指针别名。
  • TTemp128 / TTemp256added — 128 与 256 字节的定长 AnsiChar 临时缓冲。

Arnaud Bouchez · 14:54 UTC · 在 GitHub 上查看该提交 →

9 低 异常日志上下文现包含数字线程槽 mormot.core.log 将普通异常上下文格式化为 [#编号 名称],不可用的部分会省略。_GetCurrentThreadName 在不改变锁的情况下简化,TDebugFile.AddLog 直接调用 DebugFileGet。 新功能 mormot.core.log 93da31e1+24-15

core: refined exception logging entry

影响

异常行更易与其他 TSynLog 记录关联,但只预期方括号内出现名称的解析器可能需要检查。异常处理及公开 API 不变。

值得一看

公开 API

  • TSynLog exception row formatbehaviour-changed — 普通异常上下文在可选线程名前增加 #ThreadNumber。

Arnaud · 22:01 UTC · 在 GitHub 上查看该提交 →

10 低 TMultiLightLock 改用明确的 32 位标志与原生线程标识 mormot.core.os 将私有 TMultiLightLock.Flags 从 PtrUInt 改为 cardinal,将 ThreadID 从 pointer 改为 TThreadID。因此操作改用 LockedExc32 与 LockedDec32,线程标识用零替代 nil。 内部重构 mormot.core.os aa0c8213+13-13

core: simplified TMultiLightLock

影响

锁所有权与可重入计数语义不变,各目标统一使用 32 位原子计数器。源码使用者只访问公开方法,重新编译后无需修改应用。

Arnaud Bouchez · 19:19 UTC · 在 GitHub 上查看该提交 →

11 低 TCachedValue 现在始终保存最后完成的刷新结果 mormot.core.os 的 TCachedValue.Cache 移除回调后赋值 Value 前的 TixShr = Tix32 条件。公开参数仅重新排版;mormot.core.os.security 说明移位八位代表 256 秒证书存储缓存。 内部重构 mormot.core.os+1 a697074f+6-7

core: minor TCachedValue.Cache change

影响

若不同缓存周期的刷新回调重叠,最后完成的结果会被保留,即使另一调用已推进 Tix32。常见文件与证书存储缓存的 API 和过期周期不变。

Arnaud Bouchez · 14:57 UTC · 在 GitHub 上查看该提交 →

12 低 PDF 回归测试由新的 UI 能力名称隔离 mormot.ui.pdf 与集成测试运行器将 HASUIPDF 替换为 HAS_UI_PDF,mormot.defines 为 FPC 增加 HAS_UI_LCL。test.ui.pdf 经过整理,使用 mormot.lib.z 读取夹具,并在无 PDF UI 支持时保留空实现单元。 测试 mormot.defines+1 cf21f26e+202-232

ui: more refactoring of #571 test.ui.pdf process

影响

无 UI 的测试构建不再需要初始化 VCL/LCL 或包含 PDF 测试单元。本后续提交不改变框架 PDF 运行时行为,只完成前一提交的条件名迁移。

公开 API

  • HAS_UI_LCLadded — FPC 启用 UI 支持时定义。

Arnaud Bouchez · 09:54 UTC · PR #571 · 在 GitHub 上查看该提交 →

上游活动 每日提交数 · 最近 60 天
提交977
活跃天数44/60
最忙一天2026-09-30
峰值60
2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 26 commits2026-08-28: 11 commits2026-08-29: 10 commits2026-08-30: 1 commit2026-08-31: 23 commits2026-09-01: 0 commits2026-09-02: 20 commits2026-09-03: 29 commits2026-09-04: 35 commits2026-09-05: 13 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 23 commits2026-09-09: 10 commits2026-09-10: 17 commits2026-09-11: 23 commits2026-09-12: 14 commits2026-09-13: 9 commits2026-09-14: 7 commits2026-09-15: 4 commits2026-09-16: 24 commits2026-09-17: 26 commits2026-09-18: 21 commits2026-09-19: 59 commits2026-09-20: 13 commits2026-09-21: 5 commits2026-09-22: 34 commits2026-09-23: 17 commits2026-09-24: 57 commits2026-09-25: 22 commits2026-09-26: 26 commits2026-09-27: 0 commits2026-09-28: 2 commits2026-09-29: 19 commits2026-09-30: 60 commits2026-10-01: 26 commits2026-10-02: 30 commits2026-10-03: 32 commits2026-10-04: 15 commits2026-10-05: 1 commit2026-10-06: 26 commits2026-10-07: 37 commits2026-10-08: 27 commits2026-10-09: 35 commits2026-10-10: 33 commits2026-10-11: 9 commits2026-10-12: 11 commits2026-10-13: 35 commits
2026-08-152026-10-13