mORMot2 DailyDaily read of upstream commits

POSIX sockets survive signals while TSynLog changes its format ABI

This is a large cross-platform batch. POSIX socket waits, accepts and I/O now retry EINTR without extending deadlines, while Delphi AArch64 gains interface dispatch, late-bound variants and correctly aligned time caches. TSynLog deliberately changes formatted APIs from PUtf8Char to RawUtf8 and adds out-of-lock pre-rendering; take the final fixes because build 2.4.16999 can overrun its 4KB stack buffer.

TL;DR

  • Land on build 2.4.17002 at 4ef9dc663bbf00ad1920c83a7274e3676610b37f.
  • Do not deploy build 2.4.16999: instance-prefixed formatted logs near 4KB can write past the TSynLog stack buffer.
  • Migrate TSynLogProc, formatted Log, DoLog, Enter, EnterLocal and ManualEnter format parameters from PUtf8Char to const RawUtf8.
  • POSIX socket I/O, poll, epoll and accept now retry EINTR while preserving finite deadlines; use the completed sequence rather than intermediate builds 2.4.16947–2.4.16964.
  • Delphi AArch64 gains DispInvoke and interface-call support on Android and iOS, and GlobalTime lock alignment is repaired.
  • Delphi POSIX fixes include ordinal-resource startup hangs and swapped short/long resourcestring decoding.

Upgrade advice

Land on build 2.4.17002. Do not stop in builds 2.4.16947–2.4.16964, where POSIX EINTR, timeout and asynchronous-connect work is repeatedly completed or corrected; build 2.4.16954 specifically regresses timeout reporting. Never deploy build 2.4.16999 because formatted TSynLog lines with an instance prefix can overrun the 4KB stack buffer; 2.4.17000 fixes it. Migrate all formatted logging callbacks and wrappers to RawUtf8, rebuild every Delphi/FPC target, then stress finite socket waits under signals, failed connects, near-4KB log lines, Delphi POSIX resources and AArch64 interface calls.

Build2.4.16943 → 2.4.17002
Commits59
Lines+7434 -629
Read10 min

51 of 51 entries · 59 commits upstream

Stories
# Entry Category Units
1 Critical The log pre-render buffer can no longer overflow TSynLogFamily.PreRenderFmt subtracts the precomputed instance prefix from the available 4KB capacity, and the Unicode Log overload now supplies its required stack buffer. Fixes mormot.core.log 99d189cc+7-4

core: fixed TSynLog latest commits

Impact

Build 2.4.16999 could write past the stack buffer for an instance-prefixed formatted line near 4KB. Build 2.4.17000 removes that memory-corruption risk and restores Unicode compilation.

Arnaud Bouchez · 16:40 UTC · view the commit on GitHub →

2 High Formatted TSynLog.Enter overloads also move to RawUtf8 Formatted Enter, EnterLocal and ManualEnter overloads replace PUtf8Char with const RawUtf8 and share the 4KB pre-rendering path before acquiring the log lock. Breaking changes mormot.core.log 5b05ee28+46-29

core: BREAKING CHANGE TSynLog.Enter Format is RawUtf8

Impact

Applications with typed PUtf8Char trace wrappers or matching overload variables will stop compiling; ordinary RawUtf8 and literal calls remain direct.

Migration required

Search formatted Enter, EnterLocal and ManualEnter wrappers for PUtf8Char and change their format values to RawUtf8.

Public API

  • TSynLog.Enter / EnterLocalsignature-changed — Formatted overloads now take const RawUtf8.
  • TSynLog.ManualEntersignature-changed — Formatted overload now takes const RawUtf8.

Arnaud Bouchez · 16:26 UTC · view the commit on GitHub →

3 High Formatted TSynLog APIs now take RawUtf8 TSynLogProc, TSynLog.Log, TSynLog.DoLog and their internal formatter change the format parameter from PUtf8Char to const RawUtf8. Breaking changes mormot.core.base+1 1bde88e2+13-13

core: BREAKING CHANGE TSynLog Format text is now RawUtf8

