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

Исправления блокировок и процессов делают build 16652 безопасной точкой обновления

Этот набор устраняет две производственные угрозы: гонку с потерей пробуждения в TOSLightLock и несколько давних ошибок POSIX RunRedirect, включая осиротевшие дочерние процессы и активный цикл после EOF. Также добавлена read-write блокировка на futex, исправлено определение типов ODBC, расширены API LDAP и трассировки стека, а перед финальным build устранены регрессии компиляции Delphi и BSD.

Коротко

  • TOSLightLock.UnLock now uses a mandatory CAS, preventing a waiter from being forgotten during unlock.
  • POSIX RunRedirect no longer leaks child process groups or spins at 100% CPU after EOF, and now honors environment and working-directory arguments.
  • ODBC column binding now uses the real precision and maps SQL_FLOAT separately from DECIMAL and NUMERIC.
  • New public APIs include TOSRWLightLock, TDebugFile.StackTrace, LDAP formatting and DN filtering helpers, and TAsnObjects.
  • Land on build 2.4.16652; earlier snapshots in this batch contain Delphi, BSD, or WaitForSafe source-compatibility regressions.

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

Для POSIX-сервисов с RunRedirect, нагрузок с TOSLightLock, пользователей ODBC и любых сборок Delphi/BSD следует взять финальную ревизию 2.4.16652. Не останавливайтесь на промежуточной ревизии: последующие коммиты исправляют компиляцию и совместимость исходников, нарушенные ранее в той же серии.

Сборка2.4.16629 → 2.4.16652
Коммиты23
Строки+1303 -403
Чтение5 мин

21 из 21 записей · 23 коммитов в апстриме

# Запись Категория Модули
1 Высокий POSIX RunRedirect больше не оставляет дочерние процессы и не зацикливается после EOF Реализация FPC POSIX заменяет popen подготовленным путем fork/execve. Дочерний процесс создает отдельную сессию, stdout явно направляется в pipe, тайм-аут сигнализирует всей группе, EOF проверяется как n<=0, учитываются окружение и рабочий каталог, простые команды используют PATH переданного окружения, а exitcode получает результат WaitProcess, если запуск не прерван. Исправления mormot.core.os.posix 667509df+231-77

core: rewrite POSIX RunRedirect() from popen() to fork/execve - fix #463

Влияние

Ожидание INFINITE больше не создает цикл с 100 % CPU после закрытия stdout, прерывание не оставляет запущенные shell процессы под PID 1, wrkdir не меняет каталог родителя, а env/options на POSIX больше не игнорируются. Семантика существенно исправлена без изменения публичной сигнатуры.

Публичный API

  • RunRedirectbehaviour-changed — POSIX-исполнение теперь использует fork/execve, учитывает существующие параметры, возвращает фактический код и завершает группы процессов.

zen010101 · 06:39 UTC · PR #463 · открыть коммит на GitHub →

2 Высокий TOSLightLock мог потерять ожидающий поток при разблокировке TOSLightLock.UnLock теперь всегда выполняет LockedExc32 из EV_LOCKED в EV_NONE перед выбором пути пробуждения. Старый быстрый путь Intel читал fMutex, затем неатомарно записывал EV_NONE, поэтому ожидающий поток мог между операциями установить EV_WAITER, который затем затирался. Исправления mormot.core.os ad8f8d38+6-16

core: fixed race in TOSLightLock.UnLock

Влияние

При конкуренции старая последовательность могла не разбудить ожидающий поток и оставить его заблокированным навсегда. Сервисы, использующие TOSLightLock напрямую или через внутренности фреймворка, должны принять исправление несмотря на небольшую стоимость CAS без конкуренции.

Публичный API

  • TOSLightLock.UnLockbehaviour-changed — Разблокировка теперь атомарно меняет состояние перед решением о пробуждении ожидающего потока.

Модули

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

3 Высокий Компиляция Delphi восстановлена для новых API блокировок и LDAP В TOSRWLightLock удалены Delphi-директивы inline у методов, которые там не могли встраиваться. В mormot.net.ldap анонимный set заменен перечислением TNormalizeDN и множеством TNormalizeDNs, а DNToCN, DNsToCN и NormalizeDN принимают TNormalizeDNs. Компилятор и платформы mormot.core.os+1 63b43ba0+12-12

net: fixed Delphi compilation

Влияние

Delphi теперь компилирует API, добавленные ранее в серии. Код для временного build 16630 должен заменить set-переменные TNormalizeDN на TNormalizeDNs; для финального API миграция не нужна.

