mORMot2 Daily每日上游提交速读

FPC ARM 原子操作恢复内存顺序,HTTP.sys WebSocket 完成重构

本期修复了 FPC ARM 与 AArch64 上 mORMot 锁缺失内存屏障的问题;此前即使锁字互斥,受保护数据仍可能发生竞态。Windows 的 HTTP.sys 请求与 WebSocket 处理被大幅重构,并连续修复连接生命周期、overlapped I/O、发送、关闭与 ping 路径。直接使用低层 HTTP.sys wrapper 或 THttpApiWebSocketServerProtocol 连接索引的代码需要迁移。

要点

  • FPC ARM 与 AArch64 锁操作现在提供完整内存屏障;旧实现可能丢失更新或破坏共享状态。
  • HTTP.sys 请求引擎现在正确处理无限制的 chunked body,会断开留下未读 body 的失败连接,并隔离每个请求的状态。
  • HTTP.sys WebSocket 连接管理改用 TLockedList ID、独立的接收/唤醒 overlapped 记录和受保护的关闭流程。
  • THttpServerRequest.FullUrl 现为 RawUtf8,HttpApiRequest 已移除,多项低层 HTTP.sys 签名也已改变。
  • optCleanMagicJson 可从 SOA 响应移除 JSON_BASE64_MAGIC;新增 SetErrorText、HtmlEscapeShortVar 与 TLockedList.Find。
  • 请落到 build 2.4.17497,不要停留在 HTTP.sys 过渡版本 2.4.17464–2.4.17496。

升级建议

请采用最终 build 2.4.17497。FPC ARM/ARM64 部署应升级以获得内存顺序修复,并压力测试锁、线程池与定时器。Windows HTTP.sys/WebSocket 部署应避开 2.4.17464–2.4.17496,迁移已变化的公共符号,再测试 chunked 上传、upgrade、并发 send/close、客户端断开、关闭与 ping 超时。

版本号2.4.17462 → 2.4.17497
提交35
行数+3088 -2371
阅读2 分钟

32 条中的 32 条 · 上游 35 次提交

主题
# 条目 类别 单元
1 严重 ARM 原子 wrapper 集中实现内存屏障修复 后续提交为 FPC weak-atomic 目标定义带屏障的 InterlockedIncrement/InterlockedDecrement wrapper,加入 AArch64 汇编入口,并让锁、异步连接与 ECC 引用计数使用这些原语。 修复 mormot.core.base+4 c1a131a8+158-133

core: huge refactoring on arm32/64 about atomic operations

影响

这是 FPC ARM32/ARM64 内存顺序的稳定实现,可保护锁字之外的并发状态,尤其影响线程池、定时器与引用计数任务。

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

2 严重 FPC 非 Intel 锁成为完整内存屏障 FPC_WEAKATOMICS 标记非 Intel 目标,AArch64 LDXR/STLXR 路径加入 DMB 顺序,其他 FPC CPU 则在 TLightLock、TRWLightLock、TRWLock、TMultiLightLock 与 TOSLightLock 的 RTL 原子操作周围加屏障。 修复 mormot.core.base+2 b2b195da+190-8

core: Locked*() are now full memory barriers on FPC non-Intel CPUs

影响

在 FPC ARM/AArch64 上,锁字互斥此前不会排序受保护内存;提交记录了计数丢失、TSynThreadPool context 丢失与 TSynBackgroundTimer heap 损坏。

zen010101 · 11:55 UTC · 在 GitHub 上查看该提交 →

3 严重 不安全的 WebSocket 连接 class 重写已撤销 该提交完整撤销前一个基于 class 的连接列表重写,因为传给 IOCP 的结构必须以 TOverlapped 开头。 修复 mormot.net.server 1ff6986c+120-69

revert "net: rewritten http.sys WS connections list"

影响

这移除了可能让 completion callback 把对象元数据当作 TOverlapped 的无效 Windows 运行时布局;之后 record 与 TLockedList 工作取代了它。

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

