mORMot2 DailyDaily read of upstream commits

Native futex for TOSLightLock and ICU deadlock fix

Today's commits bring a major evolution to the mORMot 2 core synchronization primitives. TOSLightLock now leverages native futex on Linux and WaitOnAddress on Windows 8+, promising significant contention performance gains. In addition, an ICU library deadlock was fixed and the async networking polling got a boundary check.

TL;DR

  • TOSLightLock uses native futex on Linux and WaitOnAddress on Windows 8+.
  • TIcuLibrary fixes a deadlock during shared converter creation.
  • TAsyncConnections fixes a potential out-of-range bug in thread polling.
  • Adaptive spin-wait mechanisms are extracted to the core base unit.

Upgrade advice

Teams pushing heavy multithreaded workloads on Linux or Windows 8+ should benefit from the TOSLightLock upgrade. The ICU deadlock fix is recommended for applications dealing with internationalization.

Build2.4.16618 → 2.4.16628
Commits10
Lines+404 -312
Read2 min

10 of 10 entries · 10 commits upstream

Stories
# Entry Category Units
1 High Fixed a deadlock when loading ICU converters Corrects the unlock logic in TIcuLibrary.SharedUcnvGet(). The previous code mistakenly released a converter-specific lock instead of the main library lock after populating the converter cache. Fixes mormot.core.os 87dbb9fc+3-3

core: fix deadlock in TIcuLibrary

Impact

Prevents deadlocks when multiple threads request text converters from the ICU library simultaneously.

Arnaud · 21:44 UTC · view the commit on GitHub →

2 High TOSLightLock uses WaitOnAddress on Windows 8+ Upgrades TOSLightLock on Windows to use the WaitOnAddress and WakeByAddressSingle API (introduced in Windows 8), moving away from Slim Reader/Writer (SRW) locks. Performance mormot.core.os+3 17a26fa9+106-124

core: TOSLightLock now uses WaitOnAddress/WakeByAddressSingle on Win8+

Impact

Faster lock acquisition on Windows 8 and newer, especially under high contention, by avoiding SRW lock overhead.

Arnaud Bouchez · 19:39 UTC · view the commit on GitHub →

3 High TOSLightLock upgraded to use native futex on Linux Replaces the underlying Linux implementation of TOSLightLock with a direct 32-bit futex syscall instead of a TRTLCriticalSection. It falls back to spin-and-wait on older kernels. Performance mormot.core.os 64d1d6db+106-23

core: TOsLightLock uses a futex on Linux

Impact

Significantly improves requests-per-second and threading stability on Linux backends. It is now as fast as TLightLock on the uncontended fast path.

Arnaud Bouchez · 17:29 UTC · view the commit on GitHub →

4 Medium Fixed TOSLightLock fallback on Android and Delphi POSIX Restores the TRTLCriticalSection fallback for TOSLightLock on platforms without native futex or pthread_mutex support, like Android and Delphi POSIX. The previous commits inadvertently broke this fallback. Fixes mormot.core.os+1 cabcd0ec+41-40

core: another pass of TOsLightLock

Impact

Applications running on Android or compiled with Delphi for POSIX will compile and run correctly again. No impact on Windows or FPC Linux.

Arnaud · 22:35 UTC · view the commit on GitHub →

5 Medium Fixed late loading of Windows 8 synchronization API Moves the runtime loading of API-MS-Win-Core-Synch-l1-2-0.dll to happen after the OS version has been properly populated into OSVersion32. Fixes mormot.core.os a426a84d+14-14

core: fixed API-MS-Win-Core-Synch-l1-2-0.dll loading

Impact

Resolves a bug where the new futex API was not initialized correctly on modern Windows versions because the version check failed at initialization time.

Arnaud Bouchez · 19:41 UTC · view the commit on GitHub →

6 Medium Fixed potential bounds error in asynchronous connections Updates TAsyncConnections.ThreadPollingWakeupLocked to check for <= 0 instead of exactly 0 when inspecting spare events. Fixes mormot.net.async 440d9e9d+3-3

net: fixed potential out of range in TAsyncConnections.ThreadPollingWakeupLocked;

Impact

Prevents potential out-of-range errors or negative event counters from causing issues in the async polling thread loop.

Arnaud Bouchez · 17:33 UTC · view the commit on GitHub →

7 Low Published a raw DoPause procedure Extracts the CPU pause logic (the pause opcode on x86, yield on ARM) into a globally available DoPause procedure in mormot.core.base. New features mormot.core.base 4cd5cff1+17-2

core: let publish a raw DoPause procedure

Impact

Developers can now explicitly call DoPause in custom spin loops to reduce CPU power consumption and cache traffic.

Public API

  • DoPauseadded — A cross-platform procedure that invokes CPU pause or yield instructions.

Arnaud Bouchez · 17:28 UTC · view the commit on GitHub →

8 Low Moved NextSpin to mormot.core.base Moves the adaptive spin-wait function NextSpin() and its associated SPIN_FACTOR and SPIN_COUNT constants from mormot.core.os into the lower-level mormot.core.base unit. Under the hood mormot.core.base+1 268d8600+91-85

core: moved NextSpin() to mormot.core.base

Impact

No direct impact on application code. It allows simpler units without OS dependencies to use the adaptive spin logic.

Arnaud Bouchez · 17:27 UTC · view the commit on GitHub →

9 Low Refactored TIcuLibrary internal locking fields Changes the internal locking fields in TIcuLibrary from PtrUInt to cardinal to match the expected types for TLightLock primitives. Under the hood mormot.core.os 1f1fe8df+17-12

core: fixed TIcuLibrary locking code

Impact

No impact on application code, internal refactoring only.

Arnaud Bouchez · 19:45 UTC · view the commit on GitHub →

10 Low Updated TOSLightLock usage comments Updates code comments referencing TOSLightLock across several units to reflect the new Windows 8+ and Linux futex behaviors. Housekeeping mormot.core.mvc+3 043d364d+6-6

core: fixed TOSLightLock usage comments in code

Impact

No impact on application code, internal refactoring only.

Arnaud Bouchez · 17:33 UTC · view the commit on GitHub →

Upstream activity commits per day · last 60 days
Commits977
Active days44/60
Busiest2026-09-30
Peak60
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