Публичный API

  • TNormalizeDNsadded — Тип множества для фильтрации DN теперь явно называется TNormalizeDNs.
  • DNToCN / DNsToCN / NormalizeDNsignature-changed — Параметр extend использует TNormalizeDNs вместо временного set-типа TNormalizeDN.

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

4 Высокий Финальная ревизия восстанавливает сборки BSD и параметр по умолчанию WaitForSafe В mormot.core.os константа SPIN_FUTEX вынесена из блока только для OSFUTEX, чтобы резервный код TOSRWLightLock мог использовать ее на BSD. У TSynEvent.WaitForSafe также восстановлен публичный параметр по умолчанию DisableSafe=false. Компилятор и платформы mormot.core.os 951b4afd+6-5

core: fixed BSD compilation

Влияние

Цели BSD снова компилируют новую read-write блокировку, а существующий код, вызывающий WaitForSafe только с тайм-аутом, вновь собирается. Эту ревизию следует использовать вместо промежуточных build 16645-16651.

Публичный API

  • TSynEvent.WaitForSafesignature-changed — DisableSafe снова имеет значение false по умолчанию после того, как в build 16645 стал обязательным.

Модули

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

5 Средний Привязка ODBC теперь учитывает заявленную точность чисел TSqlDBOdbcStatement.BindColumns теперь передает в ODBCColumnToFieldType реальные ColumnSize и DecimalDigits из SQLDescribeColW вместо жестко заданной точности 10. SQL_FLOAT также исключен из эвристики DECIMAL/NUMERIC для целых и валюты и напрямую отображается в ftDouble. Исправления mormot.db.sql.odbc 5c4a0328+7-7

db: fixed TSqlDBOdbcStatement.BindColumns

Влияние

Столбцы результата ODBC теперь могут выдавать корректный ftInt64, ftCurrency или ftDouble вместо типа, выведенного из точности 10. Приложения, зависевшие от прежних ошибочных метаданных или преобразований, следует протестировать.

Модули

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

6 Средний WaitForSafe отдает приоритет синхронизированной работе главного потока В главном потоке TSynEvent.WaitForSafe теперь вызывает CheckSynchronize(10), затем опрашивает событие через WaitFor(0), вместо 1 мс синхронизации и 10 мс блокировки на событии. Нулевой тайм-аут обходит безопасный цикл. Исправления mormot.core.os 46404091+6-5

core: fixe TSynEvent.WaitForSafe Synchronize() call

Влияние

Ожидания главного потока быстрее обрабатывают очередь Synchronize и проверяют событие без дополнительной блокировки. Код, чувствительный к порядку синхронизации или границам тайм-аута, следует повторно протестировать.

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

Повторно протестируйте RunWait в главном потоке и прямые вызовы WaitForSafe, зависящие от точного тайм-аута или порядка Synchronize.

Публичный API

  • TSynEvent.WaitForSafebehaviour-changed — Безопасные ожидания главного потока теперь отдают приоритет CheckSynchronize и используют неблокирующую проверку события.

Модули

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

7 Средний Трассировку стека можно получить без исключения TDebugFile получает перегрузки StackTrace с возвратом RawUtf8 или записью в TTextWriter и параметрами skip, depth, TSynLogStackTraceUse. FPC использует CaptureBacktrace, Delphi Windows — RtlCaptureStackBackTrace с ручным Win32-резервом, а TSynLog разделяет реализацию. Новые возможности mormot.core.log 702c8d0c+208-47

core: add TDebugFile.StackTrace() methods - request #401

Влияние

Диагностические endpoints и отчеты об ошибках могут получать стек текущего потока без искусственного исключения. На FPC x86_64 полезные кадры зависят от генерации stack frames; Delphi POSIX пока ничего не добавляет.

Публичный API

  • TDebugFile.StackTraceadded — Две перегрузки получают стек текущего потока как текст без исключения.

Модули

zen010101 · 06:38 UTC · PR #401 · открыть коммит на GitHub →

8 Средний Новая read-write блокировка с поддержкой ОС отдает приоритет читателям mormot.core.os добавляет TOSRWLightLock: 32-битный счетчик читателей и флаг писателя с WaitOnAddress/WakeByAddress на Windows 8+, futex на Linux и spin-резервом на других системах. Доступны Init, Done, read/write lock, try-lock, unlock и IsLocked. Новые возможности mormot.core.os 583fe89c+196-7

core: new TOSRWLightLock efficient object

