mORMot2 DailyЕжедневный обзор коммитов апстрима

Атомики FPC ARM получают порядок памяти, HTTP.sys WebSockets перестраиваются

В выпуске исправлены отсутствующие барьеры памяти в блокировках mORMot для FPC ARM и AArch64: защищённые данные могли конфликтовать, хотя слово блокировки оставалось взаимно исключающим. В Windows обработка запросов и WebSocket в HTTP.sys существенно переписана и затем стабилизирована для жизненного цикла соединений, overlapped I/O, отправки, завершения и ping. Прямым пользователям низкоуровневых HTTP.sys wrappers и индексов соединений THttpApiWebSocketServerProtocol нужна миграция исходников.

Коротко

  • Операции блокировок FPC ARM и AArch64 теперь задают полные барьеры памяти; прежний код мог терять обновления или повреждать общее состояние.
  • Движок HTTP.sys правильно принимает unlimited chunked bodies, разрывает соединения с непрочитанным телом после ошибки и изолирует состояние каждого запроса.
  • Управление HTTP.sys WebSocket теперь использует ID TLockedList, отдельные overlapped-записи чтения/пробуждения и защищённое завершение.
  • THttpServerRequest.FullUrl теперь RawUtf8, HttpApiRequest удалён, а несколько низкоуровневых HTTP.sys signatures изменены.
  • optCleanMagicJson удаляет JSON_BASE64_MAGIC из SOA-ответов; добавлены SetErrorText, HtmlEscapeShortVar и TLockedList.Find.
  • Переходите на build 2.4.17497; не оставайтесь на переходных HTTP.sys builds 2.4.17464–2.4.17496.

Рекомендации по обновлению

Переходите на финальный build 2.4.17497. Развёртывания FPC ARM/ARM64 должны обновиться ради исправления порядка памяти и нагрузочно проверить locks, thread pools и timers. Для Windows HTTP.sys/WebSocket избегайте builds 2.4.17464–2.4.17496, перенесите изменённые публичные символы и проверьте chunked uploads, upgrades, конкурентные send/close, отключения, shutdown и ping timeouts.

Сборка2.4.17462 → 2.4.17497
Коммиты35
Строки+3088 -2371
Чтение6 мин

32 из 32 записей · 35 коммитов в апстриме

Сюжеты
# Запись Категория Модули
1 Критический ARM atomic wrappers централизуют исправление барьеров Следующий коммит задаёт barrier-aware wrappers InterlockedIncrement/InterlockedDecrement для FPC weak-atomic, добавляет AArch64 asm entry points и переводит locks, async connection и ECC reference counters на эти примитивы. Исправления mormot.core.base+4 c1a131a8+158-133

core: huge refactoring on arm32/64 about atomic operations

Влияние

Это стабилизированная реализация порядка памяти FPC ARM32/ARM64. Она защищает concurrent state за пределами lock word, особенно thread pools, timers и reference-counted work.

Arnaud Bouchez · 16:53 UTC · открыть коммит на GitHub →

2 Критический FPC non-Intel locks становятся полными барьерами памяти FPC_WEAKATOMICS помечает non-Intel targets, пути AArch64 LDXR/STLXR добавляют DMB ordering, остальные FPC CPU окружают RTL atomics барьерами в TLightLock, TRWLightLock, TRWLock, TMultiLightLock и TOSLightLock. Исправления mormot.core.base+2 b2b195da+190-8

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

Влияние

В FPC ARM/AArch64 исключение lock word не упорядочивало защищённую память. Коммит документирует потерянные increments и TSynThreadPool contexts, а также heap corruption TSynBackgroundTimer.

zen010101 · 11:55 UTC · открыть коммит на GitHub →

3 Критический Небезопасная переделка WebSocket-соединений в class отменена Коммит полностью отменяет предыдущее class-based переписывание, поскольку TOverlapped обязан оставаться первыми байтами структуры для IOCP. Исправления mormot.net.server 1ff6986c+120-69

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

Влияние

Удалён неверный Windows layout, при котором completion callback мог принять object metadata за TOverlapped. Последующие record и TLockedList изменения его заменяют.

Модули

