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

WebSocket без задержки пробуждается, отписка IOCP стала атомарной

Сетевые backend получили несколько конкретных исправлений конкурентности: WebSocket-кадры с нулевой задержкой будят async-сервер, уже подключённые tunnel sockets идут по правильному пути, а Windows IOCP subscription может быть захвачена для удаления только один раз. Завершена и переработка слотов TSynLog: слот не публикуется для повторного использования до очистки его битов имени во всех журналах. Пользователям UI следует проверить новый conditional HAS_UI_PDF и удаление HASUIPDF; остальные PDF-изменения в основном относятся к тестам и выбору платформы.

Коротко

  • TWebSocketAsyncConnections теперь будит главный поток async-сервера при SendDelay=0 и переходе исходящей очереди из пустой в непустую.
  • TWinIocp.Unsubscribe атомарно меняет указатель subscription вызывающего кода на nil, не позволяя конкурентно удалить один объект дважды.
  • TTunnelLocal отличает связанный listening socket от уже подключённого socket и восстанавливает правильный путь обработки.
  • TSynLog очищает биты имени потока во всех журналах до возврата номера в пул повторно используемых слотов.
  • HASUIPDF заменён на HAS_UI_PDF; добавлены project controls NO_UI, NO_UI_VCL и NO_UI_PDF.

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

Для async WebSocket, TTunnelLocal, Windows IOCP и TSynLog с частой сменой потоков берите build 2.4.16753: она включает полные исправления payload. Пересоберите UI/PDF-проекты и замените прикладные проверки HASUIPDF на HAS_UI_PDF. NO_UI, NO_UI_VCL и NO_UI_PDF нужны лишь для исключения этих подсистем. В исходном payload нет более поздних замен этих commit в этой редакции.

Сборка2.4.16737 → 2.4.16753
Коммиты13
Строки+995 -375
Чтение3 мин

12 из 12 записей · 13 коммитов в апстриме

Сюжеты
# Запись Категория Модули
1 Высокий Logging-слот публикуется для повторного использования после очистки битов TSynLog.NotifyThreadEnded в mormot.core.log сначала очищает fThreadNameLogged под SynLogGlobalLock, затем блокирует SynLogThreads.Safe и добавляет номер в IndexReleased. Индекс bitmap теперь записан как num - 1. Исправления mormot.core.log 68f8a3cb+16-17

core: fixed another paranoid race in TSynLog.NotifyThreadEnded

Влияние

Другой поток не успеет получить повторный номер и установить бит имени до очистки старого бита завершающимся потоком. Delphi/FPC-службы с частой сменой потоков не теряют маркер нового владельца.

Модули

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

2 Высокий Windows IOCP unsubscribe атомарно захватывает указатель вызывающего кода TWinIocp.Unsubscribe в mormot.net.sock.windows копирует subscription pointer локально, затем через LockedExc меняет var-параметр на nil, только если он ещё совпадает. Shutdown, receive и free используют захваченный локальный указатель. Исправления mormot.net.sock.windows 76d9d035+9-9

net: made TWinIocp.Unsubscribe atomic

Влияние

Два конкурентных вызова не могут пройти non-nil проверку и отписать или освободить один IOCP subscription. Windows async-серверы избегают двойного shutdown и возможного use-after-free.

Публичный API

  • TWinIocp.Unsubscribebehaviour-changed — var-указатель атомарно захватывается и очищается до начала удаления.

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

3 Высокий WebSocket-кадры без задержки сразу будят async-сервер TWebSocketAsyncConnections.NotifyOutgoing запоминает, была ли fOutgoingHandle пустой до добавления. При первом элементе и Connection.fProcess.Settings^.SendDelay = 0 вызывается новый THttpAsyncConnections.WakeupServerMainThread, сигнализирующий fExecuteEvent. Исправления mormot.net.async+1 a7195425+15-2

net: fixed TWebSocketAsyncConnections with SendDelay=0

Влияние

При SendDelay=0 исходящий кадр больше не ждёт постороннего socket event или idle pass до отправки главным async loop. Восстановлена ожидаемая немедленная доставка на Delphi/FPC WebSocket-серверах.

Публичный API

  • TWebSocketAsyncConnections with SendDelay=0behaviour-changed — Первое исходящее соединение в очереди сразу будит цикл сервера.

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

4 Высокий Подключённые локальные tunnels больше не входят в listening accept TTunnelLocal в mormot.net.tunnel переименовывает внутренний fSocketCreated в fSocketBound и устанавливает его только после bind через NewSocket для нулевого порта. TTunnelLocalThread.DoExecute входит в accept loop лишь при этом флаге. Исправления mormot.net.tunnel 9cb2c9bc+5-5

net: fixed TTunnelLocal socket flag

Влияние

Tunnel, открытый подключением к существующему локальному адресу, сразу переходит в stProcessing вместо accept на подключённом socket. Bound tunnel с ephemeral port сохраняет listening-поведение.

Модули

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

5 Средний UI compile controls переименованы, CountOccurrences стал публичным mormot.defines заменяет HASUIPDF на HAS_UI_PDF и вводит HAS_UI, HAS_UI_VCL_LCL, а также switches NO_UI, NO_UI_VCL и NO_UI_PDF. mormot.core.unicode добавляет публичный CountOccurrences для неперекрывающихся RawUtf8; mormot.core.text исправляет имя параметра в UInt32DigitsToUtf8. Несовместимые изменения mormot.core.text+3 fe0b21d2+59-18

core: new CountOccurrences() function

Влияние

Условия приложений или packages с HASUIPDF перестают выбирать PDF-ветку до переименования. Проекты могут исключать весь UI, Delphi VCL или только PDF; CountOccurrences доступен Delphi и FPC.

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

