立即处理可能影响正在运行的系统原始 payload 包含 8 个 merge commit 与 51 个 non-merge commit;下方覆盖全部 non-merge commit。它不含 superseded_by 标记,也没有 deprecation notice。两个避开区间来自嵌入 build 序列中明确的后续修复。
POSIX socket 可抵抗 signal,TSynLog 同时更改格式 ABI
这是一次大型跨平台更新。POSIX socket 的等待、accept 与 I/O 现在会在 EINTR 后重试且不延长 deadline;Delphi AArch64 新增 interface dispatch、late-bound variant,并修正时间 cache 对齐。TSynLog 有意把格式化 API 从 PUtf8Char 改为 RawUtf8,并加入锁外预渲染;必须采用最终修复,因为 build 2.4.16999 可能越过 4KB stack buffer。
要点
- 应采用 build 2.4.17002 的 4ef9dc663bbf00ad1920c83a7274e3676610b37f。
- 不要部署 build 2.4.16999:接近 4KB 且带实例前缀的格式化日志可能写出 TSynLog stack buffer。
- 把 TSynLogProc 及格式化 Log、DoLog、Enter、EnterLocal、ManualEnter 的格式参数从 PUtf8Char 迁移到 const RawUtf8。
- POSIX socket I/O、poll、epoll 与 accept 现在会在 EINTR 后重试并保持有限 deadline;请采用完整序列而非中间 build 2.4.16947–2.4.16964。
- Delphi AArch64 在 Android/iOS 获得 DispInvoke 与 interface call 支持,并修复 GlobalTime 锁对齐。
- Delphi POSIX 修复 ordinal resource 启动挂起,以及短/长 resourcestring 解码互换。
升级建议
请采用 build 2.4.17002。不要停留在 build 2.4.16947–2.4.16964,其中 POSIX EINTR、timeout 与异步连接工作多次被补全或修正;2.4.16954 明确引入 timeout 报告回归。绝不要部署 2.4.16999,带实例前缀的格式化 TSynLog 行可能越过 4KB stack buffer;2.4.17000 已修复。把所有格式化日志 callback 与 wrapper 迁移到 RawUtf8,重建每个 Delphi/FPC target,再压力测试 signal 下有限 socket 等待、失败连接、接近 4KB 的日志行、Delphi POSIX 资源与 AArch64 interface call。
51 条中的 51 条 · 上游 59 次提交
1
严重
日志预渲染 buffer 不再溢出
TSynLogFamily.PreRenderFmt 从 4KB 可用容量中扣除实例前缀,Unicode Log overload 也会提供所需 stack buffer。
修复
mormot.core.log
99d189cc+7-4
core: fixed TSynLog latest commits
影响
Build 2.4.16999 对接近 4KB 且带实例前缀的格式化行可能写出 stack buffer;build 2.4.17000 消除该内存破坏风险并恢复 Unicode 编译。
建议升级
不要部署 build 2.4.16999;请采用 2.4.17000 或更高版本,并测试带非 nil Instance 的接近 4KB 格式化行。
2
高
格式化 TSynLog.Enter overload 同样改用 RawUtf8
格式化 Enter、EnterLocal 与 ManualEnter overload 把 PUtf8Char 改为 const RawUtf8,并在获取日志锁前共用 4KB 预渲染路径。
破坏性变更
mormot.core.log
5b05ee28+46-29
core: BREAKING CHANGE TSynLog.Enter Format is RawUtf8
影响
使用 typed PUtf8Char trace wrapper 或匹配 overload variable 的应用将无法编译;普通 RawUtf8 与 literal 调用仍可直接使用。
需要迁移
搜索使用 PUtf8Char 的格式化 Enter、EnterLocal、ManualEnter wrapper,并把格式值改为 RawUtf8。
公开 API
TSynLog.Enter / EnterLocalsignature-changed — 格式化 overload 改为 const RawUtf8。TSynLog.ManualEntersignature-changed — 格式化 overload 改为 const RawUtf8。
3
高
格式化 TSynLog API 改为接收 RawUtf8
TSynLogProc、TSynLog.Log、TSynLog.DoLog 及内部 formatter 把格式参数从 PUtf8Char 改为 const RawUtf8。
破坏性变更
mormot.core.base+1
1bde88e2+13-13
core: BREAKING CHANGE TSynLog Format text is now RawUtf8
影响
字符串 literal 通常仍兼容,但 callback declaration、method variable 与传入 PUtf8Char 的调用不再匹配,必须改用 RawUtf8。
需要迁移
搜索 TSynLogProc 与使用 PUtf8Char 格式参数的日志 callback;改为 const RawUtf8,并转换仅指针调用点。
公开 API
TSynLogProcsignature-changed — Format 参数改为 const RawUtf8。TSynLog.Log / TSynLog.DoLogsignature-changed — 格式化 overload 现在接收 const RawUtf8。
4
高
POSIX stream 与 datagram I/O 统一重试 EINTR
TNetSocketWrap 的 Send、Recv、SendTo 与 RecvFrom 移到平台 include;POSIX 实现重试被中断 syscall,Windows 保持直接 WinSock 调用。
修复
mormot.net.sock+2
7e5228a5+159-87
net: fixed POSIX signals interception for Send/Recv/SendTo/RecvFrom
影响
Linux/BSD 的 TCP 与 UDP socket 流量在 signal 下更少出现伪失败;Windows 行为与公开 signature 不变。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
5
高
各 POSIX 系统的 MSG_NOSIGNAL 常量已修正
mormot.net.sock.posix 修正 Darwin、FreeBSD、NetBSD、DragonFlyBSD、OpenBSD 与 Solaris 的 MSG_NOSIGNAL 值,保留 Linux/Android 值。
修复
mormot.net.sock.posix
e8264e1b+21-23
net: fixed cross-platform MSG_NOSIGNAL definitions
影响
受影响 BSD/Solaris target 的 socket send 现在会请求正确的 no-SIGPIPE 行为,不再传入错误 flag。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
6
高
non-blocking connect 返回真实完成错误
TNetAddr.SocketConnect 用 WaitFor 加 SO_ERROR 取代 50ms 轮询,处理待完成异步连接,并把 GetSocketError 改名为 GetRawSocketError。
修复
mormot.net.sock
04130d2b+15-22
net: fixed TNetAddr.SocketConnect error handling
影响
失败 TCP connect 不再被误判为 writable 成功,异步调用方在连接待完成时得到 nrOk;使用中间方法名的代码必须改名。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
公开 API
TNetSocketWrap.GetSocketErrorrenamed — 改名为 GetRawSocketError。
7
高
socket 等待在 POSIX signal 后保持 deadline
PollNoEintr 包装 poll,在 EINTR 后重试并重新计算剩余 timeout;TNetSocketWrap.WaitFor 不再把 EINTR 当作超时。
修复
mormot.net.sock.posix
989e6d5b+28-4
net: fixed POSIX EINTR for TNetSocketWrap.WaitFor
影响
POSIX client/server 在 signal 中断 poll 时不再提前返回,也不会无限延长有限等待;Windows 不受影响。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
8
高
accept 与 accept4 会从中断中恢复
POSIX doaccept helper 在 EINTR 后重试 accept4/accept,保持 non-blocking descriptor,并仅在 ENOSYS/EOPNOTSUPP 时标记 accept4 不支持。
修复
mormot.net.sock.posix
109cf3c5+19-13
net: fixed accept/accept4 POSIX signals support
影响
signal 传递不再让 POSIX listener loop 报告临时 accept 失败,旧 kernel 仍能正确回退到 accept。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
9
高
BSD socket 常量与原生 header 对齐
POSIX 定义修正 NI_NUMERIC*、poll 写 flag、FreeBSD TCP keepalive、仅 Darwin 的 cellular interface 处理与 ARPOP_InREPLY。
修复
mormot.net.sock.posix
6949ac17+21-11
net: fixed POSIX cross-platform constants for various BSD flavors
影响
FreeBSD、NetBSD、DragonFlyBSD、OpenBSD、Darwin 与 Solaris 网络现在使用正确原生选项号,不再偏向 Linux 值。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
10
高
旧 kernel 可可靠地从 accept4 回退
doaccept 单次保存 errno,遇到致命 accept4 错误退出,遇到 ENOSYS/EOPNOTSUPP 则回退到 accept;POSIX I/O 直接检查 cerrno。
修复
mormot.net.sock.posix
29c8bebb+14-11
net: fixed POSIX accept4 -> accept fallback
影响
无法使用 accept4 的 Linux 系统不再卡在 unsupported 路径或跳过 fallback listener 调用。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
11
高
SocketConnect 仅在等待成功后切换模式
TNetAddr.SocketConnect 在 WaitForWithRawSocketError 期间保持异步,把 nrRetry 映射为 nrTimeout,并仅在同步连接成功后调用 MakeBlocking。
修复
mormot.net.sock
1d878f7f+9-14
net: fixed TNetAddr.SocketConnect
影响
POSIX/Windows 连接完成检查不会过早切到 blocking 模式,从而避免挂起并保持调用方请求的模式。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
12
高
TSynLog 进入失败时保持计时与 scope 一致
TSynLog 在 constructor 中初始化计时,将 MicroSecs 传入 LogEnterFmt,并在 LockAndPrepareEnter 失败时让 EnterLocal 返回 nil。
修复
mormot.core.log
e4c69cc1+12-9
core: some TSynLog.Enter fixes on error
影响
启动或轮换失败不再给调用方留下虚假的成功日志 scope,手动计时指针也会收到正确的进入 timestamp。
建议升级
使用 EnterLocal 或 ManualEnter 包围 logger 初始化的服务应升级,并测试文件创建失败。
13
高
立即完成的 TCP connect 会为同步调用方恢复 blocking 模式
non-blocking connect 立即成功时,TNetAddr.SocketConnect 对 ms >= 0 调用 MakeBlocking,而 ms = -1 仍保持异步。
修复
mormot.net.sock+1
496af189+9-4
net: fixed TNetAddr.SocketConnect immediate connection
影响
同步 Delphi/FPC client 在快速本地连接路径上不再意外收到 non-blocking socket。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
14
高
整数资源名不再导致 Delphi POSIX 启动挂起
Delphi POSIX 上,TExecutableResource.Open 与 ResourceExists 会在 RTL 把 MAKEINTRESOURCE 风格的低于 $10000 指针转成字符串前拒绝它们。
修复
mormot.core.os
a21c2edb+8-0
core: fixed startup hang of Delphi POSIX apps using integer resource names
影响
Delphi Linux、macOS、Android 与 iOS 应用在探测 ordinal resource 时避免启动 GPF/stack-overflow 循环;ordinal resource 仍不受支持。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
15
高
Delphi AArch64 上 GlobalTime 锁已正确对齐
GlobalTime cache record 不再 packed,从而保证 TRWLightLock 的指针对齐;后续 assertion 也允许 compiler 添加 padding。
修复
mormot.core.datetime
b8eaea86+6-1
core: fixed unaligned GlobalTime[] breaking its lock on Delphi aarch64
影响
Delphi AArch64 应用,尤其 iOS,可避免原子锁指令访问奇数地址导致的 access violation;其他 compiler 的 cache 语义不变。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
16
高
socket 等待 timeout 回归已修复
PollNoEintr 在 deadline 到期时恢复 result := 0,TNetSocketWrap.WaitFor 也会在 timeout 后读取旧 revents 前退出。
修复
mormot.net.sock.posix
8187f47f+5-2
net: fixed TNetSocketWrap.WaitFor timeout regression
影响
POSIX 等待再次干净地报告 timeout,不再解释旧 poll 状态;这是此前 EINTR timeout 重构所必需的修复。
建议升级
请使用 build 2.4.16955 或更高版本,绝不要用 2.4.16954,并在 signal 下重跑有限 timeout 网络测试。
17
高
Delphi POSIX resourcestring 使用正确布局
LoadResString 以 ShortLen <> $ffff 判断短布局;$ffff 现在正确选择 Delphi RTL 定义的长 resourcestring record。
修复
mormot.core.os.delphi
2b55dc23+1-1
core: fixed swapped short/long resourcestring layout on Delphi POSIX
影响
Delphi POSIX 应用现在从正确字段加载短、长本地化 resource string,不再返回损坏或互换的文本。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
18
高
Delphi Android 与 iOS 新增静态 AArch64 interface stub
mormot.core.interfaces 链接外部 AArch64 call/fake-VMT stub,通过 X8 传递隐藏的 by-reference 结果,并在 iOS 禁止动态可执行页面时使用静态 thunk。
新功能
mormot.core.interfaces+1
0d9880b7+319-2
interfaces: external aarch64 stubs for the Delphi Android and iOS compilers
影响
基于 interface 的服务与 fake interface dispatch 现在可在 Delphi Android/iOS AArch64 使用,包括签名 iOS 进程;macOS/Windows ARM64 不在此次实现范围。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
19
高
DispInvoke 支持 Delphi AArch64 varargs
mormot.core.variants 新增 AAPCS64 与 Apple AArch64 va_list reader,使 DispInvokeNamed 按各平台 ABI 读取通用、浮点与 by-reference 参数。
新功能
mormot.core.variants+1
ea847060+90-13
variants: implemented DispInvoke late-binding on Delphi aarch64
影响
late-bound variant method call 现在可在 Delphi Android、Linux、iOS 与 macOS AArch64 上工作,不再使用不兼容的 flat-buffer 或 x86-64 布局。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
20
中
远程 LogView 统一所有客户端布局
TRemoteLogNormalizer 将日历、时区、高精度与纯文本行统一为 timestamp/thread/level 布局,并为每个 HTTP 连接分配唯一 thread 编号。
修复
mormot.tools.logview+1
6a02c38a+500-40
tools: LogView remote logging with any client layout - fix #344
影响
使用不同 TSynLog 布局的客户端实时日志现在都可显示和过滤;变更仅限 LogView 及其远程捕获路径。
21
中
socket 可用性显式处理 POSIX signal
TNetSocketWrap.Available 拆分为 POSIX 与 Windows 实现;POSIX MSG_PEEK 在 EINTR 后重试并保留原始 errno。
修复
mormot.net.sock+2
b0bbdf13+94-59
net: fixed TNetSocketWrap.Available on POSIX
影响
连接检查不再把被中断的 POSIX peek 判为 socket 已关闭;Windows 行为保持在其平台实现中。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
22
中
POSIX 下 UDP 收发会在 EINTR 后重试
TNetSocketWrap.SendTo 与 RecvFrom 在 POSIX errno 为 EINTR 时重试 sendto/recvfrom,Windows 行为不变。
修复
mormot.net.sock
389ef677+27-8
net: fixed EINTR on TNetSocketWrap.SendTo/RecvFrom
影响
频繁接收 signal 的 Linux/BSD 服务不再仅因 syscall 被中断而报告临时 UDP 失败;公开 signature 不变。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
23
中
epoll 控制重试 EINTR,并收紧 timeout 循环
EpollCtlNoEIntr 包装 subscribe/unsubscribe 的 epoll_ctl;poll/epoll 重试循环在重新计算的 timeout 到零时停止。
修复
mormot.net.sock.posix
99bc19a1+15-17
net: fixed EINTR in TPollSocketEpoll and poll/epoll timeouts
影响
Linux subscription 可抵抗 signal 中断,但此中间 build 漏掉 timeout 结果重置,下一 commit 才恢复;不要停留在 2.4.16954。
值得一看
24
中
可达性检查改用经过验证的异步连接
GetReachableNetAddr 使用 SocketConnect(-1)、WaitForWithRawSocketError 与 MakeBlocking,关闭失败 socket,并在无候选时停止。
修复
mormot.net.sock
a74fa349+22-10
net: rewritten GetReachableNetAddr() function
影响
地址探测不再把仍有 SO_ERROR 的 writable socket 判为可达,从而改善 Delphi/FPC client 的 endpoint 选择。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
25
中
AArch64 对齐与 Tunnel 清理获得后续修复
GlobalTime assertion 允许 unpack 后的 padding,Delphi POSIX resource 注释更明确,TTunnelLocal.OpenInternal 在异常日志前初始化 thread 并一致报告 socket。
修复
mormot.core.datetime+2
ce3a81b8+11-17
core: some fixes after previous commits
影响
这消除 Delphi AArch64 启动 assertion 风险,并避免 Tunnel 在线程创建前失败时出现未定义诊断值。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
26
中
epoll 等待同样在 EINTR 后保持 timeout
EpollWaitNoEintr 在 EINTR 后重试 epoll_wait,并在 TPollSocketEpoll.WaitForModified 继续前扣除已用时间。
修复
mormot.net.sock.posix
9c8515b0+24-3
net: fixed EINTR support on TPollSocketEpoll.WaitForModified
影响
Linux epoll server 保持请求的 deadline,不再把 signal 中断表现为事件缺失;公开 API 不变。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
27
中
远程 MAC 探测可恢复被中断的 ARP 发送
GetRemoteMacAddress 在 EINTR 后重试原始 ARP sendto,poll/epoll timeout helper 也会显式初始化 deadline。
修复
mormot.net.sock.posix
3af914ac+14-12
net: fixed EINTR support on GetRemoteMacAddress()
影响
Linux 基于 ARP 的 MAC 查询不再因 signal 中断而丢失;其他平台与公开 API 不变。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
28
中
Tunnel 失败保留 socket 上下文
TTunnelLocalThread 在异常中包含原始 accept 错误,TTunnelLocal.OpenInternal 在清理前记录失败 class、message、thread 与 socket。
修复
mormot.net.tunnel
93ac7a4a+13-7
net: enhanced Tunnel error handling
影响
Tunnel 连接失败现在可诊断,且仍会关闭部分创建的 socket;协议行为与公开 signature 不变。
29
中
绝对 XML 查询会有意移动 parser
TXmlParser.GetU 对 nil path 返回 false;相对 path 与 // path 保持位置,但绝对 / path 会 rewind 并停留在结果位置;GetI 继承该行为。
修复
mormot.core.fmt
9dc38579+15-5
core: refined TXmlParser.GetU/GetI process
影响
原本期望 GetU('/...') 或 GetI('/...') 恢复 forward-only parser 位置的代码现在会看到 cursor 改变,应检查调用顺序。
值得一看
搜索使用绝对 path 的 GetU/GetI;若需保留原位置,请显式使用 Save/Restore。
公开 API
TXmlParser.GetU / GetIbehaviour-changed — 绝对 path 现在让 parser 停留在结果位置。
30
中
SIGPIPE 拦截改用 SIG_IGN 并记录成功
SigPipeIntercept 使用 SIG_IGN 取代空 handler,并仅在 fpSigaction 成功后设置进程 flag。
修复
mormot.core.os.posix
ec6e317b+5-5
core: SigPipeIntercept() cleanup
影响
POSIX 进程使用标准 SIGPIPE 抑制方式,并可在 sigaction 失败后重试初始化;公开 API 不变。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
31
中
基于 poll 的 socket 集合忽略 EINTR 且不丢失时间
TPollSocketPoll.WaitForModified 与 WaitForSeveral 现在调用 PollNoEintr,在 signal 中断后保留有限 timeout。
修复
mormot.net.sock.posix
e637b45f+4-4
net: fixed TPollSocketPoll.WaitForModified / WaitForSeveral EINTR support
影响
POSIX poll backend 不再仅因 signal 到达而返回空或失败结果集;应用 API 不变。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
32
中
LogView 以 Lazarus 桌面工具形式回归
新的 mormot.tools.logview LCL 应用可打开、过滤、搜索和分析 TSynLog、SynLZ 与纯文本文件,并支持 DPI 布局和远程行队列。
新功能
mormot.tools.logview
307a9fb7+2162-0
tools: port the mORMot 1 LogView sample as a FPC/Lazarus LCL app
影响
framework backend 不变;FPC/Lazarus 用户获得维护中的查看器,并能在 UI thread 中安全处理实时远程日志。
33
中
OpenSSL 4 按 socket 抑制 SIGPIPE
SSLSetFdNoSigPipe 在 OpenSSL 4+ 使用 BIO_C_SET_SEND_FLAGS 与 NET_MSG_NOSIGNAL,在 OpenSSL 1.1/3.x 回退到进程级 SigPipeIntercept。
新功能
mormot.core.os+2
a413d047+67-20
lib: use new OpenSSL 4+ BIO_C_SET_SEND_FLAGS for MSG_NOSIGNAL
影响
使用 OpenSSL 4 的 POSIX 应用不再修改整个进程的 SIGPIPE 处理;旧版 OpenSSL 仍保持历史行为。
值得一看
34
中
远程日志 callback 可识别发送方
TRestHttpRemoteLogServer 新增 CreateWithSender 与 TRemoteLogReceivedFrom,传递连接 ID 和远程 IP,并在 HTTP server 启动前设置 callback。
新功能
mormot.rest.http.server
e29490aa+30-7
rest: TRestHttpRemoteLogServer.CreateWithSender
影响
现有 Create 调用方保持不变;新的 Delphi/FPC viewer 可区分并发发送方,启动阶段请求也不会再遇到未设置 callback。
公开 API
TRemoteLogReceivedFromadded — 包含连接 ID 与远程 IP 的 callback。TRestHttpRemoteLogServer.CreateWithSenderadded — 创建带发送方识别通知的远程日志 server。
35
中
socket 可公开读取待处理 SO_ERROR
TNetSocketWrap 新增 GetSocketError,查询 SOL_SOCKET/SO_ERROR 并把原始系统值映射为 TNetResult;Delphi POSIX 同时公开 SO_ERROR。
新功能
mormot.core.os.delphi+1
a299fb59+22-2
net: new TNetSocketWrap.GetSocketError method
影响
底层 Delphi/FPC 网络代码可正确检查异步 connect 完成状态,但此中间名称在下一变更中改为 GetRawSocketError。
公开 API
TNetSocketWrap.GetSocketErroradded — 中间名称;随后立即改名为 GetRawSocketError。
36
中
新 helper 结合连接等待与 SO_ERROR
TNetSocketWrap.WaitForWithRawSocketError 等待 write/error 事件后返回 GetRawSocketError;事件集为空时返回 nrRetry。
新功能
mormot.net.sock
07c8080b+16-2
net: new TNetSocketWrap.WaitForWithRawSocketError method
影响
自定义 Delphi/FPC 异步连接代码可复用与 SocketConnect 相同的正确完成检查;现有调用方不受影响。
公开 API
TNetSocketWrap.WaitForWithRawSocketErroradded — 等待 socket 完成并读取 SO_ERROR。
37
中
Accept 可返回原始 socket 错误
TNetSocketWrap.Accept 新增可选 rawError 输出并传给 NetLastError,同时以默认 nil 保持现有三参数调用兼容。
新功能
mormot.core.os.posix+1
e8de6bf7+7-9
net: enhanced TNetSocketWrap.Accept()
影响
server 可记录 accept 失败背后的精确 errno,而不会破坏现有 Delphi/FPC 源码调用。
公开 API
TNetSocketWrap.Acceptsignature-changed — 新增可选 rawError: PNetErrorInt = nil。
38
中
实例文本与格式化日志行一起预计算
TSynLogFamily.PreRenderFmt 现在会在 writer 锁外把实例 class/pointer 前缀写入同一 stack buffer,再格式化消息。
性能
mormot.core.log
a6bb53dc+31-21
core: pre-compute the TSynLog instance pointer text if possible
影响
大量实例的多线程日志进一步缩短锁时间,但此中间实现错误计算剩余 buffer 空间,到 build 2.4.17000 才修复。
值得一看
39
中
格式化日志文本在加锁前完成渲染
TSynLog 在 writer 锁外预渲染最多 4KB 到 stack buffer,清理控制字节,并新增 TSynLogFamily.DirectRendering 以恢复锁内渲染。
性能
mormot.core.log
ab869875+29-4
core: pre-render formatted text up to 4KB on stack outside of the TSynLog lock
影响
多线程服务减少 logger 锁占用时间;object/interface 参数仍走慢路径,DirectRendering 可保留自定义 writer 预期。
值得一看
对高吞吐日志进行 benchmark;若自定义 writer 依赖锁内格式化,请启用 DirectRendering。
公开 API
TSynLogFamily.DirectRenderingadded — 禁用新的 4KB 预渲染快速路径。
40
中
现代 Android 无需 libicudata 即可发现 ICU
Android ICU 检测在缺少 libicudata.so 时回退到 libicuuc.so 与 libicui18n.so,再按需解析带版本或无版本 symbol。
编译器与平台
mormot.core.os.posix
36796d3c+11-1
core: enhanced ICU detection on modern Android
影响
ICU 数据位于 APEX 的现代 Android 版本可重新向 Delphi/FPC 应用提供 Unicode 转换;其他 POSIX target 不变。
建议升级
升级到 build 2.4.17002,并在部署前于每个受影响的 Delphi/FPC target 上测试此修复路径。
41
中
远程日志统一使用可移植 socket server
TRestHttpRemoteLogServer 在所有平台改用 useHttpSocket,不再依赖 HTTP_DEFAULT_MODE,从而避开 Windows http.sys URI 注册与权限相关 fallback。
编译器与平台
mormot.rest.http.server
4f487ad9+5-5
rest: TRestHttpRemoteLogServer now uses useHttpSocket on all systems
影响
Windows 远程日志部署不再因管理员权限不同而改变 server backend;socket server 足以处理预期的少量 client。
值得一看
42
低
accept 失败包含操作系统错误
异步与 thread HTTP server 的 accept loop 获取原始 errno 并在 debug 日志加入 SystemErrorShort;仅在成功后检查 banned address。
修复
mormot.net.async+1
d59aeb92+16-11
net: enhanced accept() logged error content
影响
运维人员获得可操作的 accept 诊断,公开行为不变;失败 accept 不再把未初始化 peer address 传给 ban 检查。
43
低
LogView 保持关键列可见并记住字体大小
LogView 防止点击文本列隐藏时间、level 与 thread 列,并通过键盘、滚轮与菜单提供持久化内容字体大小。
新功能
mormot.tools.logview
1c454fb6+148-12
tools: LogView keeps the first columns visible and has a custom font size
影响
仅 Lazarus LogView UI 变化;backend 日志与文件格式不受影响。
44
低
控制字符可原地替换
mormot.core.unicode 新增 TrimControlCharsBuffer,直接在传入 UTF-8 buffer 中把 #0 到 #31 字节替换为空格。
新功能
mormot.core.unicode
bcf4e877+22-2
core: new TrimControlCharsBuffer() function
影响
现有代码不变;Delphi/FPC 调用方获得无分配 helper,并用于新的 TSynLog 预渲染路径。
公开 API
TrimControlCharsBufferadded — 原地把 ASCII 控制字节替换为空格。
45
低
短位置查询可省略十六进制 fallback
TDebugFile.FindLocationShort 新增 aNoHex;否则使用 PointerToHexShortVar;同时修正近期日志代码注释与赋值说明。
新功能
mormot.core.log
add4ed16+13-9
core: some logging fixes and TSynLogFile enhancement
影响
诊断调用方可在找不到 debug symbol 时请求空结果,而不是只得到地址;现有双参数调用仍保留十六进制 fallback。
公开 API
TDebugFile.FindLocationShortsignature-changed — 新增可选 aNoHex: boolean = false。
46
低
指针文本可写入任意 ShortString
mormot.core.text 新增 PointerToHexShortVar,PointerToHexShort 委托给它完成指针宽度十六进制转换。
新功能
mormot.core.text
cd8db464+15-6
core: new PointerToHexShortVar() function
影响
现有调用方不变;无分配诊断代码现在可直接填充现有 ShortString 变量。
公开 API
PointerToHexShortVaradded — 把指针值写入调用方提供的 ShortString。
47
低
可扫描格式参数是否需要对象渲染
mormot.core.text 新增 VarRecHasObject,用于检测需要 TTextWriter.WriteObject 的 vtObject 或 vtInterface 值。
新功能
mormot.core.text
906a763f+18-2
core: new VarRecHasObject() function
影响
该 helper 支持后续日志优化,不改变现有应用行为;同一批次稍后改名为 VarRecNeedsWriteObject。
48
低
平台 MSG_NOSIGNAL 值成为公开变量
mormot.net.sock 用平台常量初始化公开变量 NET_MSG_NOSIGNAL,供上层 socket 与 TLS 代码复用。
新功能
mormot.net.sock
eabe6fba+7-2
net: new NET_MSG_NOSIGNAL global cross-platform constant
影响
现有应用不受影响;底层集成可读取有效 flag,无需重复平台条件编译。
公开 API
NET_MSG_NOSIGNALadded — 平台 MSG_NOSIGNAL 值的 runtime 副本。
49
低
有界 UTF-8 格式化在填满后停止解析
TFormatUtf8.InitParse 接收 MaxSize,并在达到限制后停止收集格式块;FormatBufferRaw 与 FormatShort 传入真实容量。
性能
mormot.core.text
7a04bb59+14-10
core: optimized TFormatUtf8.InitParse when a maximum size is involved
影响
截断格式化不再转换后续无用参数,在保持相同有界输出的同时减少工作量。
50
低
对象格式检测获得最终名称
VarRecHasObject 改名为 VarRecNeedsWriteObject,并使用 byte-safe VType 检查;TXmlParser 注释说明绝对 path 的 cursor 行为。
内部重构
mormot.core.fmt+1
697af472+10-7
core: some renaming/comment with no functional change
影响
仅使用前一中间 helper 名称的代码需要改名;更早的现有应用无需迁移。
公开 API
VarRecHasObjectrenamed — 最终名称为 VarRecNeedsWriteObject。
51
低
AArch64 后续仅调整样式与 inline
该 commit 修正缩进,把 AAPCS64 va_list helper 标记为 inline,并更新 Delphi 13.1 平台支持 changelog。
杂项
mormot.core.interfaces+1
dfac0653+7-7
core: minor change after previous PR
影响
应用无功能影响;Delphi/FPC 行为与公开 API 保持不变。