mORMot2 Daily每日上游提交速读

每个 writer 独立加锁落地,并补上必要的 fallback 修复

TSynLog 用每个 writer 独立的锁替代进程级全局写锁,降低争用,但也暴露出同一批次稍后才修复的失败路径。直接使用 TX64CpuFeatures 的代码必须移除 cpuSSSE3 引用;支持的 x86-64 target 现在会自动选择 SSSE3 JSON 数值 parser。日志查看器、诊断工具与 AppendShortByteHex 调用方也获得了明确的正确性和 API 改进。

要点

  • 应采用 build 2.4.16943 的 0b26918230d72e33b79365a79c1bc444ec3029b1;避开 build 2.4.16937–2.4.16941 中不完整的 TSynLog 序列。
  • TSynLog 现在按 logger 分别串行化写入,不再通过单个全局写锁,从而降低独立日志之间的争用。
  • Build 2.4.16942 修复锁重构引入的 Enter、EnterLocal 与 ManualEnter 失败路径。
  • TX64CpuFeatures.cpuSSSE3 已移除;需要检测该能力时请使用 CpuFeatures 中的 cfSSSE3。
  • 受支持的非 PIC x86-64 Delphi 与 FPC target 现在会为 JSON 数值自动选择 GetNumericVariantSsse3。
  • 纯文本 TSynLogFile 搜索恢复正常,AppendShortByteHex 也能安全接受大于 255 的 PtrUInt 值。

升级建议

请采用当前 head 的 build 2.4.16943,不要停留在 build 2.4.16937–2.4.16941;其中新的每 writer 锁仍包含 Enter 失败与递归计数问题,到 16942 才修复。搜索应用代码中的 cpuSSSE3,并替换为 CpuFeatures 中的 cfSSSE3。重建所有 Delphi/FPC target,然后测试 logger 启动与轮换失败、嵌套 log-writer callback、并发独立 logger、纯文本日志搜索,以及有无 SSSE3 机器上的 JSON 数值解析。

版本号2.4.16922 → 2.4.16943
提交21
行数+9887 -9367
阅读2 分钟

19 条中的 19 条 · 上游 21 次提交

主题
# 条目 类别 单元
1 高 重复的 cpuSSSE3 能力 flag 已移除 mormot.core.base 从公开的 TX64CpuFeatures 枚举中移除 cpuSSSE3。内部代码现改为检查通用 CpuFeatures set 中的 cfSSSE3,paranoid 检测也会在缺少 cfSSE3 时清除 cfSSSE3。 破坏性变更 mormot.core.base+2 5f7b6d39+7-8

core: removed cpuSSSE3 from X64CpuFeatures

影响

直接引用 cpuSSSE3 或假定其存在于 X64CpuFeatures 的 Delphi/FPC 代码将无法编译。通用 CPU 能力调用方应改用 CpuFeatures 中的 cfSSSE3。

需要迁移

搜索 cpuSSSE3 与 X64CpuFeatures;把前者替换为 CpuFeatures 中的 cfSSSE3,然后重建每个 x86-64 target。

公开 API

  • TX64CpuFeatures.cpuSSSE3removed — 请使用通用 CpuFeatures set 中的 cfSSSE3。

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

2 高 日志进入失败不再伪装成成功 TSynLog 的 LogEnter 与 LogEnterFmt 现在会报告 writer 准备是否成功。失败时 Enter/EnterLocal 返回 nil,ManualEnter 记录零递归标记,ManualLeave 消费该标记,_Release 始终配对调用 EndWrite。 修复 mormot.core.log c3462904+72-52

core: fixed TSynLog.Enter* fallback on failure

影响

logger 启动、轮换或嵌套 writer 失败时不再产生虚假的 ISynLog scope 或不匹配的写入递归计数;这是采用此前每 writer 锁 commit 所必需的正确性修复。

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

3 高 日志锁重写恢复 Delphi 编译 mormot.core.log 引入 TSynLogFamilyDynArray,并用于全局 logger-family 数组及其本地快照,解决锁重构后的 Delphi E2008 类型不兼容。 编译器与平台 mormot.core.log f8937aeb+3-2

core: fix Delphi E2008 in SynLogException - Delphi treats each inline 'array of TSynLogFamily' declaration as a distinct type, so 'families := copy(SynLogFamily)' failed to compile. Use a named TSynLogFamilyDynArray for both.

影响

此前的重构状态在受影响 Delphi 版本上无法编译;此 commit 恢复 Delphi build,FPC 行为与运行时日志语义不变。

公开 API

  • TSynLogFamilyDynArrayadded — logger-family 注册表使用的具名动态数组类型。

vennexTSE · 15:43 UTC · 在 GitHub 上查看该提交 →

