Требует действийможет затронуть работающую системуИсходный payload содержит два merge commits и 19 non-merge commits; ниже покрыт каждый non-merge commit. В нём нет маркеров superseded_by и уведомлений о deprecation. Исключаемое окно напрямую следует из более позднего исправления build 16942 в этой последовательности.
Блокировки на каждый 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 и без него.
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.
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.
Рекомендуется обновиться
Переходите на build 2.4.16942 или новее и до production проверьте сбой создания файла, ротацию и собственные callbacks CreateLogWriter.
Модули
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-семантика логов не меняются.
Рекомендуется обновиться
Не используйте lock rewrite без этого исправления совместимости; пересоберите все поддерживаемые версии Delphi.
Публичный API
TSynLogFamilyDynArrayadded — Именованный dynamic-array type для реестра семейств logger.
Модули
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.
Модули
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 не меняется.
Рекомендуется обновиться
Обновите log-viewer, открывающий произвольные текстовые файлы, и проверьте поиск вперёд и назад на plain-text fixture.
Публичный API
TSynLogFile.LineContainsbehaviour-changed — Обычные текстовые файлы теперь используют унаследованную реализацию поиска.
Модули
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 не меняются.
Рекомендуется обновиться
Обновитесь, если elapsed time логов используется для диагностики запуска, и проверьте timezone header и первую записанную длительность.
Модули
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-цифры младшего байта вместо чтения за границей таблицы.
Рекомендуется обновиться
Обновитесь, если AppendShortByteHex может получать немаскированные идентификаторы или offsets шире байта, и добавьте regression case больше 255.
Публичный API
AppendShortByteHexbehaviour-changed — Значения шире байта теперь безопасно сводятся к младшему байту.
Модули
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.
Модули
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.
Модули
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.
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.
Модули
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.
Модули
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 получают лишь более компактную внутреннюю проверку границ на этих путях.
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 и ожидаемое значение не меняются.
Модули
15
Низкий
Numeric benchmarks используют стабильный непрерывный ввод
BenchmarkNumbers теперь заранее создаёт детерминированные zero-terminated числовые tokens в одном buffer, отдельно измеряет Pascal- и SSSE3-parser и проверяет неизменность исходного buffer.
Тесты
7e251513+123-108
tests: rewritten BenchmarkNumbers process
Влияние
На код приложений это не влияет. Тесты получают более воспроизводимые сравнения parser и могут обнаружить случайную запись в read-only JSON input.
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.
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.
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 путями.
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.