4 严重 基于 class 的 WebSocket 连接列表引入无效 IOCP 布局 该提交暂时把 THttpApiWebSocketConnection 从以 TOverlapped 开头的 record/object 改为 class,并重组协议连接数组;下一非 merge 提交完整撤销。 内部重构 mormot.net.server 91f43c69+69-120

net: rewritten http.sys WS connections list

影响

此版本不可部署:IOCP 要求 TOverlapped 位于零偏移,而 class 实例不满足;撤销后无持续 API 影响。

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

5 高 HTTP.sys WebSocket 连接从索引迁移到稳定 ID THttpApiWebSocketServerProtocol 改用 TLockedList 存储连接,为每个 THttpApiWebSocketConnection 提供 ID,并让 Send/Close 接收 THttpApiWebSocketConnectionID;独立读/唤醒 overlapped 记录协调 IOCP 生命周期与关闭。 破坏性变更 mormot.net.server 8bcdf7e7+281-196

net: http.sys WebSockets server now uses TLockList

影响

保存数组索引或以 integer 调用 protocol Send/Close 的代码必须改为保存 Conn.ID 并传稳定 ID;运行时获得抗 ABA 回收与更安全的并发关闭。

需要迁移

搜索 THttpApiWebSocketServerProtocol.Send/Close 与保存的连接索引,改为在 callback 中记录 THttpApiWebSocketConnection.ID。

公开 API

  • THttpApiWebSocketConnectionIDadded
  • THttpApiWebSocketConnection.IDadded
  • THttpApiWebSocketServerProtocol.Sendsignature-changed
  • THttpApiWebSocketServerProtocol.Closesignature-changed

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

6 高 每请求 WebSocket 状态取代共享最后连接 THttpApiWebSocketServer 把待处理连接存到 THttpApiServerRequest 而非 fLastConnection,使并发 upgrade 隔离到请求;THttpServerRequest.FullUrl 改为 virtual RawUtf8,公共 HttpApiRequest 被移除。 破坏性变更 mormot.lib.winhttp+1 c852c8cf+92-103

net: several fixed to THttpApiWebSocketServer

影响

已移除明确不具线程安全性的共享状态。把 FullUrl 当作 SynUnicode 的代码须改用 RawUtf8;读取 HttpApiRequest 的代码须改用受支持字段或内部 Windows 扩展。

需要迁移

搜索 FullUrl 声明/赋值与 HttpApiRequest 引用,编译前迁移并测试并发 upgrade。

公开 API

  • THttpServerRequest.FullUrlsignature-changed
  • THttpServerRequest.GetFullUrlsignature-changed
  • THttpServerRequest.HttpApiRequestremoved

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

7 高 低层 HTTP.sys helper 改变输出契约 HTTP_RESPONSE.SetStatus 现在返回 PRawUtf8 而非填充 var RawUtf8;RetrieveHeadersAndGetRemoteIPConnectionID 改为带 var Headers 的 procedure;新增 LookupTokenVar 与 VERB_TEXT。 破坏性变更 mormot.core.os.security+1 9c149153+41-16

lib: some http.sys API wrapper refinements

影响

直接使用这些 Windows 低层 wrapper 的代码在更新返回值与输出参数前会编译失败;典型高层 THttpServer 用户不受影响。

需要迁移

搜索 SetStatus 与 RetrieveHeadersAndGetRemoteIPConnectionID 调用,移除临时 status 字符串并传入 Headers 变量。

公开 API

  • HTTP_RESPONSE.SetStatussignature-changed
  • RetrieveHeadersAndGetRemoteIPConnectionIDsignature-changed
  • LookupTokenVaradded
  • VERB_TEXTadded

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

8 高 失败的 WebSocket upgrade 与接收现在可安全清理 服务器会完成失败 upgrade 的清理,在停止时拒绝新 upgrade,校验完整写入,每连接只允许一个 pending receive,以零字节完成失败接收,并等待 I/O 清空后再回收。 修复 mormot.net.server 97ab4cc4+64-24

net: some THttpApiWebSocketServer fixes

影响

Windows HTTP.sys WebSocket 的错误与关闭路径不再在 completion 可能到达时回收记录;未新增源码迁移。

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