4 高 每个 TSynLog writer 拥有独立写锁 主要 TSynLog 重写用每个 logger 的 fWriteSafe 替代全局写锁,分离异常锁与 logger 列表锁,通过 thread flag 跟踪活动写入,并引入 BeginWrite、EndWrite、LockAndPrepareWrite helper。 内部重构 mormot.core.log 001b4c2d+9347-9020

core: huge refactoring of TSynLog locking

影响

独立 logger 可并发写入,不再争用进程级单锁,但该重构改变了敏感的初始化、轮换与重入路径;不得部署尚未包含后续 16942 修复的 build。

值得一看

仅与后续 16942 修复一起采用,并在并发下压力测试多个 TSynLog 实例、轮换、异常日志与自定义 writer callback。

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

5 中 纯文本日志搜索恢复正常 当不存在已解析日志 level 时,TSynLogFile.LineContains 现在委托给 TMemoryMapText.LineContains,不再对纯文本文件的每一行都返回 false。 修复 mormot.core.log 638616f1+28-4

core: fixed TSynLogFile.LineContains() on plain text files

影响

TSynLogFileView 的 SearchNext 与 SearchPrevious 可再次在非 SynLog 文件中找到文本;Delphi/FPC 应用的结构化 SynLog 搜索行为不变。

公开 API

  • TSynLogFile.LineContainsbehaviour-changed — 纯文本文件现在使用继承的文本搜索实现。

Sven Harazim · 20:06 UTC · 在 GitHub 上查看该提交 →

6 中 日志耗时从 TSynLog 创建时开始 TSynLog constructor 现在立即初始化高精度起始 timestamp 与 UTC 起始日期;LogFileInit 使用保存的 UTC 值,仅在写 header 时转换为本地时间。 修复 mormot.core.log 71e8dc08+12-13

core: set TSynLog timestamp at startup

影响

即使日志文件初始化延迟,elapsed timestamp 与日志 header 也会使用一致的起点;现有日志调用与 Delphi/FPC 公开 signature 不变。

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

7 中 十六进制追加不再越界索引字符表 mormot.core.base 中的 AppendShortByteHex 现在会像低半字节一样屏蔽高半字节,因此大于 255 的 PtrUInt 值不会再越界读取 HexCharsUpper。 修复 mormot.core.base ae5a3b33+5-4

core: fixed AppendShortByteHex() overflow

影响

传入 byte 范围值的 Delphi 与 FPC 调用方不受影响。传入更宽 PtrUInt 的调用方现在得到低字节的两位十六进制表示,而不会越界读取。

公开 API

  • AppendShortByteHexbehaviour-changed — 超过一字节的值现在会安全取其低字节。

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

8 中 Debug 文件 symbol 查询开放为公开 API TDebugFile 把 FindSymbol、两个 FindBlock overload 与 FindBlockByName 提升为 public,并新增 Lookup(aRva),用于组合地址对应的源文件、行号与 symbol 信息。 新功能 mormot.core.log 5a3e5210+49-22

core: new TDebugFile public methods

影响

Delphi 与 FPC 诊断工具无需继承 TDebugFile 即可直接查询已加载的 debug metadata;现有调用行为不变。

公开 API

  • TDebugFile.FindSymbol / FindBlock / FindBlockByNamebehaviour-changed — 这些现有方法由 protected 提升为 public。
  • TDebugFile.Lookupadded — 返回 RVA 对应的格式化源文件与 symbol 信息。

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

9 中 原始日志文本在获取 writer 锁前完成准备 TSynLog.LogInternalText 现在会在加锁前截断并验证 UTF-8;HasControlChars 为 false 时直接无转义写入,无效 UTF-8 则回退到转义输出。 性能 mormot.core.log 5fc4a796+35-29

core: optimized TSynLog.LogInternalText() process

影响

并发 Delphi/FPC 服务在原始文本场景下占用 logger 写锁的时间更短;有效输出语义保持不变,无效 UTF-8 仍走转义路径。

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

10 中 符合条件的 x86-64 target 默认启用 SSSE3 JSON 数值 parser 在 ASMX64NOTPIC build 检测到 cpuSSSE3 时,GetNumericVariantFromJson 现在会在初始化阶段把 GetNumericVariantStub 指向 GetNumericVariantSsse3;原 FORCE_SSSE3_JSON opt-in 已移除。 性能 mormot.core.text+1 4d78fdfe+7-11

core: enable GetNumericVariantSsse3() by default

影响

公开 signature 与数值结果不变,但受支持的 Delphi Win64 和 FPC x86-64 非 PIC backend 会自动使用 SIMD 路径。其他 CPU 与 PIC build 仍使用 Pascal 实现。

值得一看

