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

Блокировки на каждый writer внедрены вместе с обязательными исправлениями fallback

TSynLog заменяет общую для процесса блокировку записи отдельной блокировкой каждого writer, снижая contention, но одновременно выявляя пути отказа, исправленные позднее в той же серии. Прямые пользователи TX64CpuFeatures должны убрать ссылки на cpuSSSE3, а поддерживаемые x86-64 цели теперь автоматически выбирают SSSE3 parser чисел JSON. Просмотрщики логов, диагностические инструменты и вызовы AppendShortByteHex также получают конкретные исправления и улучшения API.

Коротко

  • Переходите на build 2.4.16943 в 0b26918230d72e33b79365a79c1bc444ec3029b1; избегайте незавершённой серии TSynLog в builds 2.4.16937–2.4.16941.
  • TSynLog теперь сериализует запись отдельно для каждого logger вместо одной глобальной блокировки, уменьшая contention между независимыми логами.
  • Build 2.4.16942 исправляет пути отказа Enter, EnterLocal и ManualEnter, появившиеся после рефакторинга блокировок.
  • TX64CpuFeatures.cpuSSSE3 удалён; для проверки возможности используйте cfSSSE3 в CpuFeatures.
  • Поддерживаемые non-PIC x86-64 цели Delphi и FPC теперь автоматически выбирают GetNumericVariantSsse3 для чисел JSON.
  • Поиск в обычных текстовых TSynLogFile снова работает, а AppendShortByteHex безопасно принимает PtrUInt больше 255.

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

Берите build 2.4.16943 на текущем head и не останавливайтесь на builds 2.4.16937–2.4.16941: в новом per-writer locking ещё есть ошибки путей Enter и учёта рекурсии, исправленные в 16942. Найдите cpuSSSE3 в коде приложений и замените на cfSSSE3 в CpuFeatures. Пересоберите все цели Delphi/FPC, затем проверьте сбои запуска и ротации logger, вложенные callbacks writer, параллельные независимые loggers, поиск в обычном тексте и JSON numeric parsing на машинах с SSSE3 и без него.

Сборка2.4.16922 → 2.4.16943
Коммиты21
Строки+9887 -9367
Чтение4 мин

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

Сюжеты
# Запись Категория Модули
1 Высокий Дублирующий feature flag cpuSSSE3 удалён mormot.core.base удаляет cpuSSSE3 из публичного перечисления TX64CpuFeatures. Внутренний код теперь проверяет cfSSSE3 в общем наборе CpuFeatures, а paranoid detection очищает cfSSSE3 при отсутствии cfSSE3. Несовместимые изменения mormot.core.base+2 5f7b6d39+7-8

core: removed cpuSSSE3 from X64CpuFeatures

Влияние

Код Delphi или FPC, напрямую ссылающийся на cpuSSSE3 либо ожидающий его в X64CpuFeatures, больше не компилируется. Для общей проверки CPU следует использовать cfSSSE3 в CpuFeatures.

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

Найдите cpuSSSE3 и X64CpuFeatures; замените первый на cfSSSE3 в CpuFeatures и пересоберите каждую x86-64 цель.

Публичный API

  • TX64CpuFeatures.cpuSSSE3removed — Используйте cfSSSE3 в общем наборе CpuFeatures.

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

2 Высокий Сбой входа в лог больше не выглядит успешным TSynLog LogEnter и LogEnterFmt теперь сообщают об успешности подготовки writer. При сбое Enter и EnterLocal возвращают nil, ManualEnter записывает нулевой маркер рекурсии, ManualLeave его потребляет, а _Release всегда балансирует EndWrite. Исправления mormot.core.log c3462904+72-52

core: fixed TSynLog.Enter* fallback on failure

Влияние

Сбои запуска logger, ротации или вложенного writer больше не создают ложный scope ISynLog и несбалансированную write recursion. Это обязательное исправление для приложений с предыдущими per-writer commits.

Модули

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

3 Высокий Переработка блокировок логов снова компилируется в Delphi mormot.core.log вводит TSynLogFamilyDynArray и использует его для глобального массива семейств logger и локального снимка, устраняя несовместимость типов Delphi E2008 после lock refactor. Компилятор и платформы mormot.core.log f8937aeb+3-2

core: fix Delphi E2008 in SynLogException - Delphi treats each inline 'array of TSynLogFamily' declaration as a distinct type, so 'families := copy(SynLogFamily)' failed to compile. Use a named TSynLogFamilyDynArray for both.

Влияние

Предыдущее состояние refactor не компилировалось в затронутых версиях Delphi. Этот commit восстанавливает Delphi builds; поведение FPC и runtime-семантика логов не меняются.

Публичный API

  • TSynLogFamilyDynArrayadded — Именованный dynamic-array type для реестра семейств logger.

Модули

vennexTSE · 15:43 UTC · открыть коммит на GitHub →