Impact

String literals usually remain source-compatible, but callback declarations, method variables and callers passing PUtf8Char no longer match and must adopt RawUtf8.

Migration required

Search for TSynLogProc and logging callbacks with PUtf8Char format parameters; change them to const RawUtf8 and convert pointer-only call sites.

Public API

  • TSynLogProcsignature-changed — Format parameter is const RawUtf8.
  • TSynLog.Log / TSynLog.DoLogsignature-changed — Formatted overloads now accept const RawUtf8.

Arnaud Bouchez · 16:06 UTC · view the commit on GitHub →

4 High POSIX stream and datagram I/O consistently retries EINTR TNetSocketWrap Send, Recv, SendTo and RecvFrom move into platform includes; POSIX implementations retry interrupted syscalls, while Windows keeps direct WinSock calls. Fixes mormot.net.sock+2 7e5228a5+159-87

net: fixed POSIX signals interception for Send/Recv/SendTo/RecvFrom

Impact

Linux and BSD socket traffic is less likely to fail spuriously under signals across TCP and UDP. Windows behavior and public signatures stay unchanged.

Arnaud Bouchez · 08:37 UTC · view the commit on GitHub →

5 High MSG_NOSIGNAL constants are corrected across POSIX systems mormot.net.sock.posix corrects MSG_NOSIGNAL values for Darwin, FreeBSD, NetBSD, DragonFlyBSD, OpenBSD and Solaris, while retaining Linux and Android values. Fixes mormot.net.sock.posix e8264e1b+21-23

net: fixed cross-platform MSG_NOSIGNAL definitions

Impact

Socket sends on affected BSD/Solaris targets now request the intended no-SIGPIPE behavior instead of passing a wrong flag value.

Arnaud Bouchez · 14:31 UTC · view the commit on GitHub →

6 High Non-blocking connect reports the socket's real completion error TNetAddr.SocketConnect replaces a 50ms polling loop with WaitFor followed by SO_ERROR, handles pending asynchronous connects, and renames GetSocketError to GetRawSocketError. Fixes mormot.net.sock 04130d2b+15-22

net: fixed TNetAddr.SocketConnect error handling

Impact

Failed TCP connects are no longer mistaken for writable success, and asynchronous callers get nrOk while completion is pending. Users of the one-commit method name must rename it.

Public API

  • TNetSocketWrap.GetSocketErrorrenamed — Renamed to GetRawSocketError.

Arnaud Bouchez · 09:56 UTC · view the commit on GitHub →

7 High Socket waits preserve deadlines across POSIX signals PollNoEintr wraps poll, retries EINTR and recomputes the remaining timeout; TNetSocketWrap.WaitFor uses it instead of treating EINTR as a timeout. Fixes mormot.net.sock.posix 989e6d5b+28-4

net: fixed POSIX EINTR for TNetSocketWrap.WaitFor

Impact

POSIX clients and servers no longer return early or extend finite waits indefinitely when signals interrupt poll. Windows is unaffected.

Arnaud Bouchez · 08:46 UTC · view the commit on GitHub →

8 High accept and accept4 recover from interrupted calls The POSIX doaccept helper retries accept4 and accept on EINTR, preserves non-blocking descriptors, and records unsupported accept4 only for ENOSYS or EOPNOTSUPP. Fixes mormot.net.sock.posix 109cf3c5+19-13

net: fixed accept/accept4 POSIX signals support

Impact

Signal delivery no longer makes POSIX listener loops report transient accept failures, and old kernels still fall back to accept correctly.

Arnaud Bouchez · 08:52 UTC · view the commit on GitHub →

9 High BSD socket constants match their native headers POSIX definitions correct NI_NUMERIC*, poll write flags, FreeBSD TCP keepalive values, Darwin-only cellular interface handling and ARPOP_InREPLY. Fixes mormot.net.sock.posix 6949ac17+21-11

net: fixed POSIX cross-platform constants for various BSD flavors

Impact