Влияние

Приложения получают малозатратную альтернативу TRWLightLock с приоритетом читателей. Непрерывные читатели могут задержать писателя, а запрос write-lock внутри read- или write-lock по контракту приводит к deadlock.

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

Используйте TOSRWLightLock только когда допустим приоритет читателей; оставьте TRWLightLock, если ожидающий писатель должен блокировать новых читателей.

Публичный API

  • TOSRWLightLockadded — Новый record/object read-write блокировки с приоритетом читателей и поддержкой ОС.

Модули

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

9 Средний Преобразование LDAP DN может выбирать компоненты CN, OU и DC DNToCN, DNsToCN и NormalizeDN получают необязательное множество extend, управляющее включением CN, OU и DC. Значение по умолчанию сохраняет прежний полный результат; build 16639 позже дает множеству финальное имя TNormalizeDNs. Новые возможности mormot.net.ldap 9411aea0+52-24

net: introducing TNormalizeDN extend e.g. for DNToCN()

Влияние

LDAP-приложения могут получать канонические или нормализованные имена только с выбранными уровнями DN без повторного разбора строки. Существующие вызовы сохраняют результат, так как DN_ALL остается значением по умолчанию.

Публичный API

  • DNToCN / DNsToCN / NormalizeDNsignature-changed — Добавлен необязательный параметр выбора компонентов со значением DN_ALL по умолчанию.

Модули

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

10 Средний Кроссплатформенный слой futex умеет будить всех ожидающих Новый callback OsWakeAllOnValue разрешается в WakeByAddressAll на Windows 8+ и FUTEX_WAKE_PRIVATE с MaxInt на Linux. Он дополняет OsWaitOnValue и OsWakeOnValue для одного ожидающего. Новые возможности mormot.core.os+2 c849d860+25-12

core: implemented WakeByAddressAll() on Win8+ and Linux

Влияние

Примитивы фреймворка, например TOSRWLightLock, могут разбудить всех читателей после освобождения блокировки писателем. Поведение приложений не меняется, если новый callback не используется напрямую.

Публичный API

  • OsWakeAllOnValueadded — Новый необязательный callback для пробуждения всех ожидающих 32-битного значения.

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

11 Средний TLoggedWorker ожидает событие вместо опроса TLoggedWorker теперь владеет TSynEvent fIdle. RunOne сбрасывает его при запуске работы, RunDone сигнализирует при достижении fRunning нуля, а RunWait передает тайм-аут и необязательную синхронизацию главного потока в WaitForSafe. Производительность mormot.core.threads a22faf70+31-20

core: let TLoggedWorker use TSynEvent for WaitFor()

Влияние

Ожидание больше не просыпается каждые 10 мс, снижая нагрузку CPU в простое и немедленно реагируя на переход worker в idle. Контракт теперь явно допускает только одного одновременного вызывающего RunWait.

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

Проверьте, что код приложения не вызывает RunWait одновременно для одного экземпляра TLoggedWorker.

Публичный API

  • TLoggedWorker.RunWaitbehaviour-changed — Реализация стала событийной и поддерживает один ожидающий поток одновременно.

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

12 Низкий Списки атрибутов LDAP получают вставку форматированных значений TLdapAttributeList.AddFmt форматирует значение RawUtf8 через FormatUtf8 и передает его существующей перегрузке Add с нужным TLdapAddOption. Метод возвращает затронутый TLdapAttribute. Новые возможности mormot.net.ldap c7ba1bb3+17-3

net: new TLdapAttributeList.AddFmt() method

Влияние

Код LDAP-клиента может создавать форматированные значения атрибутов без временной строки. Существующие вызовы Add и их поведение не изменены.

Публичный API

  • TLdapAttributeList.AddFmtadded — Новый вспомогательный метод для форматированного значения с аргументами FormatUtf8.

Модули

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

13 Низкий Объекты ASN.1 получают типизированный динамический массив mormot.core.os.security добавляет TAsnObjects как массив TAsnObject и AsnAddItem для добавления закодированного объекта с возвратом его индекса от нуля. Указанный сценарий — построение модификаторов LDAP. Новые возможности mormot.core.os.security 446a5be1+15-2

core: new TAsnObjects type and its AsnAddItem() wrapper

Влияние

Код, собирающий несколько ASN.1-значений, может использовать именованный тип массива без повторяющегося SetLength. Существующие API кодирования ASN.1 не изменены.