Arnaud Bouchez · 15:24 UTC · открыть коммит на GitHub →

4 Критический Class-based список WebSocket вводит неверный IOCP layout Коммит временно превращает THttpApiWebSocketConnection из TOverlapped-rooted record/object в class и перестраивает массивы протокола. Следующий non-merge коммит полностью его отменяет. Внутреннее устройство mormot.net.server 91f43c69+69-120

net: rewritten http.sys WS connections list

Влияние

Эту ревизию нельзя развёртывать: IOCP требует TOverlapped по offset zero, чего class instance не даёт. После revert постоянного API-эффекта нет.

Модули

Arnaud Bouchez · 15:17 UTC · открыть коммит на GitHub →

5 Высокий Соединения HTTP.sys WebSocket переходят с индексов на стабильные ID THttpApiWebSocketServerProtocol хранит соединения в TLockedList, выдаёт каждому THttpApiWebSocketConnection ID, а Send и Close принимают THttpApiWebSocketConnectionID. Отдельные overlapped-записи чтения/пробуждения координируют IOCP и shutdown. Несовместимые изменения mormot.net.server 8bcdf7e7+281-196

net: http.sys WebSockets server now uses TLockList

Влияние

Код, сохранявший индекс массива или вызывавший Send/Close с integer, должен хранить Conn.ID и передавать стабильный ID. Runtime получает ABA-safe recycling и более безопасный concurrent shutdown.

Требуется миграция

Найдите THttpApiWebSocketServerProtocol.Send/Close и сохранённые индексы; сохраняйте THttpApiWebSocketConnection.ID в callbacks.

Публичный API

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

Модули

Arnaud Bouchez · 18:16 UTC · открыть коммит на GitHub →

6 Высокий Состояние WebSocket на запрос заменяет общий last connection THttpApiWebSocketServer хранит pending connection в THttpApiServerRequest вместо fLastConnection, делая concurrent upgrades локальными запросу. THttpServerRequest.FullUrl становится virtual RawUtf8, публичное HttpApiRequest удалено. Несовместимые изменения mormot.lib.winhttp+1 c852c8cf+92-103

net: several fixed to THttpApiWebSocketServer

Влияние

Удалено явно thread-unsafe общее состояние. Код с FullUrl как SynUnicode должен перейти на RawUtf8, а чтение HttpApiRequest — на поддерживаемые поля или внутреннее Windows-расширение.

Требуется миграция

Найдите объявления/присваивания FullUrl и ссылки HttpApiRequest; мигрируйте до сборки и проверьте concurrent upgrades.

Публичный API

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

Arnaud Bouchez · 14:14 UTC · открыть коммит на GitHub →

7 Высокий Низкоуровневые HTTP.sys helpers меняют выходные контракты HTTP_RESPONSE.SetStatus теперь возвращает PRawUtf8 вместо заполнения var RawUtf8, RetrieveHeadersAndGetRemoteIPConnectionID становится procedure с var Headers, добавлены LookupTokenVar и VERB_TEXT. Несовместимые изменения mormot.core.os.security+1 9c149153+41-16

lib: some http.sys API wrapper refinements

Влияние

Прямые пользователи низкоуровневых Windows wrappers не соберутся до адаптации return/output parameters. Обычные high-level пользователи THttpServer не затронуты.

Требуется миграция

Найдите вызовы SetStatus и RetrieveHeadersAndGetRemoteIPConnectionID, удалите временные status strings и передайте Headers.

Публичный API

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

Arnaud Bouchez · 12:54 UTC · открыть коммит на GitHub →

8 Высокий Неудачные WebSocket upgrades и reads теперь безопасно завершаются Сервер завершает неудачные upgrades, отвергает новые при остановке, проверяет полную запись, допускает один pending receive на соединение, завершает ошибочный receive нулём байт и ждёт окончания I/O перед recycle. Исправления mormot.net.server 97ab4cc4+64-24

net: some THttpApiWebSocketServer fixes

Влияние

Error и shutdown paths Windows HTTP.sys WebSocket больше не перерабатывают записи при возможных completions. Новой миграции исходников нет.

Модули

Arnaud Bouchez · 19:17 UTC · открыть коммит на GitHub →