Найдите HASUIPDF в исходниках, package files и build defines, замените на HAS_UI_PDF и пересоберите UI и headless targets.

Публичный API

  • HASUIPDFremoved — Замените проверки проекта на HAS_UI_PDF.
  • HAS_UI / HAS_UI_VCL_LCL / HAS_UI_PDFadded — Описывают доступные UI-возможности после project-level исключений.
  • NO_UI / NO_UI_VCL / NO_UI_PDFadded — Project switches для отключения всего UI, VCL/LCL или PDF.
  • CountOccurrencesadded — Считает неперекрывающиеся вхождения SubStr в RawUtf8 Text.

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

6 Средний Очистка bitmap имён перенесена под глобальную блокировку журнала TSynLog.NotifyThreadEnded в mormot.core.log защищает SynLogFamily и bitmap fGlobalLog.fThreadNameLogged через SynLogGlobalLock. Существующая работа под SynLogThreads.Safe изначально вложена в эту защиту. Исправления mormot.core.log 6539d93d+24-19

core: fixed a paranoid race in TSynLog.NotifyThreadEnded

Влияние

Завершающийся поток больше не меняет bitmap имён параллельно с lifecycle семейства логов. Последующий 68f8a3c завершает порядок до повторного использования слота.

Модули

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

7 Средний Async-обслуживание использует единую шкалу монотонного времени mormot.net.async записывает fLastOperationMS до возможного re-entry из ProcessWaitingWrite и обновляет после. Период callbacks без IOCP теперь берёт tix из GetTickCount64 shr 16 вместо GetTickSec shr 6, совпадая с миллисекундной логикой вокруг. Исправления mormot.net.async f50a5e53+6-4

net: fixed async internal ticks computation

Влияние

Async socket maintenance избегает рекурсивной работы на одном tick и использует согласованный интервал около 65 секунд. В основном затронуты POSIX poll backend; API не меняются.

Модули

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

8 Низкий Фиксированные hash- и temp-типы расширены до 4096 бит mormot.core.base добавляет THash1024, THash2048 и THash4096 с pointer aliases, а также TTemp128 и TTemp256. Фиксированные массивы SHA-512, CPU sets, SSPI, ISO, DHCP и TFTP заменены эквивалентными именованными типами без изменения размера. Новые возможности mormot.core.base+7 487c21e6+29-21

core: new THash1024..4096 and TTemp128..512 types

Влияние

Приложения получают стандартные объявления бинарных и stack buffer размером 128, 256 и 512 байт. Layout существующих records не меняется, wire formats остаются прежними.

Публичный API

  • THash1024 / PHash1024 / THash2048 / PHash2048 / THash4096 / PHash4096added — Именованные byte arrays и pointer aliases для 128, 256 и 512 байт.
  • TTemp128 / TTemp256added — Фиксированные временные буферы AnsiChar на 128 и 256 байт.

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

9 Низкий Контекст исключения теперь содержит числовой слот потока mormot.core.log форматирует обычный контекст исключения как [#номер имя], пропуская недоступные части. _GetCurrentThreadName упрощён без изменения блокировки, TDebugFile.AddLog вызывает DebugFileGet напрямую. Новые возможности mormot.core.log 93da31e1+24-15

core: refined exception logging entry

Влияние

Строки исключений проще сопоставлять с TSynLog, но парсеры, ожидающие в скобках только имя, стоит проверить. Обработка исключений и публичные API прежние.

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

Публичный API

  • TSynLog exception row formatbehaviour-changed — В обычном контексте перед необязательным именем добавлен #ThreadNumber.

Модули

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

10 Низкий TMultiLightLock использует 32-битные flags и нативный идентификатор потока mormot.core.os меняет private TMultiLightLock.Flags с PtrUInt на cardinal, а ThreadID с pointer на TThreadID. Операции используют LockedExc32 и LockedDec32, ноль заменяет nil для идентификатора. Внутреннее устройство mormot.core.os aa0c8213+13-13

core: simplified TMultiLightLock

Влияние

Семантика владения и re-entrant счётчика прежняя, атомарный счётчик теперь всегда 32-битный. Пользователи работают через публичные методы, после пересборки изменений приложения не ожидается.

Модули

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

11 Низкий TCachedValue всегда сохраняет результат обновления, завершившегося последним TCachedValue.Cache в mormot.core.os удаляет условие TixShr = Tix32 перед присваиванием Value после callback. Публичные параметры только переформатированы; mormot.core.os.security уточняет, что shift 8 означает кэш на 256 секунд. Внутреннее устройство mormot.core.os+1 a697074f+6-7

core: minor TCachedValue.Cache change

Влияние

Если refresh callbacks разных интервалов перекрываются, сохраняется завершившийся последним результат, даже если другой вызов продвинул Tix32. API и интервалы file/certificate cache прежние.

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

12 Низкий PDF-регрессии изолированы новыми именами UI-возможностей mormot.ui.pdf и integration runner заменяют HASUIPDF на HAS_UI_PDF, mormot.defines добавляет HAS_UI_LCL для FPC. test.ui.pdf реорганизован, использует mormot.lib.z для fixture и остаётся пустым unit без PDF UI. Тесты mormot.defines+1 cf21f26e+202-232

ui: more refactoring of #571 test.ui.pdf process

Влияние

Тестовые сборки без UI не инициализируют VCL/LCL и не включают PDF-тесты. Runtime PDF не меняется; commit завершает переименование conditional из предыдущего изменения.

Публичный API

  • HAS_UI_LCLadded — Определяется для FPC при включённой UI-поддержке.

Arnaud Bouchez · 09:54 UTC · PR #571 · открыть коммит на 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