FreeBSD, NetBSD, DragonFlyBSD, OpenBSD, Darwin and Solaris networking uses the intended native option numbers instead of Linux-biased values.

Arnaud Bouchez · 14:58 UTC · view the commit on GitHub →

10 High Old kernels reliably fall back from accept4 doaccept stores errno once, exits on fatal accept4 errors, and falls through to plain accept after ENOSYS or EOPNOTSUPP; POSIX I/O uses direct cerrno checks. Fixes mormot.net.sock.posix 29c8bebb+14-11

net: fixed POSIX accept4 -> accept fallback

Impact

Linux systems without usable accept4 no longer get stuck on the unsupported path or skip the fallback listener call.

Arnaud Bouchez · 09:04 UTC · view the commit on GitHub →

11 High SocketConnect switches modes only after a successful wait TNetAddr.SocketConnect now keeps the socket asynchronous during WaitForWithRawSocketError, maps nrRetry to nrTimeout, and calls MakeBlocking only after a successful synchronous connection. Fixes mormot.net.sock 1d878f7f+9-14

net: fixed TNetAddr.SocketConnect

Impact

POSIX and Windows connection completion is checked without switching to blocking mode prematurely, avoiding hangs and preserving the caller's requested mode.

Arnaud Bouchez · 11:59 UTC · view the commit on GitHub →

12 High Failed TSynLog entry paths keep timing and scope consistent TSynLog initializes timing in its constructor, forwards MicroSecs through LogEnterFmt, and makes EnterLocal return nil when LockAndPrepareEnter fails. Fixes mormot.core.log e4c69cc1+12-9

core: some TSynLog.Enter fixes on error

Impact

Failed startup or rotation no longer leaves callers with a false successful logging scope, and manual timing pointers receive the intended entry timestamp.

Arnaud Bouchez · 06:38 UTC · view the commit on GitHub →

13 High Immediate TCP connects restore blocking mode for synchronous callers When non-blocking connect succeeds immediately, TNetAddr.SocketConnect now calls MakeBlocking for ms >= 0 while leaving ms = -1 callers asynchronous. Fixes mormot.net.sock+1 496af189+9-4

net: fixed TNetAddr.SocketConnect immediate connection

Impact

Synchronous Delphi/FPC clients no longer unexpectedly receive a non-blocking socket on the fast local-connect path.

Arnaud Bouchez · 10:07 UTC · view the commit on GitHub →

14 High Integer resource names no longer hang Delphi POSIX startup TExecutableResource.Open and ResourceExists reject MAKEINTRESOURCE-style pointers below $10000 on Delphi POSIX before the RTL can cast them to strings. Fixes mormot.core.os a21c2edb+8-0

core: fixed startup hang of Delphi POSIX apps using integer resource names

Impact

Delphi Linux, macOS, Android and iOS applications avoid a startup GPF/stack-overflow loop when code probes ordinal resources; such ordinal resources remain unsupported.

Stefan Diestelmann · 08:30 UTC · view the commit on GitHub →

15 High GlobalTime locks are aligned on Delphi AArch64 The GlobalTime cache record is no longer packed, ensuring TRWLightLock receives pointer alignment; comments and later assertions allow compiler-added padding. Fixes mormot.core.datetime b8eaea86+6-1

core: fixed unaligned GlobalTime[] breaking its lock on Delphi aarch64

Impact

Delphi AArch64 applications, notably iOS, avoid access violations from atomic lock instructions on an odd address. Other compilers keep the same cache semantics.

Stefan Diestelmann · 08:34 UTC · view the commit on GitHub →

16 High A socket-wait timeout regression is repaired PollNoEintr restores result := 0 when its deadline expires, and TNetSocketWrap.WaitFor exits before reading stale revents after a timeout. Fixes mormot.net.sock.posix 8187f47f+5-2

net: fixed TNetSocketWrap.WaitFor timeout regression

Impact

POSIX waits again report a clean timeout instead of interpreting stale poll state. This repair is required for the preceding EINTR timeout refactor.

Arnaud Bouchez · 09:23 UTC · view the commit on GitHub →