4 Высокий Каждый writer TSynLog получает собственную блокировку записи Основная переработка TSynLog заменяет глобальную write lock на fWriteSafe каждого logger, разделяет блокировки исключений и списка logger, отмечает активную запись в thread flags и вводит helpers BeginWrite, EndWrite и LockAndPrepareWrite. Внутреннее устройство mormot.core.log 001b4c2d+9347-9020

core: huge refactoring of TSynLog locking

Влияние

Независимые loggers могут писать параллельно вместо contention на одной общей блокировке, но переработка меняет чувствительные пути инициализации, ротации и reentrancy. Builds до последующего исправления 16942 развёртывать нельзя.

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

Берите изменение только вместе с исправлением 16942, затем нагрузочно проверьте несколько TSynLog, ротацию, exception logging и callbacks собственного writer при concurrency.

Модули

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

5 Средний Поиск в обычных текстовых логах снова работает TSynLogFile.LineContains теперь делегирует TMemoryMapText.LineContains, когда нет распознанных уровней логов, вместо возврата false для каждой строки обычного текстового файла. Исправления mormot.core.log 638616f1+28-4

core: fixed TSynLogFile.LineContains() on plain text files

Влияние

TSynLogFileView SearchNext и SearchPrevious снова находят текст в файлах не-SynLog. Поведение поиска структурированных SynLog для Delphi и FPC не меняется.

Публичный API

  • TSynLogFile.LineContainsbehaviour-changed — Обычные текстовые файлы теперь используют унаследованную реализацию поиска.

Модули

Sven Harazim · 20:06 UTC · открыть коммит на GitHub →

6 Средний Отсчёт времени лога начинается при создании TSynLog Конструктор TSynLog теперь сразу инициализирует high-resolution start timestamp и начальную дату UTC. LogFileInit использует сохранённое UTC-значение и преобразует его в local time только при записи header. Исправления mormot.core.log 71e8dc08+12-13

core: set TSynLog timestamp at startup

Влияние

Elapsed timestamps и headers логов получают единое начало даже при отложенной инициализации файла. Существующие вызовы и публичные signatures Delphi/FPC не меняются.

Модули

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

7 Средний Hex append больше не выходит за таблицу цифр AppendShortByteHex в mormot.core.base теперь маскирует старшую тетраду так же, как младшую, поэтому значение PtrUInt больше 255 не может читать за пределами HexCharsUpper. Исправления mormot.core.base ae5a3b33+5-4

core: fixed AppendShortByteHex() overflow

Влияние

Для Delphi- и FPC-вызовов со значением размера byte ничего не меняется. При более широком PtrUInt теперь возвращаются две hex-цифры младшего байта вместо чтения за границей таблицы.

Публичный API

  • AppendShortByteHexbehaviour-changed — Значения шире байта теперь безопасно сводятся к младшему байту.

Модули

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

8 Средний Поиск символов debug-файла становится публичным TDebugFile делает публичными FindSymbol, обе перегрузки FindBlock и FindBlockByName и добавляет Lookup(aRva), объединяющий имя исходного файла, строку и symbol для адреса. Новые возможности mormot.core.log 5a3e5210+49-22

core: new TDebugFile public methods

Влияние

Диагностические инструменты Delphi и FPC могут напрямую запрашивать загруженные debug metadata без наследования TDebugFile. Поведение существующего кода не меняется.

Публичный API

  • TDebugFile.FindSymbol / FindBlock / FindBlockByNamebehaviour-changed — Эти существующие методы переходят из protected в public.
  • TDebugFile.Lookupadded — Возвращает форматированные сведения об исходнике и symbol для RVA.

Модули

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

9 Средний Сырой текст лога готовится до захвата блокировки writer TSynLog.LogInternalText теперь обрезает и проверяет UTF-8 до блокировки, затем выбирает прямую запись без escaping при false от HasControlChars и использует escaped output для невалидного UTF-8. Производительность mormot.core.log 5fc4a796+35-29

core: optimized TSynLog.LogInternalText() process

Влияние

Конкурентные сервисы Delphi и FPC проводят меньше времени внутри write lock logger для сырого текста. Семантика валидного вывода сохраняется, а повреждённый UTF-8 по-прежнему проходит через escaping.

Модули

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

10 Средний SSSE3 становится JSON numeric parser по умолчанию на подходящих x86-64 целях GetNumericVariantFromJson теперь при инициализации назначает GetNumericVariantStub на GetNumericVariantSsse3, если в ASMX64NOTPIC build доступен cpuSSSE3. Прежний opt-in FORCE_SSSE3_JSON удалён. Производительность mormot.core.text+1 4d78fdfe+7-11

core: enable GetNumericVariantSsse3() by default

Влияние

Публичные signatures и числовые результаты не меняются, но поддерживаемые backends Delphi Win64 и FPC x86-64 non-PIC автоматически используют SIMD-путь. Другие CPU и PIC builds остаются на Pascal-реализации.

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