9 高 websocket.dll completion 按 void 操作处理 WebSocketApi.CompleteAction 从返回 HRESULT 的函数修正为 procedure,移除结果检查,并仅在 HTTP 101 切换协议响应后开始接收。 修复 mormot.lib.winhttp+1 6f0344bf+19-45

net: fixed WebSocketApi.CompleteAction usage

影响

Windows 声明现在与 websocket.dll 一致,不再读取不存在的返回值;upgrade 顺序也避免在 HTTP 握手完成前读取。

公开 API

  • WebSocketApi.CompleteActionsignature-changed

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

10 高 HTTP.sys 响应状态与 Range 失败路径得到强化 服务器在提交前标记响应,静态文件打开失败后立即退出,Range 起点越界时返回 416,捕获 OnBeforeBody 异常并一致清理响应状态。 修复 mormot.net.server 3b4da68d+34-23

net: some THttpApiServer fixes and cleanup

影响

Windows HTTP.sys 应用避免在失败后继续或重复响应,并为无效 byte range 返回正确状态。

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

11 高 并发 WebSocket send 与 close 现已串行化 THttpApiWebSocketServerProtocol 现在在连接 Close/Send 周围加锁,pending-close 数组删除也改为传计数指针而非数组指针。 修复 mormot.net.server 3383af99+28-18

net: some THttpApiWebSocketServerProtocol fixes

影响

Windows WebSocket 后端避免应用线程与协议维护间竞态,也避免因更新错误 pending 计数而导致的内存破坏。

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

12 高 WebSocket 发送声明与实现保持一致 遗漏的 mormot.net.server 声明更新让 WriteData 返回成功状态与写入数,移除旧的共享 overlapped 发送,并同步发送 response entity body。 修复 mormot.net.server c9bcf0ea+16-24

net: missing file in previous commit

影响

前一提交缺少此 unit,可能无法编译或保留不一致发送行为;公共应用 API 不变。

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

13 高 HTTP.sys 会关闭仍有未读请求 body 的连接 SendError 现在可加入 Connection: close 与 HTTP_SEND_RESPONSE_FLAG_DISCONNECT;超大 body、bot 拒绝、OnBeforeBody 中止及 body 读取错误都走此路径。 修复 mormot.net.server 6a2970d5+21-9

net: properly disconnect http.sys client when needed

影响

服务器不再复用请求 body 未完全消费的 HTTP.sys 连接,避免下一请求继承污染的流状态。

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

14 高 ping 失败不再终止 WebSocket guard THttpApiWebSocketConnection.CheckIsActive 现在忽略非活动状态,在再次 ping 前关闭超时 peer,并捕获 Ping 异常,仅关闭受影响连接。 修复 mormot.net.server 21b62bc8+18-9

net: fixed http.sys ping process

影响

Windows HTTP.sys WebSocket 服务在 ping 失败时会保留 guard 线程,也不会 ping 已在关闭的连接。Delphi/FPC 应用 API 不变。

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

15 高 HTTP.sys body 接收现在符合 Windows API 契约 ReceiveRequestEntityBody 的 pBytesReceived 从 var cardinal 改为 PCardinal;同步请求传 @bytesread,overlapped WebSocket 读取传 nil,写入错误会清零字节数。 修复 mormot.lib.winhttp+1 e795d965+14-13

net: fixed http.sys API incorrect usage

影响

wrapper 现在支持 overlapped I/O 所需的空输出指针。直接调用函数指针字段时必须传地址或 nil;同一提交暂时反转了发送判断,下一提交已修复。

需要迁移

把直接 ReceiveRequestEntityBody 调用改为传 @count 或 nil,并落到 2.4.17497,而非此中间版本。

公开 API

  • THttpApiFunction.ReceiveRequestEntityBodysignature-changed

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

16 高 WebSocket 写入与对端关闭回应走入正确路径 WriteData 仅在 HTTP.sys entity-body 完整写入时成功,发送循环以正确条件判断失败,客户端 close frame 会收到对应的服务端 close 回应。 修复 mormot.net.server 072bba0e+11-11

net: THttpApiWebSocketConnection fixes

影响