17 High Delphi POSIX resource strings use the correct layout LoadResString checks ShortLen <> $ffff for the short layout; $ffff now correctly selects the long resourcestring record defined by the Delphi RTL. Fixes mormot.core.os.delphi 2b55dc23+1-1

core: fixed swapped short/long resourcestring layout on Delphi POSIX

Impact

Delphi POSIX applications now load short and long localized resource strings from the correct fields instead of returning corrupted or swapped text.

Stefan Diestelmann · 08:31 UTC · view the commit on GitHub →

18 High Delphi Android and iOS gain static AArch64 interface stubs mormot.core.interfaces links external AArch64 call/fake-VMT stubs, passes hidden by-reference results through X8, and uses static thunks where iOS forbids generated executable pages. New features mormot.core.interfaces+1 0d9880b7+319-2

interfaces: external aarch64 stubs for the Delphi Android and iOS compilers

Impact

Interface-based services and fake interface dispatch become usable on Delphi Android and iOS AArch64, including code-signed iOS processes. macOS and Windows ARM64 remain outside this implementation.

Stefan Diestelmann · 08:42 UTC · view the commit on GitHub →

19 High DispInvoke understands Delphi AArch64 varargs mormot.core.variants adds AAPCS64 and Apple AArch64 va_list readers so DispInvokeNamed retrieves general-purpose, floating-point and by-reference arguments with each platform ABI. New features mormot.core.variants+1 ea847060+90-13

variants: implemented DispInvoke late-binding on Delphi aarch64

Impact

Late-bound variant method calls now work on Delphi Android, Linux, iOS and macOS AArch64 instead of using an incompatible flat-buffer or x86-64 layout.

Stefan Diestelmann · 08:36 UTC · view the commit on GitHub →

20 Medium Remote LogView normalizes every client layout TRemoteLogNormalizer rewrites calendar, zoned, high-resolution and plain rows into one timestamp/thread/level layout and assigns unique thread numbers per HTTP connection. Fixes mormot.tools.logview+1 6a02c38a+500-40

tools: LogView remote logging with any client layout - fix #344

Impact

Live logs from clients using different TSynLog layouts are all visible and filterable. The change is confined to the LogView tool and its remote-capture path.

Sven Harazim · 16:38 UTC · PR #344 · view the commit on GitHub →

21 Medium Socket availability handles POSIX signals explicitly TNetSocketWrap.Available gains separate POSIX and Windows implementations; POSIX MSG_PEEK retries EINTR and preserves the raw errno for the caller. Fixes mormot.net.sock+2 b0bbdf13+94-59

net: fixed TNetSocketWrap.Available on POSIX

Impact

Connection checks no longer classify an interrupted POSIX peek as a closed socket. Windows behavior is kept in its platform implementation.

Arnaud Bouchez · 09:38 UTC · view the commit on GitHub →

22 Medium UDP send and receive retry interrupted POSIX syscalls TNetSocketWrap.SendTo and RecvFrom now repeat sendto and recvfrom on POSIX when errno is EINTR, while retaining the existing Windows behavior. Fixes mormot.net.sock 389ef677+27-8

net: fixed EINTR on TNetSocketWrap.SendTo/RecvFrom

Impact

Signal-heavy Linux and BSD services no longer report transient UDP failures solely because a syscall was interrupted. Public signatures are unchanged.

Arnaud Bouchez · 07:53 UTC · view the commit on GitHub →

23 Medium epoll control retries EINTR and timeout loops are tightened EpollCtlNoEIntr wraps epoll_ctl for subscribe/unsubscribe, while poll and epoll retry loops stop once the recomputed timeout reaches zero. Fixes mormot.net.sock.posix 99bc19a1+15-17

net: fixed EINTR in TPollSocketEpoll and poll/epoll timeouts

Impact

Linux subscriptions resist signal interruption, but this intermediate build omitted a timeout result reset that the next commit restores; do not stop on build 2.4.16954.

Worth a look

Arnaud Bouchez · 09:18 UTC · view the commit on GitHub →