Запустите типичные JSON numeric workloads на каждой x86-64 compiler target и сохраните boundary tests для integers, fractions и exponents.

Публичный API

  • GetNumericVariantFromJsonbehaviour-changed — Подходящие x86-64 builds теперь по умолчанию dispatch-ятся в GetNumericVariantSsse3.

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

11 Низкий UTF-8 buffers получают прямую проверку управляющих символов mormot.core.unicode добавляет публичный helper HasControlChars(P, Len), обнаруживающий байты от 0 до 31 и возвращающий false для nil или пустого buffer. Новые возможности mormot.core.unicode 6f1bd299+21-2

core: new HasControlChars() function

Влияние

Существующие приложения не меняются. Код Delphi и FPC может использовать helper, чтобы решить, нужен ли UTF-8 тексту escaping или построчная обработка.

Публичный API

  • HasControlCharsadded — Проверяет диапазон UTF-8 байтов на управляющие символы ASCII.

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

12 Низкий ShortString получает форматированное добавление variants mormot.core.text добавляет публичную процедуру AppendShortVar, форматирующую array of const через TFormatUtf8 и добавляющую результат в пределах ёмкости ShortString. Новые возможности mormot.core.text 7565759e+15-2

core: new AppendShortVar() function

Влияние

Код приложений не затронут, пока не использует helper; Delphi- и FPC-код теперь может добавлять разнородные значения без временной UTF-8 строки.

Публичный API

  • AppendShortVaradded — Форматирует значения array of const прямо в существующий ShortString.

Модули

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

13 Низкий Числовые границы проверяются напрямую по 53 битам Pascal- и x86-64-пути GetNumericVariantFromJson заменяют сравнения с MAX_SAFE_JS_INTEGER сдвигами, напрямую проверяющими выход unsigned-значения за 53 бита, и упрощают guard fast path Clinger. Производительность mormot.core.base.asmx64+1 ba4b5c99+11-12

core: minor GetNumericVariantFromJson() optimization

Влияние

Результаты чисел JSON и публичные signatures не меняются; сборки Delphi и FPC получают лишь более компактную внутреннюю проверку границ на этих путях.

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

14 Низкий Integer variants преобразуются в Double без общего fallback VariantToDouble в mormot.core.base добавляет прямые случаи varInteger и varInt64 перед общим механизмом преобразования Variant для остальных типов. Производительность mormot.core.base 25e283ab+8-4

core: optimized VariantToDouble()

Влияние

Обычные integer variants преобразуются с меньшими накладными расходами в Delphi и FPC. Публичная signature и ожидаемое значение не меняются.

Модули

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

15 Низкий Numeric benchmarks используют стабильный непрерывный ввод BenchmarkNumbers теперь заранее создаёт детерминированные zero-terminated числовые tokens в одном buffer, отдельно измеряет Pascal- и SSSE3-parser и проверяет неизменность исходного buffer. Тесты 7e251513+123-108

tests: rewritten BenchmarkNumbers process

Влияние

На код приложений это не влияет. Тесты получают более воспроизводимые сравнения parser и могут обнаружить случайную запись в read-only JSON input.

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

16 Низкий Медленные core tests могут выполняться параллельно Core test runner помечает дополнительные медленные компоненты TTestCoreBase для параллельного выполнения с опцией multithread, оставляя event test в главном thread. Тесты c772c201+61-47

tests: parallelize TTestCoreBase for /multithread

Влияние

На runtime и код приложений это не влияет. Maintainers могут получить более короткие multithreaded test runs без изменений production units.

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

17 Низкий Logging tests покрывают вложенное создание writer TestLogFileInit адаптирован к per-writer locking и проверяет, что попытка логирования из CreateLogWriter не запускает повторное создание writer и не меняет состояние исключения. Тесты de95ebb6+18-12

tests: fixed TestLogFileInit after huge TSynLog refactoring

Влияние

Прямого влияния на код приложений нет. Regression test защищает собственные реализации logging family от рекурсивной инициализации после lock rewrite.

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

18 Низкий Benchmarks parser сверяют результаты Pascal и SSSE3 BenchmarkNumbers расширяет проверки между GetExtended и GetNumericVariantFromJson, а также между их реализациями Pascal и SSSE3, и формирует более согласованный timing output. Тесты 63edb4c2+26-3

tests: BenchmarkNumbers check values consistency

Влияние

На код приложений это не влияет. Тестам проще обнаруживать regression numeric parser между Delphi/FPC и SIMD/non-SIMD путями.

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

19 Низкий После переработки логов убраны compiler warnings Logging unit удаляет лишнее локальное присваивание nil, а тесты помещают строковые literals в типизированные переменные перед overload-вызовами, чтобы убрать compiler warnings. Обслуживание mormot.core.log d4bbc57f+8-6

core: fixed some Delphi compiler warnings

Влияние

На код приложений и runtime Delphi или FPC это не влияет; изменение лишь сохраняет обновлённый код и tests без warnings.

Модули

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