这修复了 WebSocket 重构期间引入的问题:此前 build 可能中止成功发送或错误处理 Windows 上的关闭握手。

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

17 高 WebSocket 网络发送报告实际写入字节数 WEB_SOCKET_SEND_TO_NETWORK_ACTION 现在逐个写入 websocket.dll buffer,累计实际字节数传给 CompleteAction,并在 HTTP.sys body 写入失败时断开。 修复 mormot.net.server 4730c107+9-6

net: fixed WEB_SOCKET_SEND_TO_NETWORK_ACTION with http.sys

影响

Windows HTTP.sys WebSocket 发送不再在实际写入较少时声称完整长度,从而改善失败检测与协议状态。

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

18 高 无限制 chunked HTTP.sys body 不再收到 413 长度检查仅在 MaximumAllowedContentLength 大于零时生效,因此零对 chunked body 继续表示无限制。 修复 mormot.net.server 7b05e490+4-3

net: fixed #642 THttpApiServer chunked body gets 413

影响

使用默认无限制配置的 Windows HTTP.sys endpoint 会接受 chunked 上传,而非返回 HTTP 413。

Arnaud Bouchez · 08:24 UTC · PR #642 · 在 GitHub 上查看该提交 →

19 高 HTTP.sys 请求处理改为每请求对象 单体 THttpApiServer.DoExecute 被拆成私有 THttpApiServerRequest,封装请求、响应、buffer、日志和 send/error 方法;仍按线程复用,但响应与异常状态更明确。 内部重构 mormot.net.http+1 5adc88f8+507-518

net: huge THttpApiServer refactoring/rewrite

影响

Windows HTTP.sys 后端获得更清晰的请求隔离与错误处理,但这是多提交重构起点,不应单独采用。

值得一看

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

20 高 WebSocket 连接记录保持 overlapped 位于零偏移 连接恢复为 record/object 存储并把 TOverlapped 放在首字段,同时围绕指针重组分配、查找与 pending-close 数组。 内部重构 mormot.net.server 22a41512+61-94

net: some THttpApiWebSocketConnection refactoring

影响

这在撤销 class 尝试后恢复了 IOCP callback 所需布局,但仍是随后被 TLockedList 替代的中间架构。

值得一看

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

21 中 损坏的压缩 HTTP 内容不再抛出异常 THttpSocketCompressList.UncompressContent 用 try/except 包裹解压器;codec 抛异常时清空结果并返回 nil。 修复 mormot.net.http f1ec718b+11-7

net: hardened THttpSocketCompressList.UncompressContent

影响

损坏的 gzip/deflate 输入会成为普通解压失败,不再把异常传播到 Delphi/FPC HTTP 请求路径;调用方应处理 nil。

公开 API

  • THttpSocketCompressList.UncompressContentbehaviour-changed

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

22 中 锁定列表可解析抗 ABA 的序列标识符 公共 TLockedListID 为 sequence 字段提供类型,TLockedList.Find 在列表锁下搜索非零 ID;32 位 FPC 的 LockedInc64 进位路径也使用 LockedInc32 以获得屏障。 新功能 mormot.core.base+1 4824b5db+32-8

core: new TLockedList.Find method

影响

基础设施可查找回收列表记录而不依赖不稳定指针;现有 Delphi/FPC 调用方仅在采用新 helper 时受影响。

值得一看

公开 API

  • TLockedListIDadded
  • TLockedList.Findadded

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

23 中 SOA 方法可返回不含 binary magic 前缀的 JSON TInterfaceMethodOption 新增 optCleanMagicJson;设置该选项时,TInterfaceFactoryServer.ExecuteJson 会对响应调用 RemoveMagicFromJson。 新功能 mormot.core.interfaces+1 2ff79bbd+6-2

soa: new optCleanMagicJson option for #402

影响

选定接口方法可输出不含内部 JSON_BASE64_MAGIC 前缀的 JSON 字符串;现有服务除非显式启用,否则行为不变。

值得一看

公开 API

  • TInterfaceMethodOption.optCleanMagicJsonadded

