mORMot2 Daily每日上游提交速读

日志启动死锁已修复,TLS 1.3 与 POSIX 路径趋于稳定

日志文件创建失败时,代码可能通过未初始化的 writer 递归记录日志,并让 SynLogGlobalLock 一直保持锁定,从而阻塞之后的所有日志线程。本期还完成 TLS 1.3 cipher suite 配置,修复 FPC POSIX 接口分派的 Currency 返回值,并消除 systemd 下 /dev/null 导致的忙循环。直接调用 WaitReadPending 的 POSIX 代码必须适配新的 integer 返回值,直接调用底层 x86-64 数值解析器的代码也应检查重命名后的 SSSE3 入口。

要点

  • 应采用 build 2.4.16922 的 cdb7dad52a6989d41ce8405a15d26928e0829ca2;它包含最终的日志与 Linux 关闭修复。
  • 启用异常日志时,即使日志文件创建失败,TSynLog 也不会再让所有日志线程死锁。
  • OpenSSL backend 现在通过 TNetTlsContext.CipherSuites 与 SSL_CTX_set_ciphersuites 配置 TLS 1.3。
  • FPC POSIX 接口分派现在通过 x87 FP0 路径返回 Currency,而不再把它当作 binary64 结果。
  • POSIX 上的 WaitReadPending 现在返回 -1、0 或 1;直接调用方必须用显式比较替代 boolean 用法。
  • 复用的 THttpRequestContext 现在会清空 AcceptEncoding,防止压缩偏好泄漏到下一请求。

升级建议

请采用当前 head 的 build 2.4.16922。应避开 build 2.4.16907,因为 allocator 宽度修复尚未包含 16908 增加的 nil guard;避开 2.4.16913,因为时区日志解析在 16914 才修复;也不要停在 2.4.16915,因为 TLS 1.3 binding 到 16916 才接入 TOpenSslNetTls。请重建每个 Delphi/FPC target,并测试日志创建失败、接口返回 Currency、TLS 1.3 协商、systemd 关闭以及 HTTP request context 复用。

版本号2.4.16897 → 2.4.16922
提交26
行数+893 -326
阅读3 分钟

22 条中的 22 条 · 上游 26 次提交

主题
# 条目 类别 单元
1 严重 日志文件创建失败不再冻结所有日志线程 TSynLog.LogFileInit 会保存当前 thread-info flag,在 fWriter 未就绪时设置 tiExceptionIgnore,并在 finally block 中恢复 flag。这可防止 CreateLogWriter 失败时,在 SynLogGlobalLock 释放前递归记录到同一实例。 修复 mormot.core.log 0165307d+39-0

core: fixed TSynLog deadlock when the log file can't be created

影响

启用 ptIdentifiedInOneFile 与异常日志时,不可写或缺失的日志路径不再在解锁前触发 access violation,从而阻塞所有其他线程的第一次日志调用。

Sven Harazim · 17:37 UTC · 在 GitHub 上查看该提交 →

2 高 数值解析器移到可选择的 Pascal 与 SSSE3 入口之后 GetExtended 现在通过 GetExtendedStub 分派,并在支持的 ASMX64NOTPIC target 上选择 GetExtendedSsse3;GetNumericVariantFromJson 则通过 GetNumericVariantStub 分派,默认使用 GetNumericVariantPas。原来的 mormot.core.base 底层 assembly symbol 被重命名并加上 Ssse3 后缀。 破坏性变更 mormot.core.base+3 acc10bf5+62-21

core: define GetExtended/GetNumericVariantFromJson as stubs

影响

正常调用 mormot.core.text.GetExtended 与 mormot.core.variants.GetNumericVariantFromJson 的代码保持原 signature。直接引用 mormot.core.base 条件 assembly declaration 的代码将无法编译,必须改用新的 Ssse3 symbol 或公开 wrapper。

需要迁移

