{
  "site": "mORMot2 Daily",
  "upstream": "synopse/mORMot2",
  "generated_at": "2026-08-29T06:58:21Z",
  "editions": [
    {
      "date": "2026-08-29",
      "title": "Native futex for TOSLightLock and ICU deadlock fix",
      "intro": "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.",
      "tldr": [
        "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."
      ],
      "risk_level": "worth-a-look",
      "reviewed": true,
      "version": {
        "after": "2.4.16628",
        "before": "2.4.16618"
      },
      "totals": {
        "commits": 10,
        "additions": 404,
        "deletions": 312
      },
      "entries": [
        {
          "sha": "87dbb9fc40ceb7dc568467cd2b688c662892e830",
          "headline": "Fixed a deadlock when loading ICU converters",
          "category": "fix",
          "severity": "high",
          "action": "upgrade-recommended",
          "units": [
            "mormot.core.os"
          ],
          "impact": "Prevents deadlocks when multiple threads request text converters from the ICU library simultaneously.",
          "what_changed": "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.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/87dbb9fc40ceb7dc568467cd2b688c662892e830"
        },
        {
          "sha": "17a26fa92c4b0ed7b97fdbd0764d6118d713d469",
          "headline": "TOSLightLock uses WaitOnAddress on Windows 8+",
          "category": "performance",
          "severity": "high",
          "action": "none",
          "units": [
            "mormot.core.os",
            "mormot.core.mvc",
            "mormot.db.proxy",
            "mormot.orm.base"
          ],
          "impact": "Faster lock acquisition on Windows 8 and newer, especially under high contention, by avoiding SRW lock overhead.",
          "what_changed": "Upgrades TOSLightLock on Windows to use the WaitOnAddress and WakeByAddressSingle API (introduced in Windows 8), moving away from Slim Reader/Writer (SRW) locks.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/17a26fa92c4b0ed7b97fdbd0764d6118d713d469"
        },
        {
          "sha": "64d1d6dbd21fd95f46eb8cd2a61a5d8868d0eda0",
          "headline": "TOSLightLock upgraded to use native futex on Linux",
          "category": "performance",
          "severity": "high",
          "action": "none",
          "units": [
            "mormot.core.os"
          ],
          "impact": "Significantly improves requests-per-second and threading stability on Linux backends. It is now as fast as TLightLock on the uncontended fast path.",
          "what_changed": "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.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/64d1d6dbd21fd95f46eb8cd2a61a5d8868d0eda0"
        },
        {
          "sha": "cabcd0ec77baf48dc3404c77ef5f1b0524c921f7",
          "headline": "Fixed TOSLightLock fallback on Android and Delphi POSIX",
          "category": "fix",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.core.os",
            "mormot.net.sock"
          ],
          "impact": "Applications running on Android or compiled with Delphi for POSIX will compile and run correctly again. No impact on Windows or FPC Linux.",
          "what_changed": "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.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/cabcd0ec77baf48dc3404c77ef5f1b0524c921f7"
        },
        {
          "sha": "a426a84d6fc33528368334fcd9a04a2e62d5e1d7",
          "headline": "Fixed late loading of Windows 8 synchronization API",
          "category": "fix",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.core.os"
          ],
          "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.",
          "what_changed": "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.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/a426a84d6fc33528368334fcd9a04a2e62d5e1d7"
        },
        {
          "sha": "440d9e9d39c7d461ef56255b93b9a6d30357bd73",
          "headline": "Fixed potential bounds error in asynchronous connections",
          "category": "fix",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.net.async"
          ],
          "impact": "Prevents potential out-of-range errors or negative event counters from causing issues in the async polling thread loop.",
          "what_changed": "Updates TAsyncConnections.ThreadPollingWakeupLocked to check for <= 0 instead of exactly 0 when inspecting spare events.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/440d9e9d39c7d461ef56255b93b9a6d30357bd73"
        },
        {
          "sha": "4cd5cff17480f1ed06c37de0481129e932c53c8a",
          "headline": "Published a raw DoPause procedure",
          "category": "feature",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.base"
          ],
          "impact": "Developers can now explicitly call DoPause in custom spin loops to reduce CPU power consumption and cache traffic.",
          "what_changed": "Extracts the CPU pause logic (the pause opcode on x86, yield on ARM) into a globally available DoPause procedure in mormot.core.base.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/4cd5cff17480f1ed06c37de0481129e932c53c8a"
        },
        {
          "sha": "268d86007dd1f9791a64d1ae6563dccd3880e2ff",
          "headline": "Moved NextSpin to mormot.core.base",
          "category": "refactor",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.base",
            "mormot.core.os"
          ],
          "impact": "No direct impact on application code. It allows simpler units without OS dependencies to use the adaptive spin logic.",
          "what_changed": "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.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/268d86007dd1f9791a64d1ae6563dccd3880e2ff"
        },
        {
          "sha": "1f1fe8dfe9d2857b5f4e7be1d69192ace90ce667",
          "headline": "Refactored TIcuLibrary internal locking fields",
          "category": "refactor",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.os"
          ],
          "impact": "No impact on application code, internal refactoring only.",
          "what_changed": "Changes the internal locking fields in TIcuLibrary from PtrUInt to cardinal to match the expected types for TLightLock primitives.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/1f1fe8dfe9d2857b5f4e7be1d69192ace90ce667"
        },
        {
          "sha": "043d364d9fa06d4b23880afd9b20d8499e4aa99c",
          "headline": "Updated TOSLightLock usage comments",
          "category": "chore",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.mvc",
            "mormot.db.proxy",
            "mormot.net.sock",
            "mormot.orm.base"
          ],
          "impact": "No impact on application code, internal refactoring only.",
          "what_changed": "Updates code comments referencing TOSLightLock across several units to reflect the new Windows 8+ and Linux futex behaviors.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/043d364d9fa06d4b23880afd9b20d8499e4aa99c"
        }
      ]
    },
    {
      "date": "2026-08-28",
      "title": "Thread wake-up goes lockless, and two API moves worth grepping for",
      "intro": "Today is mostly about the asynchronous server core. The thread-wakeup path used by every async HTTP, WebSocket and TFTP server drops its lock in favour of two atomic counters, which should show up as less contention on busy multi-core boxes. Around that, two smaller changes deserve a grep through your own code: TOrmTable.GetAsVariant and ToDocVariant changed their parameter from out to var, and the mORMot 1 compatibility function Lecuyer moved to another unit. Everything else is internal cleanup.",
      "tldr": [
        "Async server thread wake-up is now lockless: two CAS counters replace the TLightLock that guarded acoThreadSmooting.",
        "TOrmTable.GetAsVariant and TOrmTable.ToDocVariant now take var instead of out — the destination variant is no longer cleared for you.",
        "The legacy Lecuyer function moved from mormot.core.base to mormot.crypt.core and now returns the shared ThreadRandom generator.",
        "TLoggedThread gained an ExecuteDone property, standing in for the RTL Finished property on older compilers.",
        "The TFTP server compiles again on Delphi 7 and 2007 after last week's worker-lifetime fix."
      ],
      "risk_level": "worth-a-look",
      "reviewed": true,
      "version": {
        "after": "2.4.16618",
        "before": "2.4.16604"
      },
      "totals": {
        "commits": 11,
        "additions": 467,
        "deletions": 280
      },
      "entries": [
        {
          "sha": "73cb954316383ae82ad4fef47d78c91be3de29b0",
          "headline": "Async server thread wake-up drops its lock for atomic counters",
          "category": "performance",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.core.base",
            "mormot.net.async"
          ],
          "impact": "No API change for application code. On a busy async HTTP or WebSocket server with acoThreadSmooting enabled, threads no longer serialise on a lock to decide who wakes up, so wake-up latency should flatten out under contention. The effect grows with core count and connection churn; a lightly loaded server will not notice.",
          "what_changed": "mormot.core.base gains LockedGet32(Target: PInteger), an atomic read-and-reset built on LockedExc32. mormot.net.async then replaces the fThreadPollingWakeupSafe TLightLock with two cardinal CAS counters, fWakeupOne and fWakeupEvents, and reads them through LockedGet32 inside ThreadPollingWakeupOne and ThreadPollingWakeupEvents. About 250 lines of the wake-up path were reshuffled around those counters.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/73cb954316383ae82ad4fef47d78c91be3de29b0"
        },
        {
          "sha": "5530a593a291c5a6d78d4b7b769e471d0ef08324",
          "headline": "TOrmTable variant getters now take var instead of out",
          "category": "performance",
          "severity": "medium",
          "action": "review",
          "units": [
            "mormot.orm.base"
          ],
          "impact": "Faster row-to-variant conversion on large result sets, but the parameter change is a real one: with 'out' the compiler cleared your variable before the call, with 'var' it does not. Code that passes an uninitialised local variant, or that reuses one across calls expecting it to be reset, can now see stale content or a leak. Recompiling is enough for the signature change itself; the initialisation habit is what to check.",
          "what_changed": "TOrmTableAbstract.GetAsVariant and TOrmTableAbstract.ToDocVariant changed their destination parameter from 'out value: variant' to 'var value: variant', and the time-field conversion moved into a new ValueVarTimeAsText helper that fills the variant in place instead of building an intermediate value. The aim is to avoid clearing and re-allocating a variant per row when walking a result set.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/5530a593a291c5a6d78d4b7b769e471d0ef08324"
        },
        {
          "sha": "0acf8522b4e07dda8b814dc15a2bdd7b750e409b",
          "headline": "TFTP server builds again on Delphi 7 and 2007",
          "category": "compat",
          "severity": "medium",
          "action": "upgrade-recommended",
          "units": [
            "mormot.net.tftp.server"
          ],
          "impact": "If you build the TFTP server on an old Delphi, it compiles again. Everyone else gets the same behaviour through a different property. This is the compatibility follow-up to the worker-lifetime fix merged earlier today.",
          "what_changed": "The TTftpConnectionThread.HasFinished helper introduced by pull request #556 relied on the RTL Finished property, which does not exist on Delphi 7 and 2007. It was removed and replaced by the new TLoggedThread.ExecuteDone property, and the shutdown loop that terminated each worker was simplified at the same time.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/0acf8522b4e07dda8b814dc15a2bdd7b750e409b"
        },
        {
          "sha": "fdb5f3783da4e8aaf0774ce0d934068522406856",
          "headline": "The legacy Lecuyer function moved out of mormot.core.base",
          "category": "compat",
          "severity": "medium",
          "action": "review",
          "units": [
            "mormot.core.base",
            "mormot.crypt.core"
          ],
          "impact": "Code still calling Lecuyer — typically old mORMot 1 code — now needs mormot.crypt.core in its uses clause instead of relying on mormot.core.base, and shares the ThreadRandom generator rather than its own threadvar. If you already build with PUREMORMOT2 the symbol never existed for you and nothing changes.",
          "what_changed": "The mORMot 1 compatibility function Lecuyer and its _Lecuyer threadvar were removed from mormot.core.base and re-declared in mormot.crypt.core, where the function now simply returns ThreadRandom. As before, the whole thing is compiled out under PUREMORMOT2. This unblocks compilation in PUREMORMOT2 mode, which the previous refactoring had broken.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/fdb5f3783da4e8aaf0774ce0d934068522406856"
        },
        {
          "sha": "a4bad08e43d9adf79d6470b19c3850ba3fc05a54",
          "headline": "New ShortStringToVariant helper for UTF-8 short strings",
          "category": "feature",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.base"
          ],
          "impact": "Additive convenience, used internally by today's ORM variant work. Nothing to change in existing code; it saves a manual conversion if you convert ShortStrings to variants yourself.",
          "what_changed": "mormot.core.base adds ShortStringToVariant(const Txt: ShortString; var Value: variant), an inlined wrapper over RawUtf8ToVariant that produces a varString RawUtf8 variant from a UTF-8 encoded ShortString.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/a4bad08e43d9adf79d6470b19c3850ba3fc05a54"
        },
        {
          "sha": "e42d4a3c6bb80068b2dbd73a6a84f984711296ee",
          "headline": "TLoggedThread can now tell you its Execute has finished",
          "category": "feature",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.threads"
          ],
          "impact": "Useful when you shut a pool of worker threads down and need to know which ones are really out of Execute, on compilers whose RTL has no Finished property. Purely additive: existing code is unaffected.",
          "what_changed": "mormot.core.threads adds a private fExecuteDone flag, set once the thread body returns, exposed as the read-only ExecuteDone property on TLoggedThread. The comment says it mimics the Finished property of newer Delphi and FPC runtimes.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/e42d4a3c6bb80068b2dbd73a6a84f984711296ee"
        },
        {
          "sha": "4c702f55d7187ea5838f09bfde49e23e0f48d631",
          "headline": "Wake-up rewrite finished, with inlining made conditional again",
          "category": "performance",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.net.async"
          ],
          "impact": "No behaviour change for application code. The conditional inline matters only if you build with a compiler that has no inlining support, where the previous commit would not have compiled.",
          "what_changed": "The finishing commit of the lockless wake-up work. ThreadPollingWakeupOne keeps its inline directive but behind {$ifdef HASINLINE}, ThreadPollingWakeupEvents loses inlining altogether, and the comment describing when a thread is woken was rewritten to mention slow REST processing next to accept() on an idle server.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/4c702f55d7187ea5838f09bfde49e23e0f48d631"
        },
        {
          "sha": "7813f0482b7e5cc1e678b841fb2636538110790a",
          "headline": "ORM temp variants switch to TSynVarData and standard VarClear",
          "category": "refactor",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.orm.base"
          ],
          "impact": "No impact on application code: these are local temporaries inside the ORM. Worth knowing only if you maintain a patch against these units, where it will conflict.",
          "what_changed": "Several ORM helpers that used a raw TVarData scratch value now use TSynVarData, set VType directly instead of poking through PCardinal, and release it with VarClear(variant(value)) rather than calling VarClearProc. Same code paths, clearer and less pointer-cast-heavy.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/7813f0482b7e5cc1e678b841fb2636538110790a"
        },
        {
          "sha": "ca302d17401b19ed28122209d9c0b55af72d0882",
          "headline": "TFTP server test coverage extended around the #556 fix",
          "category": "tests",
          "severity": "low",
          "action": "none",
          "units": [],
          "impact": "No impact on application code. It makes the regression suite more likely to catch a future break in TFTP worker shutdown.",
          "what_changed": "test.net.proto exercises the TFTP server more thoroughly after the worker-lifetime pull request, checking connection shutdown rather than only the happy path.",
          "confidence": "confirmed",
          "reviewed": true,
          "url": "https://github.com/synopse/mORMot2/commit/ca302d17401b19ed28122209d9c0b55af72d0882"
        }
      ]
    },
    {
      "date": "2026-08-27",
      "title": "26 commits landed upstream",
      "intro": "This edition has not been reviewed yet: the entries below are classified automatically from commit messages and diffs, without an editorial pass. Treat the categories as hints and follow the commit links for the truth.",
      "tldr": [],
      "risk_level": "",
      "reviewed": false,
      "version": {
        "after": "2.4.16604",
        "before": "2.4.16579"
      },
      "totals": {
        "commits": 26,
        "additions": 839,
        "deletions": 830
      },
      "entries": [
        {
          "sha": "7dd5c8c6d9bdd93d9ea4c8fced099eb7524f0ad2",
          "headline": "core: fixed TRWLightLock.WriteLock - as reported by #557 - this was an awful race condition, which would corrupt the logic and maybe the memory when updating data",
          "category": "fix",
          "severity": "critical",
          "action": "none",
          "units": [
            "mormot.core.os"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/7dd5c8c6d9bdd93d9ea4c8fced099eb7524f0ad2"
        },
        {
          "sha": "2ae4fa8253deeac7231f5a41a53e7786f9144d62",
          "headline": "crypt: moved RandomIdentifier/RandomUtf8 from mormot.core.text - it is safer to use ThreadRandom e.g. durint the regression tests",
          "category": "fix",
          "severity": "high",
          "action": "none",
          "units": [
            "mormot.core.text",
            "mormot.crypt.core"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/2ae4fa8253deeac7231f5a41a53e7786f9144d62"
        },
        {
          "sha": "00693ed14131e602ce8699ecb245c17a2f82d36b",
          "headline": "soa: fixed awful missing ReadOnlyUnLock call - during TServiceFactoryServer.RetrieveInstance - would appear on FPC Linux but not on FPC Windows because of HASFASTTRYFINALLY",
          "category": "fix",
          "severity": "high",
          "action": "none",
          "units": [
            "mormot.rest.server",
            "mormot.soa.server"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/00693ed14131e602ce8699ecb245c17a2f82d36b"
        },
        {
          "sha": "1d68cdff28ccaeea2a5a466a18c71c51703b2755",
          "headline": "orm: fixed ValueVarToVariant NULL replacement leak",
          "category": "fix",
          "severity": "high",
          "action": "none",
          "units": [
            "mormot.orm.base"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/1d68cdff28ccaeea2a5a466a18c71c51703b2755"
        },
        {
          "sha": "68c567e395fd46a12f870b36ba12cfb2eba94ffa",
          "headline": "core: fixed Assert() at startup on Delphi",
          "category": "fix",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.core.datetime",
            "mormot.core.text"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/68c567e395fd46a12f870b36ba12cfb2eba94ffa"
        },
        {
          "sha": "41d58ff115f70f84510fb65b06869cddb4b86b99",
          "headline": "lib: fixed SSPI exception message",
          "category": "fix",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.lib.sspi"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/41d58ff115f70f84510fb65b06869cddb4b86b99"
        },
        {
          "sha": "c55676af8a56c7b3ddcb64d0d5e1bbb94a2aa52b",
          "headline": "crypt: Non Cryptographic Random Generators for Testing or IV Filling - via a new ThreadRandom function in mormot.crypt.core - initialized not from XorEntropy() but from stronger Random128/RandomLecuyer",
          "category": "feature",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.crypt.core"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/c55676af8a56c7b3ddcb64d0d5e1bbb94a2aa52b"
        },
        {
          "sha": "3f2450f6aa0afafc820fb114c68a765c2c1f8d6e",
          "headline": "tests: rewritten all TLecuyer usage - use the new RandomThread instances - no need to propagate local transient instances any more",
          "category": "feature",
          "severity": "medium",
          "action": "none",
          "units": [],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/3f2450f6aa0afafc820fb114c68a765c2c1f8d6e"
        },
        {
          "sha": "18ce15f9fb6af81be7f8a5638385d36bc1bd9ff4",
          "headline": "net: new NetRandom32 function - lighter than plain shared Random32 on thread contention (non blocking sequence) - used e.g. for DHCP XID or WebSockets masking",
          "category": "feature",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.net.dhcp",
            "mormot.net.dns",
            "mormot.net.sock",
            "mormot.net.ws.core"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/18ce15f9fb6af81be7f8a5638385d36bc1bd9ff4"
        },
        {
          "sha": "e464080a7e20f2082a00cacbad752e3bde7cbd43",
          "headline": "crypt: moved RandomByteString() from mormot.core.os to mormot.crypt.core - to use the new ThreadRandom function",
          "category": "feature",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.core.os",
            "mormot.crypt.core"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/e464080a7e20f2082a00cacbad752e3bde7cbd43"
        },
        {
          "sha": "1a1c6698842ef530cbd801f3816adbe8ad54bf97",
          "headline": "core: new RawGlobalTime() OS call with no cache",
          "category": "feature",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.core.datetime"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/1a1c6698842ef530cbd801f3816adbe8ad54bf97"
        },
        {
          "sha": "43b9183553ef86fd03dc2dba207d8fef860719de",
          "headline": "core: new Random128(var Value: RawByteString) overload",
          "category": "feature",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.crypt.core",
            "mormot.crypt.ecc",
            "mormot.crypt.secure"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/43b9183553ef86fd03dc2dba207d8fef860719de"
        },
        {
          "sha": "3e4d55fdb3d3a8406623487629076a6e12be0200",
          "headline": "crypt: new IsIdentifierGuid() function",
          "category": "feature",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.crypt.core"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/3e4d55fdb3d3a8406623487629076a6e12be0200"
        },
        {
          "sha": "f8774990940f107dccf0aa649c219b011d12addb",
          "headline": "core: rewritten FromGlobalTime() function - to use the new RawGlobalTime() OS wrapper - less contention using a RW lock - CAS clocktix acquisition to avoid syscalls",
          "category": "performance",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.core.datetime",
            "mormot.core.log"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/f8774990940f107dccf0aa649c219b011d12addb"
        },
        {
          "sha": "3404e4ebd8741fe04d53da1c879d4271aba2a280",
          "headline": "net: optimized TWebSocketFrameList.Pop",
          "category": "performance",
          "severity": "medium",
          "action": "none",
          "units": [
            "mormot.net.ws.core"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/3404e4ebd8741fe04d53da1c879d4271aba2a280"
        },
        {
          "sha": "219d970da4181c48e9dc1f0705e292c3f3309365",
          "headline": "core: removed all buggy/misleading/invalid RCU*() functions",
          "category": "fix",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.base"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/219d970da4181c48e9dc1f0705e292c3f3309365"
        },
        {
          "sha": "4c9333a2f9f5c26e875edc8f384eaaa6280e9970",
          "headline": "core: on Linux, get the env string with the aux vectors - no need to browse the env several times",
          "category": "compat",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.os.posix"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/4c9333a2f9f5c26e875edc8f384eaaa6280e9970"
        },
        {
          "sha": "7c87152d2bebc311fb8b30bd8fe96dc5692f49fa",
          "headline": "core: moved RandomGuid() to mormot.crypt.core - to use stronger and less blocking Random128() generator",
          "category": "refactor",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.base",
            "mormot.core.fpcx64mm",
            "mormot.core.mustache",
            "mormot.core.os",
            "mormot.crypt.core"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/7c87152d2bebc311fb8b30bd8fe96dc5692f49fa"
        },
        {
          "sha": "d2de3e523641cf5b3b996579f9868151a9cee507",
          "headline": "core: moved TSynTestCase.RandomTextParagraph - into mormot.crypt.core unit",
          "category": "refactor",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.test"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/d2de3e523641cf5b3b996579f9868151a9cee507"
        },
        {
          "sha": "890f8314ed7fc5c9e7c1b1af6912d6629f8c20c6",
          "headline": "all: refactoring since TLightLock is now 32-bit",
          "category": "refactor",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.os",
            "mormot.core.perf",
            "mormot.core.rtti",
            "mormot.core.threads",
            "mormot.lib.zstd",
            "mormot.net.dhcp",
            "mormot.net.dns",
            "mormot.net.http",
            "mormot.net.server",
            "mormot.net.sock",
            "mormot.net.tunnel",
            "mormot.net.ws.core",
            "mormot.orm.rest",
            "mormot.rest.core"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/890f8314ed7fc5c9e7c1b1af6912d6629f8c20c6"
        },
        {
          "sha": "90df67e41ca873499c2a2116bd9303a5f4700159",
          "headline": "net: rewritten function NetRandom32 - to use crc32c HW opcode for 32-bit distribution - still atomic, and exactly 2^32 wide",
          "category": "refactor",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.net.dns",
            "mormot.net.http",
            "mormot.net.sock",
            "mormot.net.tunnel"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/90df67e41ca873499c2a2116bd9303a5f4700159"
        },
        {
          "sha": "a7de70bb1ff8e1e6439f5e7d6dbdafb28231e1ba",
          "headline": "core: some refactoring with no functional change",
          "category": "refactor",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.base",
            "mormot.core.os",
            "mormot.core.os.posix",
            "mormot.script.core"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/a7de70bb1ff8e1e6439f5e7d6dbdafb28231e1ba"
        },
        {
          "sha": "455bed18d935e008c9598d23484601136721e553",
          "headline": "lib: enhanced SSPI exception error message content",
          "category": "chore",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.lib.sspi"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/455bed18d935e008c9598d23484601136721e553"
        },
        {
          "sha": "07235e3eb1386e4a68e20497d46f82b6e70a8d7b",
          "headline": "core: use ThreadRandom function whenever possible",
          "category": "chore",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.base",
            "mormot.core.os",
            "mormot.crypt.rsa",
            "mormot.crypt.secure"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/07235e3eb1386e4a68e20497d46f82b6e70a8d7b"
        },
        {
          "sha": "7a58c705d912f68df4aed0613a791bb11c63dd31",
          "headline": "core: TLightLock now is 32-bit not PtrInt",
          "category": "chore",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.core.os",
            "mormot.core.os.windows"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/7a58c705d912f68df4aed0613a791bb11c63dd31"
        },
        {
          "sha": "6edaf0b7877ea1bef0c22fe979d38be96c43dc3b",
          "headline": "crypt: allow {{ passwordgenerate }} without length",
          "category": "chore",
          "severity": "low",
          "action": "none",
          "units": [
            "mormot.crypt.secure"
          ],
          "impact": "",
          "what_changed": "",
          "confidence": "interpretation",
          "reviewed": false,
          "url": "https://github.com/synopse/mORMot2/commit/6edaf0b7877ea1bef0c22fe979d38be96c43dc3b"
        }
      ]
    }
  ]
}