24 Medium Reachability checks use verified asynchronous connects GetReachableNetAddr uses SocketConnect(-1), WaitForWithRawSocketError and MakeBlocking, closes failed sockets, and stops once no candidate remains. Fixes mormot.net.sock a74fa349+22-10

net: rewritten GetReachableNetAddr() function

Impact

Address probing no longer counts writable sockets with a pending SO_ERROR as reachable, improving endpoint selection in Delphi/FPC clients.

Arnaud Bouchez · 12:00 UTC · view the commit on GitHub →

25 Medium AArch64 alignment and Tunnel cleanup receive follow-up fixes GlobalTime assertions allow padding after unpacking, Delphi POSIX resource comments are clarified, and TTunnelLocal.OpenInternal initializes thread before exception logging and reports the socket consistently. Fixes mormot.core.datetime+2 ce3a81b8+11-17

core: some fixes after previous commits

Impact

This removes a startup assertion risk on Delphi AArch64 and prevents undefined diagnostic values if Tunnel setup fails before thread creation.

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

26 Medium epoll waits also retain their timeout after EINTR EpollWaitNoEintr retries epoll_wait after EINTR and subtracts elapsed time before TPollSocketEpoll.WaitForModified resumes. Fixes mormot.net.sock.posix 9c8515b0+24-3

net: fixed EINTR support on TPollSocketEpoll.WaitForModified

Impact

Linux epoll servers keep their requested deadlines and do not surface signal interruptions as missing events. Public APIs are unchanged.

Arnaud Bouchez · 09:03 UTC · view the commit on GitHub →

27 Medium Remote MAC discovery survives interrupted ARP sends GetRemoteMacAddress retries its raw ARP sendto call on EINTR, and the poll/epoll timeout helpers initialize their deadline variables explicitly. Fixes mormot.net.sock.posix 3af914ac+14-12

net: fixed EINTR support on GetRemoteMacAddress()

Impact

Linux ARP-based MAC lookup is no longer lost to a signal interruption. Other platforms and public APIs are unchanged.

Arnaud Bouchez · 09:43 UTC · view the commit on GitHub →

28 Medium Tunnel failures retain their socket context TTunnelLocalThread includes the raw accept error in exceptions, and TTunnelLocal.OpenInternal logs the failing class, message, thread and socket before cleanup. Fixes mormot.net.tunnel 93ac7a4a+13-7

net: enhanced Tunnel error handling

Impact

Tunnel connection failures become diagnosable and still close the partial socket. Protocol behavior and public signatures are unchanged.

Arnaud Bouchez · 12:01 UTC · view the commit on GitHub →

29 Medium Absolute XML lookups intentionally move the parser TXmlParser.GetU returns false for nil paths, preserves position for relative and // paths, but lets an absolute / path rewind and remain at the found position; GetI inherits this behavior. Fixes mormot.core.fmt 9dc38579+15-5

core: refined TXmlParser.GetU/GetI process

Impact

Code that expected GetU('/...') or GetI('/...') to restore the prior forward-only parser position will now observe a changed cursor and should review its sequence.

Worth a look

Search for absolute-path GetU/GetI calls and use Save/Restore explicitly if the previous position must survive.

Public API

  • TXmlParser.GetU / GetIbehaviour-changed — Absolute paths now leave the parser at the result.

Arnaud Bouchez · 14:49 UTC · view the commit on GitHub →

30 Medium SIGPIPE interception uses SIG_IGN and records success SigPipeIntercept installs SIG_IGN instead of an empty handler and only sets its process flag when fpSigaction succeeds. Fixes mormot.core.os.posix ec6e317b+5-5

core: SigPipeIntercept() cleanup

Impact

POSIX processes get conventional SIGPIPE suppression and can retry initialization after a failed sigaction. Public APIs remain unchanged.

Arnaud Bouchez · 11:57 UTC · view the commit on GitHub →