请在每个 x86-64 compiler target 上运行代表性的 JSON 数值负载,并保留整数、小数与指数边界测试。

公开 API

  • GetNumericVariantFromJsonbehaviour-changed — 符合条件的 x86-64 build 现在默认分派到 GetNumericVariantSsse3。

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

11 低 UTF-8 buffer 新增直接控制字符检测 mormot.core.unicode 新增公开 helper HasControlChars(P, Len),用于检测 0 到 31 的字节;nil 或空 buffer 返回 false。 新功能 mormot.core.unicode 6f1bd299+21-2

core: new HasControlChars() function

影响

现有应用不受影响;Delphi 与 FPC 代码可复用该 helper 来判断 UTF-8 文本是否需要转义或按行处理。

公开 API

  • HasControlCharsadded — 检查 UTF-8 字节范围内的 ASCII 控制字符。

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

12 低 ShortString 新增格式化 variant 追加 mormot.core.text 新增公开过程 AppendShortVar,通过 TFormatUtf8 格式化 array of const,并在 ShortString 容量范围内追加结果。 新功能 mormot.core.text 7565759e+15-2

core: new AppendShortVar() function

影响

应用代码只有采用该 helper 才会受影响;Delphi 与 FPC 调用方现在可追加异构值,而无需先创建临时 UTF-8 字符串。

公开 API

  • AppendShortVaradded — 把 array of const 值直接格式化到现有 ShortString。

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

13 低 数值边界改用直接的 53 位测试 GetNumericVariantFromJson 的 Pascal 与 x86-64 路径用位移直接检查 unsigned 值是否超过 53 位,替代 MAX_SAFE_JS_INTEGER 比较,并简化 Clinger fast path 条件。 性能 mormot.core.base.asmx64+1 ba4b5c99+11-12

core: minor GetNumericVariantFromJson() optimization

影响

JSON 数值结果与公开 signature 不变;Delphi 和 FPC build 仅在这些解析路径上获得更精简的内部边界检查。

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

14 低 整数 variant 转 Double 不再经过通用 fallback mormot.core.base 的 VariantToDouble 为 varInteger 与 varInt64 增加直接处理,其他类型才回退到通用 Variant 转换机制。 性能 mormot.core.base 25e283ab+8-4

core: optimized VariantToDouble()

影响

常见整数 variant 在 Delphi 与 FPC 上转换开销更低;公开 signature 与预期数值不变。

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

15 低 数值 benchmark 改用稳定的连续输入 BenchmarkNumbers 现在会在单一 buffer 中预生成确定性的零结尾数值 token,分别测量 Pascal 与 SSSE3 parser,并验证解析不会修改源 buffer。 测试 7e251513+123-108

tests: rewritten BenchmarkNumbers process

影响

应用代码不受影响。测试套件能更稳定地比较 parser,并可捕获对只读 JSON 输入的意外写入。

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

16 低 耗时 core 测试可并行运行 core 测试 runner 在 multithread 选项下把更多耗时 TTestCoreBase 组件标记为并行执行,同时仍让 event 测试留在主线程。 测试 c772c201+61-47

tests: parallelize TTestCoreBase for /multithread

影响

运行时与应用代码不受影响;维护者可能看到 multithread 测试更快,而生产 unit 不变。

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

17 低 日志测试覆盖嵌套 writer 创建 TestLogFileInit 适配每 writer 锁,并验证 CreateLogWriter 内部的日志尝试不会递归触发第二次 writer 创建,也不会改变异常状态。 测试 de95ebb6+18-12

tests: fixed TestLogFileInit after huge TSynLog refactoring

影响

应用代码无直接影响;该回归测试可保护自定义 logging-family 实现免受锁重构后的递归初始化问题。

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

18 低 Parser benchmark 交叉校验 Pascal 与 SSSE3 结果 BenchmarkNumbers 扩展 GetExtended 与 GetNumericVariantFromJson 以及它们的 Pascal/SSSE3 实现之间的正确性校验,并生成更一致的计时输出。 测试 63edb4c2+26-3

tests: BenchmarkNumbers check values consistency

影响

应用代码不受影响;测试套件更容易发现 Delphi/FPC 以及 SIMD/非 SIMD 路径间的数值 parser 回归。

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

19 低 日志重写后清理 compiler warning 日志 unit 移除不必要的局部 nil 赋值;测试在调用 overload 前先把字符串 literal 赋给 typed variable,以避免 compiler warning。 杂项 mormot.core.log d4bbc57f+8-6

core: fixed some Delphi compiler warnings

影响

Delphi/FPC 应用代码与运行时不受影响;此变更仅保持更新后的代码与测试无 warning。

Arnaud Bouchez · 19:02 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