搜索限定调用 mormot.core.base.GetExtended 与 mormot.core.base.GetNumericVariantFromJson;改用 mormot.core.text、mormot.core.variants 中的 wrapper,或在确实需要直接 SIMD 控制时使用新的 Ssse3 名称。

公开 API

  • mormot.core.base.GetExtendedrenamed — 条件 x86-64 assembly 入口现名为 GetExtendedSsse3;常用的 mormot.core.text.GetExtended wrapper 保持不变。
  • mormot.core.base.GetNumericVariantFromJsonrenamed — 条件 x86-64 assembly 入口现名为 GetNumericVariantSsse3;mormot.core.variants wrapper 保持不变。
  • TGetExtended / GetExtendedStubadded — 用于选择 GetExtendedPas 或 GetExtendedSsse3 的公开 function type 与 dispatch variable。
  • TGetNumericVariantFromJson / GetNumericVariantStubadded — 公开 function type 与 dispatch variable,默认指向 GetNumericVariantPas。

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

3 高 systemd stdin 不再让 ConsoleWaitForEnterKey 占满 CPU POSIX WaitReadPending 从 boolean 改为 integer:可读输入返回 1,timeout 返回 0,HUP、ERR 或 NVAL 返回 -1。ConsoleWaitForEnterKey 遇到无效 polling 或 EOF 时会等待,不再对 systemd 的 /dev/null 立即重试。 破坏性变更 mormot.core.os+1 c2f8bb0f+27-11

core: fixed ConsoleWaitForEnterKey() when run under systemd

影响

在 systemd 下使用 ConsoleWaitForEnterKey 的 POSIX 服务不再因 stdin 为 /dev/null 而占满一个 CPU core。直接调用 WaitReadPending 的外部代码遇到 source-breaking 返回类型变化,必须显式比较结果。

需要迁移

在 POSIX 代码中搜索 WaitReadPending 调用;> 0 表示可读,= 0 表示 timeout,< 0 表示 HUP、ERR 或 NVAL。请部署完整的 2.4.16922 关闭序列。

公开 API

  • WaitReadPendingsignature-changed — POSIX-only 返回值由 boolean 改为 integer,状态为 -1、0、1。

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

4 高 QuickJS 栈限制 binding 现在接收 runtime 对象 JS_SetMaxStackSize 的公开 Pascal declaration 把第一个参数从 JSContext 改为 JSRuntime,以匹配 QuickJS C API。底层 external symbol 与 cdecl 约定不变。 破坏性变更 mormot.lib.quickjs 37fa86b4+3-4

lib: fixed JS_SetMaxStackSize() definition

影响

传入 JSContext 的代码此前提供了错误的 opaque object,现在必须传入其 JSRuntime。由于 pointer type 不同,typed Pascal 调用点应在编译时暴露不匹配。

需要迁移

搜索 JS_SetMaxStackSize 调用,把 JSContext 参数替换为其所属 JSRuntime,然后重建 QuickJS 集成。

公开 API

  • JS_SetMaxStackSizesignature-changed — 第一个参数由 JSContext 改为 JSRuntime。

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

5 高 TLS 1.3 获得独立可配置的 cipher suite 列表 TNetTlsContext 新增 TLS 1.3 专用 CipherSuites。TOpenSslNetTls.SetupCtx 在为空时填入考虑 AES 硬件的默认值,除非设置 DisableTls13,否则调用 SSL_CTX_set_ciphersuites,并按配置启用 server cipher preference 与 OpenSSL ChaCha 优先 option。 修复 mormot.lib.openssl11+1 7eb6b9e5+35-7

net: proper TLS 1.3 support

影响

OpenSSL server 与 client 现在可独立于 TLS 1.3 之前的 CipherList 控制 TLS 1.3 suite。仅配置 CipherList 不再意味着 TLS 1.3 使用相同名称,因此严格 cipher policy 的部署应显式设置并测试 CipherSuites。

