mORMot2 Daily每日上游提交速读

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。

版本号2.4.16943 → 2.4.17002
提交59
行数+7434 -629
阅读4 分钟

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 编译。

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

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。

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

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。

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

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 不变。

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

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。

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

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;使用中间方法名的代码必须改名。

公开 API

  • TNetSocketWrap.GetSocketErrorrenamed — 改名为 GetRawSocketError。

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

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 不受影响。

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

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。

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

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 值。

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

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 调用。

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

11 高 SocketConnect 仅在等待成功后切换模式 TNetAddr.SocketConnect 在 WaitForWithRawSocketError 期间保持异步,把 nrRetry 映射为 nrTimeout,并仅在同步连接成功后调用 MakeBlocking。 修复 mormot.net.sock 1d878f7f+9-14

net: fixed TNetAddr.SocketConnect

影响

POSIX/Windows 连接完成检查不会过早切到 blocking 模式,从而避免挂起并保持调用方请求的模式。

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

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。

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

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。

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

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 仍不受支持。

Stefan Diestelmann · 08:30 UTC · 在 GitHub 上查看该提交 →

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 语义不变。

Stefan Diestelmann · 08:34 UTC · 在 GitHub 上查看该提交 →

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 重构所必需的修复。

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

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,不再返回损坏或互换的文本。

Stefan Diestelmann · 08:31 UTC · 在 GitHub 上查看该提交 →

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 不在此次实现范围。

Stefan Diestelmann · 08:42 UTC · 在 GitHub 上查看该提交 →

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 布局。

Stefan Diestelmann · 08:36 UTC · 在 GitHub 上查看该提交 →

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 及其远程捕获路径。

Sven Harazim · 16:38 UTC · PR #344 · 在 GitHub 上查看该提交 →

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 行为保持在其平台实现中。

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

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 不变。

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

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。

值得一看

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

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 选择。

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

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 在线程创建前失败时出现未定义诊断值。

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

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 不变。

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

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 不变。

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

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 不变。

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

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 停留在结果位置。

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

30 中 SIGPIPE 拦截改用 SIG_IGN 并记录成功 SigPipeIntercept 使用 SIG_IGN 取代空 handler,并仅在 fpSigaction 成功后设置进程 flag。 修复 mormot.core.os.posix ec6e317b+5-5

core: SigPipeIntercept() cleanup

影响

POSIX 进程使用标准 SIGPIPE 抑制方式,并可在 sigaction 失败后重试初始化;公开 API 不变。

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

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 不变。

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

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 中安全处理实时远程日志。

Sven Harazim · 15:54 UTC · 在 GitHub 上查看该提交 →

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 仍保持历史行为。

值得一看

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

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。

Sven Harazim · 16:38 UTC · 在 GitHub 上查看该提交 →

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。

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

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。

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

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。

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

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 才修复。

值得一看

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

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 预渲染快速路径。

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

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 不变。

Stefan Diestelmann · 08:34 UTC · 在 GitHub 上查看该提交 →

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。

值得一看

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

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 检查。

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

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 日志与文件格式不受影响。

Sven Harazim · 19:40 UTC · 在 GitHub 上查看该提交 →

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 控制字节替换为空格。

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

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。

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

46 低 指针文本可写入任意 ShortString mormot.core.text 新增 PointerToHexShortVar,PointerToHexShort 委托给它完成指针宽度十六进制转换。 新功能 mormot.core.text cd8db464+15-6

core: new PointerToHexShortVar() function

影响

现有调用方不变;无分配诊断代码现在可直接填充现有 ShortString 变量。

公开 API

  • PointerToHexShortVaradded — 把指针值写入调用方提供的 ShortString。

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

47 低 可扫描格式参数是否需要对象渲染 mormot.core.text 新增 VarRecHasObject,用于检测需要 TTextWriter.WriteObject 的 vtObject 或 vtInterface 值。 新功能 mormot.core.text 906a763f+18-2

core: new VarRecHasObject() function

影响

该 helper 支持后续日志优化,不改变现有应用行为;同一批次稍后改名为 VarRecNeedsWriteObject。

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

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 副本。

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

49 低 有界 UTF-8 格式化在填满后停止解析 TFormatUtf8.InitParse 接收 MaxSize,并在达到限制后停止收集格式块;FormatBufferRaw 与 FormatShort 传入真实容量。 性能 mormot.core.text 7a04bb59+14-10

core: optimized TFormatUtf8.InitParse when a maximum size is involved

影响

截断格式化不再转换后续无用参数,在保持相同有界输出的同时减少工作量。

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

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。

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

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 保持不变。

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