31 Medium poll-based socket sets ignore EINTR without losing time TPollSocketPoll.WaitForModified and WaitForSeveral now call PollNoEintr, so their finite timeout is preserved across signal interruptions. Fixes mormot.net.sock.posix e637b45f+4-4

net: fixed TPollSocketPoll.WaitForModified / WaitForSeveral EINTR support

Impact

POSIX poll backends stop returning empty or failed result sets solely because a signal arrived. Application APIs do not change.

Arnaud Bouchez · 08:53 UTC · view the commit on GitHub →

32 Medium LogView returns as a Lazarus desktop tool A new mormot.tools.logview LCL application opens, filters, searches and profiles TSynLog, SynLZ and plain-text files, with DPI-aware layout and queued remote rows. New features mormot.tools.logview 307a9fb7+2162-0

tools: port the mORMot 1 LogView sample as a FPC/Lazarus LCL app

Impact

Framework backends are unchanged; FPC/Lazarus users gain a maintained viewer, including safer UI-thread handling of live remote logs.

Sven Harazim · 15:54 UTC · view the commit on GitHub →

33 Medium OpenSSL 4 suppresses SIGPIPE per socket SSLSetFdNoSigPipe uses BIO_C_SET_SEND_FLAGS with NET_MSG_NOSIGNAL on OpenSSL 4+, falling back to process-wide SigPipeIntercept for OpenSSL 1.1/3.x. New features mormot.core.os+2 a413d047+67-20

lib: use new OpenSSL 4+ BIO_C_SET_SEND_FLAGS for MSG_NOSIGNAL

Impact

POSIX applications on OpenSSL 4 avoid changing SIGPIPE handling for the whole process. Older OpenSSL versions retain the historical behavior unless explicitly disabled.

Worth a look

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

34 Medium Remote-log callbacks can identify their sender TRestHttpRemoteLogServer adds CreateWithSender and TRemoteLogReceivedFrom, delivering the connection ID and remote IP; callback fields are assigned before the HTTP server starts. New features mormot.rest.http.server e29490aa+30-7

rest: TRestHttpRemoteLogServer.CreateWithSender

Impact

Existing Create users keep their callback. New Delphi/FPC viewers can separate simultaneous senders, and startup requests no longer race an unassigned callback.

Public API

  • TRemoteLogReceivedFromadded — Callback including connection ID and remote IP.
  • TRestHttpRemoteLogServer.CreateWithSenderadded — Creates a remote-log server with sender-aware notifications.

Sven Harazim · 16:38 UTC · view the commit on GitHub →

35 Medium Sockets expose their pending SO_ERROR result TNetSocketWrap adds GetSocketError, querying SOL_SOCKET/SO_ERROR and mapping the raw system value to TNetResult; Delphi POSIX also exports SO_ERROR. New features mormot.core.os.delphi+1 a299fb59+22-2

net: new TNetSocketWrap.GetSocketError method

Impact

Low-level Delphi/FPC networking code can inspect asynchronous connect completion correctly, but this intermediate name becomes GetRawSocketError in the next change.

Public API

  • TNetSocketWrap.GetSocketErroradded — Intermediate name; renamed to GetRawSocketError immediately afterward.

Arnaud Bouchez · 09:48 UTC · view the commit on GitHub →

36 Medium A helper combines connect waiting with SO_ERROR TNetSocketWrap.WaitForWithRawSocketError waits for write/error events and then returns GetRawSocketError, using nrRetry for an empty event set. New features mormot.net.sock 07c8080b+16-2

net: new TNetSocketWrap.WaitForWithRawSocketError method

Impact

Custom asynchronous Delphi/FPC connection code can reuse the same correct completion check as SocketConnect. Existing callers are unaffected.

Public API

  • TNetSocketWrap.WaitForWithRawSocketErroradded — Waits for socket completion and reads SO_ERROR.

Arnaud Bouchez · 11:59 UTC · view the commit on GitHub →

37 Medium Accept can return the raw socket error TNetSocketWrap.Accept adds an optional rawError output and passes it through NetLastError, while retaining the existing three-argument call through a default nil value. New features mormot.core.os.posix+1 e8de6bf7+7-9