公开 API

  • TNetTlsContext.CipherSuitesadded — 以冒号分隔并传给 SSL_CTX_set_ciphersuites 的 TLS 1.3 suite 名称;SChannel 不使用。

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

6 高 以 Z 结尾的线程标识符不再导致已解析日志为空 TSynLogFile 现在检查 LineBeg[fLineLevelOffset - 2] 的时区时间戳标记,而不是检查后面可能属于 Int18ToText 编码线程号的字节。回归测试覆盖 thread 58 在启用与未启用 ZonedTimestamp 时的情况。 修复 mormot.core.log 29b5fb26+38-3

core: fixed TSynLogFile zone layout

影响

日志读取器不再把普通线程 ID 字节 Z 误判为时区标记,从而避免 level offset 偏移并把文件加载为零条已解析事件。

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

7 高 FPC POSIX 接口调用从正确寄存器返回 Currency mormot.core.interfaces 的 assembly 分派不再把 imvCurrency 与浮点 Double、DateTime 结果归为一类。在 FPC x86-64 SysV 上,它现在把 Currency 从 x87 ST0 提取到 TCallMethodArgs.res64;其他 ABI 保留 integer 返回寄存器路径。 修复 mormot.core.interfaces 6a27c07f+9-7

core: fixed currency result in mormot.core.interfaces

影响

在 FPC POSIX 上通过该 dispatcher 调用接口方法的 backend 现在能获得预期 Currency 值,不再按错误的结果约定读取。此修复不改变 Delphi 与非 POSIX 返回路径。

公开 API

  • Currency results through mormot.core.interfacesbehaviour-changed — FPC POSIX x86-64 从 x87 ST0 读取 imvCurrency;其他 target 保持原生约定。

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

8 高 复用的 HTTP request context 不再保留 Accept-Encoding THttpRequestContext.Reset 现在与 UserAgent、Referer 等每请求 string 一样,通过 FastAssignNew 清空 AcceptEncoding。压缩状态随后根据下一请求重新计算,而不是使用残留 header value。 修复 mormot.net.http 4c990d65+4-2

net: fixed Accept-Encoding issue

影响

在持久连接或 pooled context 上,不含 Accept-Encoding 的请求不再继承前一请求的压缩偏好,避免根据过期 client capability 协商响应编码。

公开 API

  • THttpRequestContext.Resetbehaviour-changed — Reset 现在会在请求之间清空 AcceptEncoding。

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

9 高 DoubleToAscii 初始化小数生成 flag DoubleToAscii 在生成小数位前把本地变量 fl 设为 0。此前此处只初始化 CPU32 专用 sticky variable,导致 fl 依赖未初始化的 stack 内容。 修复 mormot.core.text 45ff2b23+3-2

core: fixed uninitialized flag in DoubleToAscii()

影响

浮点文本格式化不再让未初始化 flag 影响小数位路径。这会影响使用该 Pascal 实现的 Delphi 与 FPC backend,包括基于 DoubleToAscii 的 JSON 或文本序列化。

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

10 中 静态库 allocator wrapper 改用指针宽度长度 QuickJS 与静态库的 pas_malloc、pas_realloc、pas_malloc_usable_size wrapper 从 32 位 integer/cardinal 长度改为与 size_t 兼容的 PtrUInt 类型。pas_calloc 也会在 AllocMem 前拒绝 n × size 溢出。 修复 mormot.lib.quickjs+1 66d7d51c+31-28

lib: fixed pas_malloc() wrapper definition

影响

FPC 与 Delphi 静态 binding 现在在 64 位 target 上匹配原生 size_t ABI,并拒绝发生回绕的 calloc size。Build 16907 不应单独使用,因为其 FPC usable-size wrapper 到 16908 才加入 nil guard。

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

11 中 控制台关闭在终止后不再额外等待 ConsoleWaitForEnterKey 现在会在 polling 失败后的 sleep、读取 stdin 之前以及 EOF 之后检查 SynDaemonTerminated。同一 commit 的 OpenSSL 修改只澄清 SSL_OP_PRIORITIZE_CHACHA 注释。 修复 mormot.core.os.posix+1 be7dfd60+20-16

