立即处理可能影响正在运行的系统原始 payload 包含 4 个 merge commit 与 22 个 non-merge commit;下方覆盖了每个 non-merge commit。它不含 superseded_by 标记,也没有 deprecation notice。三个应避开的区间来自同一嵌入 build 序列中后续明确的修复或完成 commit。
日志启动死锁已修复,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 复用。
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,从而阻塞所有其他线程的第一次日志调用。
建议升级
请把日志部署升级到 build 2.4.16922,并用故意不可写的日志目录测试启动,同时让多个线程写入首条消息。
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。
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。
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。
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。
建议升级
升级到 build 2.4.16916 或更高版本;若 policy 明确,请设置 TNetTlsContext.CipherSuites,并分别验证 TLS 1.2 与 TLS 1.3 handshake。
公开 API
TNetTlsContext.CipherSuitesadded — 以冒号分隔并传给 SSL_CTX_set_ciphersuites 的 TLS 1.3 suite 名称;SChannel 不使用。
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 偏移并把文件加载为零条已解析事件。
建议升级
日志查看器请使用 build 2.4.16914 或更高版本,并在禁用 ZonedTimestamp 且线程标识符较高时重新测试解析。
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 返回路径。
建议升级
请升级通过 mormot.core.interfaces 返回 Currency 的 FPC POSIX 服务,并为每个支持的 CPU ABI 增加精确值回归测试。
公开 API
Currency results through mormot.core.interfacesbehaviour-changed — FPC POSIX x86-64 从 x87 ST0 读取 imvCurrency;其他 target 保持原生约定。
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 协商响应编码。
建议升级
请升级复用 THttpRequestContext 的 HTTP server,并在同一连接上测试先带、后不带 Accept-Encoding 的连续请求。
公开 API
THttpRequestContext.Resetbehaviour-changed — Reset 现在会在请求之间清空 AcceptEncoding。
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 或文本序列化。
建议升级
请升级数值序列化 workload,并在每个 compiler 与 CPU target 上重新运行确定性 DoubleToAscii 与 JSON round-trip 测试。
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。
建议升级
请与 build 2.4.16908 一起采用,并在 64 位 Delphi 与 FPC 上重新运行 QuickJS 和静态压缩分配测试。
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 变化。
建议升级
请把它作为完整 2.4.16922 Linux 关闭序列的一部分采用,不要停在最初的 systemd CPU 修复。
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。其他应用行为不变;后一部分仅修复测试数据生成。
建议升级
请使用 build 2.4.16908 或更高版本,不要停在前一个 allocator wrapper commit。
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 状态,避免它在清理或后续处理时触发异常。
建议升级
若 LDAP 搜索使用 SearchAllAbort 或 range attribute,请升级并重新测试中止后立即复用 client。
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 等待者。
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 要求。
建议升级
请部署完整 build 2.4.16922 序列,并审查所有直接 SynDaemonTerminated 赋值,按文档调用 OsWakeAllOnValue。
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。
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。
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 保持原有路径。
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。
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 才修正。
21
低
数值 benchmark 覆盖更多 token 形态与两个解析 API
TTestCoreBase 把生成输入从普通小数扩展到短 integer、长小数与指数形式,随后计时并交叉检查 GetExtended 与 GetNumericVariantFromJson。assembly 修改仅修正注释。
测试
mormot.core.base.asmx64
3b77a2fe+96-42
tests: enhance performance tests
影响
backend 行为与公开 API 不变。更大的性能测试框架为未来的 parser 选择与优化提供更广的依据。
22
低
科学计数法加入 x86-64 数值回归矩阵
数值测试现在会把 DoubleToString 输出同时传给 GetExtended 与 GetNumericVariantFromJson,并新增带指数的正负一位、两位尾数。
测试
5f5bd051+25-4
tests: enhanced x64 asm numbers coverage
影响
应用行为不变。新增 assertion 防止短科学计数法 assembly 路径在数值与结束指针上回归。