9 Высокий Completion websocket.dll обрабатывается как void WebSocketApi.CompleteAction исправлен с функции HRESULT на procedure, проверки результата удалены, а receive начинается только после ответа HTTP 101. Исправления mormot.lib.winhttp+1 6f0344bf+19-45

net: fixed WebSocketApi.CompleteAction usage

Влияние

Windows-объявление соответствует websocket.dll и не читает несуществующий result. Порядок upgrade также не начинает read до завершения HTTP handshake.

Публичный API

  • WebSocketApi.CompleteActionsignature-changed

Arnaud Bouchez · 14:23 UTC · открыть коммит на GitHub →

10 Высокий Состояние ответа HTTP.sys и ошибки Range усилены Сервер помечает response до отправки, выходит после ошибки открытия static file, возвращает 416 для Range за файлом, перехватывает OnBeforeBody exceptions и последовательно очищает state. Исправления mormot.net.server 3b4da68d+34-23

net: some THttpApiServer fixes and cleanup

Влияние

Windows HTTP.sys applications не продолжают и не дублируют response после ошибки и возвращают правильный status для неверного 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 backends избегают гонок между application threads и обслуживанием протокола, а также повреждения памяти из-за неверного pending count.

Модули

Arnaud Bouchez · 16:04 UTC · открыть коммит на GitHub →

12 Высокий Объявление WebSocket send синхронизировано с реализацией Недостающее объявление mormot.net.server заставляет WriteData возвращать успех и written count, удаляет старый общий overlapped для send и синхронно отправляет response entity body. Исправления mormot.net.server c9bcf0ea+16-24

net: missing file in previous commit

Влияние

Предыдущий коммит без этого unit был неполным и мог не собраться или сохранить несовпадающее send-поведение. Публичный application API не меняется.

Модули

Arnaud Bouchez · 14:36 UTC · открыть коммит на GitHub →

13 Высокий HTTP.sys закрывает соединения с непрочитанным телом запроса SendError может добавлять Connection: close и HTTP_SEND_RESPONSE_FLAG_DISCONNECT. Этот путь используется для oversized body, bot rejection, OnBeforeBody abort и read errors. Исправления mormot.net.server 6a2970d5+21-9

net: properly disconnect http.sys client when needed

Влияние

Сервер больше не переиспользует HTTP.sys connection с непрочитанным телом, предотвращая повреждённое состояние следующего запроса.

Модули

Arnaud Bouchez · 08:44 UTC · открыть коммит на GitHub →

14 Высокий Ошибки ping больше не завершают WebSocket guard THttpApiWebSocketConnection.CheckIsActive теперь игнорирует неактивные состояния, закрывает просроченные peers до нового ping и перехватывает исключения Ping, закрывая только затронутое соединение. Исправления mormot.net.server 21b62bc8+18-9

net: fixed http.sys ping process

Влияние

Сервисы Windows HTTP.sys WebSocket сохраняют guard thread при ошибке ping и не пингуют уже закрывающиеся соединения. API приложений Delphi и FPC не меняется.

Модули

Arnaud Bouchez · 19:38 UTC · открыть коммит на GitHub →

15 Высокий Получение тела HTTP.sys соответствует контракту 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 теперь поддерживает null output pointer для overlapped I/O. Прямые вызовы поля функции должны передавать адрес или nil; этот же коммит временно инвертировал send-test, исправленный следующим.

Требуется миграция

Обновите прямые вызовы ReceiveRequestEntityBody на @count или nil и переходите на 2.4.17497, а не на эту промежуточную ревизию.

Публичный API

  • THttpApiFunction.ReceiveRequestEntityBodysignature-changed

Arnaud Bouchez · 19:26 UTC · открыть коммит на GitHub →

16 Высокий Запись WebSocket и ответ на закрытие идут по правильным путям WriteData теперь успешен только при полной записи тела HTTP.sys, цикл отправки правильно проверяет ошибку, а close frame клиента получает соответствующий ответ сервера. Исправления mormot.net.server 072bba0e+11-11

net: THttpApiWebSocketConnection fixes

Влияние

Исправлены регрессии переписывания WebSocket: прежние builds могли прерывать успешную отправку или неверно обрабатывать close handshake в Windows.