core: tuned ConsoleWaitForEnterKey() shutdown

影响

POSIX 控制台进程记录终止信号后可立即退出 /dev/null fallback loop。除前一 commit 的 WaitReadPending signature 变化外,没有公开 API 变化。

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

12 中 allocator size 查询支持 nil,并修正数值 benchmark pas_malloc_usable_size 现在仅对非 nil pointer 调用 FPC MemSize,否则返回 0,以符合 QuickJS fallback 预期。数值 benchmark 也会正确判断生成输入类别,不再在指数形式后追加 0。 修复 mormot.lib.static c54910c3+9-8

test: fixed number benchmark values generation

影响

FPC QuickJS 分配代码可以查询未知 nil allocation,而不会把 nil 传给 MemSize。其他应用行为不变;后一部分仅修复测试数据生成。

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

13 中 中止的 LDAP 搜索会在返回前释放待处理 range 状态 TLdapClient.SearchAllDocRaw 检测到 fAborted 后,现在会清除中止 flag,并在返回 false 前释放 fSearchRange,而不再让分页 range 对象留在中止路径上。 修复 mormot.net.ldap 7fdb36cb+2-0

ldap - Fix exception if searchalldocraw aborted

影响

在 range attribute 获取期间中止 SearchAllDocRaw 的 LDAP client 不再保留过期 range 状态,避免它在清理或后续处理时触发异常。

Thomas Prud'homme · 08:55 UTC · 在 GitHub 上查看该提交 →

14 中 POSIX 终止信号会唤醒 Linux futex 等待者 SynDaemonSignal 设置 SynDaemonTerminated 后,会在可用时调用 OsWakeAllOnValue。公开变量文档现在还展示 Linux 代码如何使用 OsWaitOnValue 等待其地址。 新功能 mormot.core.os+1 7000cacc+7-2

core: SynDaemonTerminated can be notified by Linux futex

影响

阻塞在终止值上的 Linux 线程在处理 SIGQUIT、SIGTERM 或 SIGINT 时可立即唤醒,无需依赖 polling interval。其他 POSIX target 保持原行为。

公开 API

  • SynDaemonTerminatedbehaviour-changed — 信号赋值现在会在 Linux 上唤醒 OsWaitOnValue 等待者。

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

15 中 控制台等待复用 daemon 终止 futex 新的内部 helper WaitForDaemonTermination 在可用时通过 OsWaitOnValue 对 SynDaemonTerminated 等待最多一秒,否则 sleep。ConsoleWaitForEnterKey 在 poll error 与 EOF 后使用它,文档还警告直接赋值时也必须唤醒等待者。 性能 mormot.core.os+1 7e0e8d16+28-18

core: ConsoleWaitForEnterKey() use our shutdown futex

影响

Linux 控制台服务无需固定 sleep-only loop 即可响应 daemon 终止,同时仍避免 systemd /dev/null CPU 忙循环。手动给 SynDaemonTerminated 赋值的代码必须遵守文档中的 wake 要求。

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

16 低 OpenSSL loader 暴露 TLS 1.3 cipher suite function mormot.lib.openssl11 在直接与动态 API 中新增 SSL_CTX_set_ciphersuites,把它作为可选 symbol 加载,并在 OpenSSL 1.1.0 缺少该 symbol 时返回成功。DTLS option alias 也补充到 SSL_OP_NO_DTLSv1_3。 新功能 mormot.lib.openssl11 02bcae4a+53-32

lib: SSL_CTX_set_ciphersuites() support

影响

binding 可在导出该 function 的 OpenSSL 版本上配置 TLS 1.3 suite,同时不破坏旧 1.1.0 的加载。TOpenSslNetTls 到下一 build 才调用它。

公开 API

  • SSL_CTX_set_ciphersuitesadded — 用于 TLS 1.3 cipher suite 列表的可选 OpenSSL binding。

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

