立即处理可能影响正在运行的系统原始 payload 包含 2 个 merge commit 与 19 个 non-merge commit;下方覆盖了每个 non-merge commit。它不含 superseded_by 标记,也没有 deprecation notice。应避开的区间直接依据该嵌入序列中稍后的 build 16942 修复。
每个 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 数值解析。
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。
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 所必需的正确性修复。
建议升级
请采用 build 2.4.16942 或更高版本,并在生产部署前测试文件创建失败、轮换与自定义 CreateLogWriter callback。
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 行为与运行时日志语义不变。
建议升级
不要在缺少此兼容性修复时采用锁重写;请重建所有受支持的 Delphi 版本。
公开 API
TSynLogFamilyDynArrayadded — logger-family 注册表使用的具名动态数组类型。
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。
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 搜索行为不变。
建议升级
请升级会打开任意文本文件的日志查看器部署,并用纯文本 fixture 验证向前与向后搜索。
公开 API
TSynLogFile.LineContainsbehaviour-changed — 纯文本文件现在使用继承的文本搜索实现。
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 不变。
建议升级
若使用日志 elapsed time 进行启动诊断,请升级,并验证 header 时区与首条记录时长。
7
中
十六进制追加不再越界索引字符表
mormot.core.base 中的 AppendShortByteHex 现在会像低半字节一样屏蔽高半字节,因此大于 255 的 PtrUInt 值不会再越界读取 HexCharsUpper。
修复
mormot.core.base
ae5a3b33+5-4
core: fixed AppendShortByteHex() overflow
影响
传入 byte 范围值的 Delphi 与 FPC 调用方不受影响。传入更宽 PtrUInt 的调用方现在得到低字节的两位十六进制表示,而不会越界读取。
建议升级
若 AppendShortByteHex 可能接收未屏蔽且超过一字节的标识符或 offset,请升级并增加大于 255 的回归用例。
公开 API
AppendShortByteHexbehaviour-changed — 超过一字节的值现在会安全取其低字节。
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 信息。
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 仍走转义路径。
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。
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 控制字符。
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。
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 仅在这些解析路径上获得更精简的内部边界检查。
14
低
整数 variant 转 Double 不再经过通用 fallback
mormot.core.base 的 VariantToDouble 为 varInteger 与 varInt64 增加直接处理,其他类型才回退到通用 Variant 转换机制。
性能
mormot.core.base
25e283ab+8-4
core: optimized VariantToDouble()
影响
常见整数 variant 在 Delphi 与 FPC 上转换开销更低;公开 signature 与预期数值不变。
15
低
数值 benchmark 改用稳定的连续输入
BenchmarkNumbers 现在会在单一 buffer 中预生成确定性的零结尾数值 token,分别测量 Pascal 与 SSSE3 parser,并验证解析不会修改源 buffer。
测试
7e251513+123-108
tests: rewritten BenchmarkNumbers process
影响
应用代码不受影响。测试套件能更稳定地比较 parser,并可捕获对只读 JSON 输入的意外写入。
16
低
耗时 core 测试可并行运行
core 测试 runner 在 multithread 选项下把更多耗时 TTestCoreBase 组件标记为并行执行,同时仍让 event 测试留在主线程。
测试
c772c201+61-47
tests: parallelize TTestCoreBase for /multithread
影响
运行时与应用代码不受影响;维护者可能看到 multithread 测试更快,而生产 unit 不变。
17
低
日志测试覆盖嵌套 writer 创建
TestLogFileInit 适配每 writer 锁,并验证 CreateLogWriter 内部的日志尝试不会递归触发第二次 writer 创建,也不会改变异常状态。
测试
de95ebb6+18-12
tests: fixed TestLogFileInit after huge TSynLog refactoring
影响
应用代码无直接影响;该回归测试可保护自定义 logging-family 实现免受锁重构后的递归初始化问题。
18
低
Parser benchmark 交叉校验 Pascal 与 SSSE3 结果
BenchmarkNumbers 扩展 GetExtended 与 GetNumericVariantFromJson 以及它们的 Pascal/SSSE3 实现之间的正确性校验,并生成更一致的计时输出。
测试
63edb4c2+26-3
tests: BenchmarkNumbers check values consistency
影响
应用代码不受影响;测试套件更容易发现 Delphi/FPC 以及 SIMD/非 SIMD 路径间的数值 parser 回归。
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。