net: enhanced TNetSocketWrap.Accept()

Impact

Servers can log the precise errno behind an accept failure without breaking existing Delphi/FPC source calls.

Public API

  • TNetSocketWrap.Acceptsignature-changed — Adds optional rawError: PNetErrorInt = nil.

Arnaud Bouchez · 11:58 UTC · view the commit on GitHub →

38 Medium Instance text is precomputed with the formatted log line TSynLogFamily.PreRenderFmt now writes the instance class/pointer prefix into the same stack buffer outside the writer lock before formatting the message. Performance mormot.core.log a6bb53dc+31-21

core: pre-compute the TSynLog instance pointer text if possible

Impact

Instance-heavy multithreaded logging shortens lock duration further, but this intermediate implementation miscalculates remaining buffer space and is repaired in build 2.4.17000.

Worth a look

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

39 Medium Formatted log text is rendered before taking the lock TSynLog pre-renders up to 4KB into a stack buffer outside the writer lock, trims control bytes, and adds TSynLogFamily.DirectRendering to opt back into in-lock rendering. Performance mormot.core.log ab869875+29-4

core: pre-render formatted text up to 4KB on stack outside of the TSynLog lock

Impact

Multithreaded services reduce time spent in each logger lock. Object/interface arguments still take the slow path, and DirectRendering can preserve custom writer expectations.

Worth a look

Benchmark high-volume logging and enable DirectRendering if a custom writer depends on formatting while locked.

Public API

  • TSynLogFamily.DirectRenderingadded — Disables the new 4KB pre-rendering fast path.

Arnaud Bouchez · 16:07 UTC · view the commit on GitHub →

40 Medium Modern Android can find ICU without libicudata Android ICU discovery now falls back to libicuuc.so and libicui18n.so when libicudata.so is absent, then resolves unversioned or versioned symbols as needed. Compiler & platform mormot.core.os.posix 36796d3c+11-1

core: enhanced ICU detection on modern Android

Impact

Current Android releases whose ICU data lives in an APEX can expose Unicode conversion support to Delphi/FPC applications again. Other POSIX targets are unchanged.

Stefan Diestelmann · 08:34 UTC · view the commit on GitHub →

41 Medium Remote logging always uses the portable socket server TRestHttpRemoteLogServer now selects useHttpSocket on every platform instead of HTTP_DEFAULT_MODE, avoiding Windows http.sys URI registration and privilege-dependent fallback. Compiler & platform mormot.rest.http.server 4f487ad9+5-5

rest: TRestHttpRemoteLogServer now uses useHttpSocket on all systems

Impact

Windows remote-log deployments no longer change server backend according to administrator rights. The socket server is sufficient for the intended small client count.

Worth a look

Sven Harazim · 10:10 UTC · view the commit on GitHub →

42 Low Accept failures include the operating-system error Async and threaded HTTP server accept loops request raw errno from TNetSocketWrap.Accept and add SystemErrorShort to debug logging; banned-address checks run only after success. Fixes mormot.net.async+1 d59aeb92+16-11

net: enhanced accept() logged error content

Impact

Operators receive actionable accept diagnostics without a public behavior change. Failed accepts no longer feed an uninitialized peer address to the ban check.

Arnaud Bouchez · 12:01 UTC · view the commit on GitHub →

43 Low LogView keeps key columns visible and remembers font size LogView prevents text-column clicks from hiding time, level and thread columns, and adds persistent content font sizing through keys, mouse wheel and menu. New features mormot.tools.logview 1c454fb6+148-12

tools: LogView keeps the first columns visible and has a custom font size

Impact

Only the Lazarus LogView user interface changes; backend logging and file formats are unaffected.

Sven Harazim · 19:40 UTC · view the commit on GitHub →

44 Low Control characters can be replaced in place mormot.core.unicode adds TrimControlCharsBuffer, replacing bytes #0 through #31 with spaces directly in a supplied UTF-8 buffer. New features mormot.core.unicode bcf4e877+22-2