17 低 编译开关可强制使用 SSSE3 JSON 数值解析 当定义 FORCE_SSSE3_JSON 与 ASMX64NOTPIC 且 cpuSSSE3 可用时,初始化会把 GetNumericVariantStub 指向 GetNumericVariantSsse3。未定义该条件时,stub 继续使用在常规 JSON 测试中更快的 GetNumericVariantPas。 新功能 mormot.core.base.asmx64+1 e1036ba5+23-16

core: new FORCE_SSSE3_JSON conditional

影响

默认 Delphi/FPC 行为不变。团队可按自身 workload 在编译时启用 SSSE3 JSON parser,但此 commit 未声称普遍性能提升。

值得一看

仅在每个 x86-64 compiler target 上对代表性 JSON 数字长度完成 benchmark 后启用 FORCE_SSSE3_JSON。

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

18 低 短科学计数值绕过通用 SSSE3 归约路径 GetExtended 与 GetNumericVariantFromJson 的 x86-64 实现为一位和两位 integer 增加直接转换路径,包括 1E2、10E2 等形式,然后才进入更通用的 SIMD 归约代码。 性能 mormot.core.base.asmx64 d6709b01+76-45

core: direct 1/2 digit xEy xxEy patterns for x64 SSSE3 asm

影响

常见短数值 token 在 SSSE3 x86-64 target 上执行更少的 assembly 步骤。公开 signature 与解析值不变,其他 Delphi/FPC backend 保持原有路径。

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

19 低 Linux daemon worker 阻塞等待终止,不再轮询 RunUntilSigTerminated 在主线程保留 CheckSynchronize polling,但非主 FPC Linux 线程在 futex 可用时会通过 OsWaitOnValue 无限等待。其他路径保留 100 ms sleep loop。 性能 mormot.core.os.posix 9247be3c+10-5

core: RunUntilSigTerminated() use an INFINITE futex on Linux

影响

在 worker thread 上运行此循环的 daemon 不再周期性唤醒,并由前面新增的 signal-handler wake 释放。主线程同步行为与非 Linux backend 不变。

公开 API

  • RunUntilSigTerminatedbehaviour-changed — 非主线程 FPC Linux 调用方在可用时使用无限 futex wait。

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

20 低 映射文本与日志读取器每次操作只缓存一个行指针 TMemoryMapText.GetLine、GetString、LineContains、LineSize、LineSizeSmallerThan 会先把 fLines[aIndex] 缓存到本地 pointer,再计算边界。TSynLogFile 使用同样模式,简化 GetEventText 长度处理,并扩展相关映射行测试。 内部重构 mormot.core.buffers+2 d73cd49e+55-35

core: refactored TSynLogFile/TMemoryMapText

影响

公开 method signature 不变。现有 Delphi/FPC 应用只会看到内部行读取清理,但仍应采用下一 build,因为时区布局检测到 2.4.16914 才修正。

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

21 低 数值 benchmark 覆盖更多 token 形态与两个解析 API TTestCoreBase 把生成输入从普通小数扩展到短 integer、长小数与指数形式,随后计时并交叉检查 GetExtended 与 GetNumericVariantFromJson。assembly 修改仅修正注释。 测试 mormot.core.base.asmx64 3b77a2fe+96-42

tests: enhance performance tests

影响

backend 行为与公开 API 不变。更大的性能测试框架为未来的 parser 选择与优化提供更广的依据。

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

22 低 科学计数法加入 x86-64 数值回归矩阵 数值测试现在会把 DoubleToString 输出同时传给 GetExtended 与 GetNumericVariantFromJson,并新增带指数的正负一位、两位尾数。 测试 5f5bd051+25-4

tests: enhanced x64 asm numbers coverage

影响

应用行为不变。新增 assertion 防止短科学计数法 assembly 路径在数值与结束指针上回归。

Arnaud Bouchez · 07:41 UTC · 在 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