Модули

Arnaud Bouchez · 19:34 UTC · открыть коммит на GitHub →

17 Высокий WebSocket network send сообщает фактически записанные байты WEB_SOCKET_SEND_TO_NETWORK_ACTION теперь пишет каждый buffer websocket.dll, суммирует фактические байты для CompleteAction и отключается при ошибке записи HTTP.sys. Исправления 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 Высокий Unlimited chunked HTTP.sys bodies больше не получают 413 Проверка длины применяет MaximumAllowedContentLength только при значении больше нуля, поэтому ноль сохраняет смысл unlimited для chunked body. Исправления mormot.net.server 7b05e490+4-3

net: fixed #642 THttpApiServer chunked body gets 413

Влияние

Windows HTTP.sys endpoints с default unlimited принимают chunked uploads вместо HTTP 413.

Модули

Arnaud Bouchez · 08:24 UTC · PR #642 · открыть коммит на GitHub →

19 Высокий Обработка HTTP.sys становится объектом на запрос Монолитный THttpApiServer.DoExecute разделён на private THttpApiServerRequest с request, response, buffers, logging и send/error methods. Переиспользование по thread сохранено, состояние ответа и исключений стало явным. Внутреннее устройство mormot.net.http+1 5adc88f8+507-518

net: huge THttpApiServer refactoring/rewrite

Влияние

Windows HTTP.sys получает более явную изоляцию запросов и error handling, но это начало multi-commit rewrite и не подходит как отдельная точка обновления.

Стоит взглянуть

Arnaud Bouchez · 12:55 UTC · открыть коммит на GitHub →

20 Высокий Записи WebSocket сохраняют overlapped по смещению ноль Соединения возвращены к record/object с TOverlapped первым полем, а allocation, lookup и pending-close arrays перестроены вокруг pointers. Внутреннее устройство mormot.net.server 22a41512+61-94

net: some THttpApiWebSocketConnection refactoring

Влияние

Восстановлен layout для IOCP callbacks после отменённой class-попытки, но это промежуточная архитектура, затем заменённая TLockedList.

Стоит взглянуть

Модули

Arnaud Bouchez · 15:48 UTC · открыть коммит на GitHub →

21 Средний Повреждённый сжатый HTTP-контент больше не выбрасывает исключение THttpSocketCompressList.UncompressContent оборачивает decompressor в try/except, очищает result и возвращает nil при исключении codec. Исправления mormot.net.http f1ec718b+11-7

net: hardened THttpSocketCompressList.UncompressContent

Влияние

Повреждённый gzip/deflate становится обычной ошибкой распаковки вместо исключения в Delphi/FPC HTTP path. Callers должны обрабатывать nil.

Публичный API

  • THttpSocketCompressList.UncompressContentbehaviour-changed

Модули

Arnaud Bouchez · 09:43 UTC · открыть коммит на GitHub →

22 Средний Заблокированные списки находят ABA-resistant идентификаторы Публичный TLockedListID типизирует sequence, а TLockedList.Find ищет ненулевой ID под блокировкой списка. В 32-bit FPC перенос LockedInc64 использует LockedInc32 ради барьера. Новые возможности mormot.core.base+1 4824b5db+32-8

core: new TLockedList.Find method

Влияние

Инфраструктура может находить recycled records без нестабильных pointers. Существующие Delphi/FPC callers не меняются, если не используют helper.

Стоит взглянуть

Публичный API

  • TLockedListIDadded
  • TLockedList.Findadded

Arnaud Bouchez · 17:58 UTC · открыть коммит на GitHub →

23 Средний SOA-методы могут возвращать JSON без binary magic prefixes TInterfaceMethodOption получает optCleanMagicJson. TInterfaceFactoryServer.ExecuteJson вызывает RemoveMagicFromJson для ответа при наличии опции. Новые возможности mormot.core.interfaces+1 2ff79bbd+6-2

soa: new optCleanMagicJson option for #402

Влияние

Выбранные interface methods могут выдавать JSON-строки без внутреннего JSON_BASE64_MAGIC. Существующие services не меняются без opt-in.

Стоит взглянуть