core: new TrimControlCharsBuffer() function

Impact

Existing code is unchanged; Delphi/FPC callers gain an allocation-free helper used by the new TSynLog pre-rendering path.

Public API

  • TrimControlCharsBufferadded — Replaces ASCII control bytes with spaces in place.

Arnaud Bouchez · 15:55 UTC · view the commit on GitHub →

45 Low Short location lookup may omit the hexadecimal fallback TDebugFile.FindLocationShort adds aNoHex, using PointerToHexShortVar otherwise; the commit also corrects comments and assignment annotations in recent logging code. New features mormot.core.log add4ed16+13-9

core: some logging fixes and TSynLogFile enhancement

Impact

Diagnostic callers can request an empty result when no debug symbol is found instead of receiving only the address. Existing two-argument calls keep hexadecimal fallback.

Public API

  • TDebugFile.FindLocationShortsignature-changed — Adds optional aNoHex: boolean = false.

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

46 Low Pointer text can be written into any ShortString mormot.core.text adds PointerToHexShortVar, and PointerToHexShort delegates to it instead of duplicating the pointer-width hexadecimal conversion. New features mormot.core.text cd8db464+15-6

core: new PointerToHexShortVar() function

Impact

Existing callers are unchanged; allocation-free diagnostic code can now fill an existing ShortString variable directly.

Public API

  • PointerToHexShortVaradded — Writes a pointer value into a caller-supplied ShortString.

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

47 Low Format arguments can be scanned for object rendering mormot.core.text adds VarRecHasObject to detect vtObject or vtInterface values that require TTextWriter.WriteObject instead of the fast formatter. New features mormot.core.text 906a763f+18-2

core: new VarRecHasObject() function

Impact

The helper supports later logging optimization and does not alter existing application behavior. Its name is changed to VarRecNeedsWriteObject later in the same batch.

Arnaud Bouchez · 15:43 UTC · view the commit on GitHub →

48 Low The platform MSG_NOSIGNAL value becomes public mormot.net.sock initializes the public NET_MSG_NOSIGNAL variable from the platform constant for reuse by higher-level socket and TLS code. New features mormot.net.sock eabe6fba+7-2

net: new NET_MSG_NOSIGNAL global cross-platform constant

Impact

Existing applications are unaffected; low-level integrations can query the effective flag without duplicating platform conditionals.

Public API

  • NET_MSG_NOSIGNALadded — Runtime copy of the platform MSG_NOSIGNAL value.

Arnaud Bouchez · 14:14 UTC · view the commit on GitHub →

49 Low Bounded UTF-8 formatting stops parsing once full TFormatUtf8.InitParse receives MaxSize and stops collecting format blocks once that limit is reached; FormatBufferRaw and FormatShort pass their real capacities. Performance mormot.core.text 7a04bb59+14-10

core: optimized TFormatUtf8.InitParse when a maximum size is involved

Impact

Truncated formatting avoids converting unused later arguments, reducing work for fixed buffers while keeping the same bounded output.

Arnaud Bouchez · 15:25 UTC · view the commit on GitHub →

50 Low The object-format probe receives its final name VarRecHasObject is renamed VarRecNeedsWriteObject with a byte-safe VType test, and TXmlParser comments document the absolute-path cursor behavior. Under the hood mormot.core.fmt+1 697af472+10-7

core: some renaming/comment with no functional change

Impact

Only code written against the immediately preceding intermediate helper name must rename it; pre-existing applications have no migration.

Public API

  • VarRecHasObjectrenamed — Final name is VarRecNeedsWriteObject.

Arnaud Bouchez · 16:04 UTC · view the commit on GitHub →

51 Low AArch64 follow-up only adjusts style and inlining The commit fixes indentation, marks AAPCS64 va_list helpers inline, and updates the changelog wording for Delphi 13.1 platform support. Housekeeping mormot.core.interfaces+1 dfac0653+7-7

core: minor change after previous PR

Impact

There is no functional application impact; Delphi/FPC behavior and public APIs remain the same.

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