Публичный API

  • TAsnObjectsadded — Тип динамического массива для нескольких значений TAsnObject.
  • AsnAddItemadded — Добавляет объект ASN.1 и возвращает его индекс.

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

14 Низкий Опрос сокетов Windows использует быстрый путь ожидающих событий TPollSockets.PollForPendingEvents больше не ограничивает быстрый путь fPendingSafe.TryLock платформой POSIX. Windows теперь также пробует неблокирующую блокировку и переносит события без медленного пути при отсутствии конкуренции. Производительность mormot.core.os+1 79dd6c23+2-5

core: some TPollSockets optimization on Windows

Влияние

Серверы Windows с частыми изменениями подписок сокетов могут тратить меньше времени на объединение ожидающих событий. Изменение внутреннее и не требует правок приложений.

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

15 Низкий Ожидающие события сокетов переходят на более дешевую блокировку при низкой конкуренции TPollSockets.fPendingSafe заменен с TOSLightLock на TLightLock. В коммите указано, что конкуренция за ожидающие события мала, а обязательный CAS в TOSLightLock.UnLock делает здесь простую блокировку быстрее. Производительность mormot.net.sock 60cb8bc7+3-3

net: let TPollSockets use TLightLock for the Pending envents

Влияние

Опрос сокетов сохраняет исправление гонки, избегая дополнительной стоимости разблокировки без конкуренции для этой внутренней очереди. Изменения приложений не требуются.

Модули

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

16 Низкий TRWLightLock получает пустой финализатор для взаимозаменяемости блокировок TRWLightLock теперь предоставляет пустой метод Done, совпадающий с жизненным циклом TOSLock и родственных примитивов. В документации также явно указан приоритет писателя. Компилятор и платформы mormot.core.os d5844b6a+12-2

core: new TRWLightLock.Done void method

Влияние

Обобщенный код может вызывать Init и Done для обоих типов блокировок без условной очистки. Done ничего не делает, поэтому поведение не изменено.

Публичный API

  • TRWLightLock.Doneadded — Пустой метод жизненного цикла, совместимый с другими record-блокировками.

Модули

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

17 Низкий Реестры классов базы данных и REST используют массивы указателей Внутренние реестры классов TSqlDBConnectionProperties и TRest теперь вызывают PtrArrayAddOnce вместо хранения TClass через приведение к TObject. Имя и форматирование вспомогательной ODBC-функции нормализованы без изменения области видимости. Внутреннее устройство mormot.db.sql+2 9fbd6c32+13-13

all: minor code refactoring

Влияние

Функциональных изменений и миграции приложений нет. Представление реестра теперь соответствует фактически хранимым указателям.

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

18 Низкий Тест туннельного ретранслятора удаляет неиспользуемую переменную генератора TNetworkProtocols.TunnelRelay больше не объявляет и не инициализирует неиспользуемую переменную PLecuyer. Проверки, поток управления и модули фреймворка не изменены. Тесты b1f1302d+2-4

tests: minor unused variable cleanup

Влияние

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

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

19 Низкий Текстовый модуль проверяет, что форматтер помещается в стековый буфер Инициализация mormot.core.text добавляет Assert, что SizeOf(TFormatUtf8) не превышает SizeOf(TTextWriterStackBuffer). Текущие ожидаемые размеры — 4 КБ и 8 КБ. Тесты mormot.core.text e171e5aa+3-2

core: added paranoid Assert() about TFormatUtf8

Влияние

В обычных сборках поведение не меняется. Сборки с assertions завершатся раньше, если будущий рост форматтера нарушит предположение о стековом буфере.

Модули

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

20 Низкий Документированы приоритет блокировок и поведение ожидающих сокетов Комментарии теперь отличают приоритет читателей TOSRWLightLock от модели Windows SRW и точнее описывают переопределения ожидающих событий TPollSockets. EnsurePending явно именует начальный индекс без изменения поиска. Документация mormot.core.os+1 181c2d7b+13-9

core: mostly comments/documentation precisions

Влияние

Влияния на выполнение и исходный код нет. Документация яснее описывает выбор блокировок и обязанности подклассов сокетов.

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

21 Низкий Документация TUri подтверждает поддержку имени сервера без пути Комментарий TUri.From теперь явно указывает имя сервера без схемы и пути как ввод, интерпретируемый по HTTP. Код парсера не изменен. Документация mormot.net.sock ff62d966+4-4

net: TUri.From() documentation precision

Влияние

Изменений выполнения нет. Разработчики могут использовать уже существующий разбор имени хоста с более ясной документацией.

Модули

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