Публичный API

  • TInterfaceMethodOption.optCleanMagicJsonadded

Arnaud Bouchez · 06:43 UTC · PR #402 · открыть коммит на GitHub →

24 Средний Удаление JSON magic переписано как быстрый copy-on-write scan RemoveMagicFromJson сначала сканирует границы строк и JSON_BASE64_MAGIC, выделяя writable copy только при фактическом удалении маркера. Производительность mormot.core.json 367cdf5a+46-43

core: rewritten RemoveMagicFromJson()

Влияние

SOA и прямые callers сохраняют public procedure, но обычный JSON не копируется. Поведение ограничено строками с magic prefix.

Стоит взглянуть

Модули

Arnaud Bouchez · 09:42 UTC · открыть коммит на GitHub →

25 Низкий Текст системной ошибки можно записать прямо в RawUtf8 Публичная procedure SetErrorText заполняет существующий RawUtf8 по OS error code, по умолчанию текущему. GetErrorText делегирует ей, HTTP-код переиспользует helper. Новые возможности mormot.core.os+2 f47c802c+263-237

core: new SetErrorText() function

Влияние

Callers могут переиспользовать destination string и избежать temporary; существующий GetErrorText остаётся совместимым в Delphi и FPC.

Публичный API

  • SetErrorTextadded

Arnaud Bouchez · 12:52 UTC · открыть коммит на GitHub →

26 Низкий HTML escaping может заполнять short string вызывающего Публичная procedure HtmlEscapeShortVar пишет escaped RawUtf8 в ShortString с выбранным format; HtmlEscapeShort теперь делегирует wrapper. Новые возможности mormot.core.fmt 5ec9601b+14-4

core: new HtmlEscapeShortVar() wrapper function

Влияние

Delphi/FPC callers с готовым destination могут избежать временного результата. Существующие вызовы совместимы.

Публичный API

  • HtmlEscapeShortVaradded

Модули

Arnaud Bouchez · 12:53 UTC · открыть коммит на GitHub →

27 Низкий Async networking получает нефункциональную очистку mormot.net.async отформатирован и упрощён без изменения исполняемых ветвей или публичных объявлений. Внутреннее устройство mormot.net.async 29b15f39+17-17

net: some code cleanup with no functional change

Влияние

Влияния на application code 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 нет влияния на application code; это обслуживание внутренней реализации Windows HTTP.sys.

Модули

Arnaud Bouchez · 13:19 UTC · открыть коммит на GitHub →

29 Низкий Пример документирует папки interface и implementation SAD, README и project guides описывают разделение app/<entity>/interface и app/<entity>/implementation, направление dependencies и исключение local mode. Документация recommended-patterns documentation 76e144c0+147-119

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

Влияние

Runtime mORMot не меняется; команды, следующие примеру, получают более ясное архитектурное руководство.

joaopauloschuler · 22:52 UTC · открыть коммит на GitHub →

30 Низкий Документация CQRS layout учитывает замечания ревью Документы архитектуры и разработки уточняют dependencies interface/implementation и ссылки example service после ревью. Документация recommended-patterns documentation 4ecaf74e+16-15

Address review notes on the interface/implementation docs

Влияние

Нет влияния на runtime или public framework API; улучшено только объяснение recommended-patterns.

joaopauloschuler · 22:58 UTC · открыть коммит на GitHub →

31 Низкий Инструкции сборки и зависимости примера исправлены Документация recommended-patterns удаляет устаревшие build steps и синхронизирует dependencies с новым source tree. Документация recommended-patterns documentation 5b856937+22-8

Fix stale build steps and dependency list in the example docs

Влияние

Нет изменений framework или runtime; исправлены лишь инструкции для сборки примера.

joaopauloschuler · 23:01 UTC · открыть коммит на GitHub →

32 Низкий CQRS-пример разделяет контракты и реализации Query, command и DTO units recommended-patterns перемещены в app/<entity>/interface, mappers и handlers — в implementation; пути проектов Delphi и FPC обновлены. Обслуживание recommended-patterns example 323eb2c9+70-62

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

Влияние

Меняются только layout примера и build paths. Пользователи framework и production backends не затронуты, если не копировали структуру.

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