Arnaud Bouchez · 06:43 UTC · PR #402 · 在 GitHub 上查看该提交 →

24 中 JSON magic 移除重写为更快的 copy-on-write 扫描 RemoveMagicFromJson 先扫描字符串边界并检测 JSON_BASE64_MAGIC 前缀,仅在确需移除标记时分配可写副本。 性能 mormot.core.json 367cdf5a+46-43

core: rewritten RemoveMagicFromJson()

影响

SOA 与直接调用者保持相同公共 procedure,但普通 JSON 不再复制;行为仍只针对 magic 前缀 JSON 字符串。

值得一看

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

25 低 系统错误文本可直接写入 RawUtf8 公共 SetErrorText procedure 从 OS 错误码填充现有 RawUtf8,默认使用当前错误;GetErrorText 委托给它,HTTP 代码也复用该 helper。 新功能 mormot.core.os+2 f47c802c+263-237

core: new SetErrorText() function

影响

调用方可复用目标字符串并避免结果临时值;现有 GetErrorText 代码在 Delphi/FPC 下保持兼容。

公开 API

  • SetErrorTextadded

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

26 低 HTML 转义可填充调用方持有的 short string 公共 HtmlEscapeShortVar procedure 按指定格式把转义后的 RawUtf8 写入 ShortString;HtmlEscapeShort 现委托给它。 新功能 mormot.core.fmt 5ec9601b+14-4

core: new HtmlEscapeShortVar() wrapper function

影响

已有目标变量的 Delphi/FPC 调用方可避免函数结果临时值;现有调用保持兼容。

公开 API

  • HtmlEscapeShortVaradded

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

27 低 异步网络进行无功能变化清理 mormot.net.async 进行格式化与简化,不改变执行分支或公共声明。 内部重构 mormot.net.async 29b15f39+17-17

net: some code cleanup with no functional change

影响

预计不会影响 Delphi/FPC 应用代码。

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

28 低 重写后的 HTTP.sys 请求对象完成清理 后续提交简化并格式化大规模重构后的 THttpApiServerRequest 实现,不改变预期行为。 内部重构 mormot.net.server 6dfbaf34+13-17

net: THttpApiServer cleanup after previous commit

影响

diff 中未见应用代码影响;这是 Windows HTTP.sys 实现内部维护。

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

29 低 示例记录 interface 与 implementation 目录结构 SAD、README 与项目指南说明 app/<entity>/interface 和 app/<entity>/implementation 的拆分、依赖方向及 local-mode 例外。 文档 recommended-patterns documentation 76e144c0+147-119

Document the app/<entity>/interface|implementation layout

影响

mORMot 运行时行为不变;采用该示例的团队获得更清晰架构指导。

joaopauloschuler · 22:52 UTC · 在 GitHub 上查看该提交 →

30 低 CQRS 布局文档纳入评审修正 架构与开发文档在评审后澄清 interface/implementation 依赖,并调整示例服务引用。 文档 recommended-patterns documentation 4ecaf74e+16-15

Address review notes on the interface/implementation docs

影响

无运行时或公共框架 API 影响;该提交仅改进 recommended-patterns 说明。

joaopauloschuler · 22:58 UTC · 在 GitHub 上查看该提交 →

31 低 示例构建说明与依赖列表得到修正 recommended-patterns 文档移除过时构建步骤,并使依赖列表与重组后的源码树一致。 文档 recommended-patterns documentation 5b856937+22-8

Fix stale build steps and dependency list in the example docs

影响

无框架或应用运行时变化;仅构建示例的开发者获得正确说明。

joaopauloschuler · 23:01 UTC · 在 GitHub 上查看该提交 →

32 低 CQRS 示例分离契约与实现 recommended-patterns 的 query、command 与 DTO unit 移到 app/<entity>/interface,mapper 与 handler 移到 implementation;Delphi/FPC 项目路径同步更新。 杂项 recommended-patterns example 323eb2c9+70-62

Move CQRS interfaces from dom/ to app/<entity>/interface

影响

仅示例项目布局与构建路径变化;框架用户和生产后端不受影响,除非复制了该示例结构。

joaopauloschuler · 22:45 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