Требует действийможет затронуть работающую систему
Исправления блокировок и процессов делают 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. Не останавливайтесь на промежуточной ревизии: последующие коммиты исправляют компиляцию и совместимость исходников, нарушенные ранее в той же серии.
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 больше не игнорируются. Семантика существенно исправлена без изменения публичной сигнатуры.
Рекомендуется обновиться
Обновите POSIX-сервисы с RunRedirect и проверьте успешный выход, EOF, тайм-аут, отмену callback, собственные env/PATH, рабочий каталог и завершение потомков.
Публичный API
RunRedirectbehaviour-changed — POSIX-исполнение теперь использует fork/execve, учитывает существующие параметры, возвращает фактический код и завершает группы процессов.
Модули
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 без конкуренции.
Рекомендуется обновиться
Пересоберите сервисы с высокой конкуренцией на build 2.4.16652 или новее и повторите тесты блокировок под нагрузкой.
Публичный API
TOSLightLock.UnLockbehaviour-changed — Разблокировка теперь атомарно меняет состояние перед решением о пробуждении ожидающего потока.
Модули
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 миграция не нужна.
Рекомендуется обновиться
Пропустите промежуточные build и компилируйте Delphi-приложения с 2.4.16652; если уже использовали build 16630, найдите TNormalizeDN.
Публичный API
TNormalizeDNsadded — Тип множества для фильтрации DN теперь явно называется TNormalizeDNs.DNToCN / DNsToCN / NormalizeDNsignature-changed — Параметр extend использует TNormalizeDNs вместо временного set-типа TNormalizeDN.
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.
Рекомендуется обновиться
Перед сборкой целей BSD или использованием других изменений этого выпуска перейдите на эту ревизию.
Публичный API
TSynEvent.WaitForSafesignature-changed — DisableSafe снова имеет значение false по умолчанию после того, как в build 16645 стал обязательным.
Модули
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. Приложения, зависевшие от прежних ошибочных метаданных или преобразований, следует протестировать.
Рекомендуется обновиться
Повторно протестируйте столбцы DECIMAL, NUMERIC и FLOAT со всеми ODBC-драйверами, используемыми в production.
Модули
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 и используют неблокирующую проверку события.
Модули
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 — Две перегрузки получают стек текущего потока как текст без исключения.
Модули
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 блокировки с приоритетом читателей и поддержкой ОС.
Модули
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 по умолчанию.
Модули
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-битного значения.
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 — Реализация стала событийной и поддерживает один ожидающий поток одновременно.
Модули
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.
Модули
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 и возвращает его индекс.
Модули
14
Низкий
Опрос сокетов Windows использует быстрый путь ожидающих событий
TPollSockets.PollForPendingEvents больше не ограничивает быстрый путь fPendingSafe.TryLock платформой POSIX. Windows теперь также пробует неблокирующую блокировку и переносит события без медленного пути при отсутствии конкуренции.
Производительность
mormot.core.os+1
79dd6c23+2-5
core: some TPollSockets optimization on Windows
Влияние
Серверы Windows с частыми изменениями подписок сокетов могут тратить меньше времени на объединение ожидающих событий. Изменение внутреннее и не требует правок приложений.
15
Низкий
Ожидающие события сокетов переходят на более дешевую блокировку при низкой конкуренции
TPollSockets.fPendingSafe заменен с TOSLightLock на TLightLock. В коммите указано, что конкуренция за ожидающие события мала, а обязательный CAS в TOSLightLock.UnLock делает здесь простую блокировку быстрее.
Производительность
mormot.net.sock
60cb8bc7+3-3
net: let TPollSockets use TLightLock for the Pending envents
Влияние
Опрос сокетов сохраняет исправление гонки, избегая дополнительной стоимости разблокировки без конкуренции для этой внутренней очереди. Изменения приложений не требуются.
Модули
16
Низкий
TRWLightLock получает пустой финализатор для взаимозаменяемости блокировок
TRWLightLock теперь предоставляет пустой метод Done, совпадающий с жизненным циклом TOSLock и родственных примитивов. В документации также явно указан приоритет писателя.
Компилятор и платформы
mormot.core.os
d5844b6a+12-2
core: new TRWLightLock.Done void method
Влияние
Обобщенный код может вызывать Init и Done для обоих типов блокировок без условной очистки. Done ничего не делает, поэтому поведение не изменено.
Публичный API
TRWLightLock.Doneadded — Пустой метод жизненного цикла, совместимый с другими record-блокировками.
Модули
17
Низкий
Реестры классов базы данных и REST используют массивы указателей
Внутренние реестры классов TSqlDBConnectionProperties и TRest теперь вызывают PtrArrayAddOnce вместо хранения TClass через приведение к TObject. Имя и форматирование вспомогательной ODBC-функции нормализованы без изменения области видимости.
Внутреннее устройство
mormot.db.sql+2
9fbd6c32+13-13
all: minor code refactoring
Влияние
Функциональных изменений и миграции приложений нет. Представление реестра теперь соответствует фактически хранимым указателям.
18
Низкий
Тест туннельного ретранслятора удаляет неиспользуемую переменную генератора
TNetworkProtocols.TunnelRelay больше не объявляет и не инициализирует неиспользуемую переменную PLecuyer. Проверки, поток управления и модули фреймворка не изменены.
Тесты
b1f1302d+2-4
tests: minor unused variable cleanup
Влияние
На код приложений и поведение во время выполнения влияния нет; изменение лишь убирает предупреждение компилятора в тестах.
19
Низкий
Текстовый модуль проверяет, что форматтер помещается в стековый буфер
Инициализация mormot.core.text добавляет Assert, что SizeOf(TFormatUtf8) не превышает SizeOf(TTextWriterStackBuffer). Текущие ожидаемые размеры — 4 КБ и 8 КБ.
Тесты
mormot.core.text
e171e5aa+3-2
core: added paranoid Assert() about TFormatUtf8
Влияние
В обычных сборках поведение не меняется. Сборки с assertions завершатся раньше, если будущий рост форматтера нарушит предположение о стековом буфере.
Модули
20
Низкий
Документированы приоритет блокировок и поведение ожидающих сокетов
Комментарии теперь отличают приоритет читателей TOSRWLightLock от модели Windows SRW и точнее описывают переопределения ожидающих событий TPollSockets. EnsurePending явно именует начальный индекс без изменения поиска.
Документация
mormot.core.os+1
181c2d7b+13-9
core: mostly comments/documentation precisions
Влияние
Влияния на выполнение и исходный код нет. Документация яснее описывает выбор блокировок и обязанности подклассов сокетов.
21
Низкий
Документация TUri подтверждает поддержку имени сервера без пути
Комментарий TUri.From теперь явно указывает имя сервера без схемы и пути как ввод, интерпретируемый по HTTP. Код парсера не изменен.
Документация
mormot.net.sock
ff62d966+4-4
net: TUri.From() documentation precision
Влияние
Изменений выполнения нет. Разработчики могут использовать уже существующий разбор имени хоста с более ясной документацией.