mORMot2 DailyLecture quotidienne des commits upstream

Les WebSockets sans délai se réveillent et le retrait IOCP devient atomique

Les backends réseau reçoivent plusieurs corrections concrètes de concurrence : les trames WebSocket sans délai réveillent le serveur asynchrone, les sockets tunnel déjà connectés suivent le bon traitement et une souscription IOCP Windows ne peut être retirée qu’une fois. Le recyclage des slots de thread TSynLog est aussi finalisé afin qu’un slot ne soit pas réutilisé avant l’effacement de ses bits de nom dans chaque journal. Les utilisateurs UI doivent vérifier la nouvelle condition HAS_UI_PDF et la suppression de HASUIPDF ; les changements PDF restants concernent surtout les tests et la sélection de plateforme.

En bref

  • TWebSocketAsyncConnections réveille maintenant le thread principal du serveur asynchrone lorsque SendDelay=0 et que la file de sortie devient non vide.
  • TWinIocp.Unsubscribe met atomiquement le pointeur de souscription de l’appelant à nil, empêchant deux retraits du même objet.
  • TTunnelLocal distingue maintenant un socket d’écoute lié d’un socket déjà connecté, restaurant le bon chemin de traitement.
  • TSynLog efface les bits de nom de thread dans chaque journal avant de rendre le numéro au pool de slots réutilisables.
  • HASUIPDF est remplacé par HAS_UI_PDF, avec les nouveaux contrôles de projet NO_UI, NO_UI_VCL et NO_UI_PDF.

Conseil de mise à jour

Prenez la build 2.4.16753 pour les WebSockets asynchrones, TTunnelLocal, IOCP sous Windows ou les charges TSynLog créant beaucoup de threads ; elle contient les correctifs complets du payload. Recompilez les projets UI/PDF et remplacez les tests applicatifs HASUIPDF par HAS_UI_PDF. Examinez NO_UI, NO_UI_VCL et NO_UI_PDF seulement pour exclure ces sous-systèmes. Le payload ne signale aucun successeur ultérieur dans cette édition.

Build2.4.16737 → 2.4.16753
Commits13
Lignes+995 -375
Lecture4 min

12 sur 12 entrées · 13 commits upstream

Sujets
# Entrée Catégorie Unités
1 Élevée Les slots de journalisation ne sont réutilisés qu’après effacement des bits TSynLog.NotifyThreadEnded dans mormot.core.log efface maintenant fThreadNameLogged sous SynLogGlobalLock avant de verrouiller SynLogThreads.Safe et d’ajouter le numéro à IndexReleased. L’index du bitmap est aussi exprimé directement par num - 1. Correctifs mormot.core.log 68f8a3cb+16-17

core: fixed another paranoid race in TSynLog.NotifyThreadEnded

Impact

Un autre thread ne peut plus reprendre un numéro et poser son bit de nom avant que le thread terminé efface l’ancien. Les services Delphi/FPC créant beaucoup de threads conservent un marquage cohérent des noms.

Arnaud · 22:01 UTC · voir le commit sur GitHub →

2 Élevée Le retrait IOCP Windows réserve atomiquement le pointeur appelant TWinIocp.Unsubscribe dans mormot.net.sock.windows copie localement le pointeur de souscription, puis utilise LockedExc pour mettre le paramètre var à nil seulement s’il correspond encore. Les opérations de shutdown, receive et free utilisent le pointeur réservé. Correctifs mormot.net.sock.windows 76d9d035+9-9

net: made TWinIocp.Unsubscribe atomic

Impact

Deux appels concurrents ne peuvent plus réussir le test non-nil puis retirer ou libérer la même souscription IOCP. Les serveurs asynchrones Windows évitent un double shutdown et un possible accès après libération.

API publique

  • TWinIocp.Unsubscribebehaviour-changed — Le pointeur var est atomiquement réservé et effacé avant le début du retrait.

Arnaud Bouchez · 09:58 UTC · voir le commit sur GitHub →

3 Élevée Les trames WebSocket sans délai réveillent immédiatement le serveur TWebSocketAsyncConnections.NotifyOutgoing mémorise si fOutgoingHandle était vide avant l’ajout. Quand le premier élément arrive et que Connection.fProcess.Settings^.SendDelay vaut zéro, il appelle le nouveau helper THttpAsyncConnections.WakeupServerMainThread qui signale fExecuteEvent. Correctifs mormot.net.async+1 a7195425+15-2

net: fixed TWebSocketAsyncConnections with SendDelay=0

Impact

Avec SendDelay=0, une trame sortante n’attend plus un événement socket sans rapport ou un passage idle avant son envoi. Le comportement immédiat attendu est restauré pour les serveurs WebSocket Delphi/FPC.

API publique

  • TWebSocketAsyncConnections with SendDelay=0behaviour-changed — La première connexion sortante en file réveille immédiatement la boucle serveur.

Arnaud Bouchez · 14:55 UTC · voir le commit sur GitHub →

4 Élevée Les tunnels locaux connectés n’entrent plus dans le chemin accept TTunnelLocal dans mormot.net.tunnel renomme le drapeau interne fSocketCreated en fSocketBound et ne le pose qu’après le bind de NewSocket pour le port zéro. TTunnelLocalThread.DoExecute n’entre dans la boucle accept que si ce drapeau est présent. Correctifs mormot.net.tunnel 9cb2c9bc+5-5

net: fixed TTunnelLocal socket flag

Impact

Un tunnel ouvert par connexion à une adresse locale existante passe maintenant directement à stProcessing au lieu d’appeler accept sur un socket connecté. Les tunnels liés à un port éphémère conservent leur écoute.

Arnaud Bouchez · 19:20 UTC · voir le commit sur GitHub →

5 Moyenne Les contrôles UI sont renommés et CountOccurrences devient public mormot.defines remplace HASUIPDF par HAS_UI_PDF et introduit HAS_UI, HAS_UI_VCL_LCL ainsi que NO_UI, NO_UI_VCL et NO_UI_PDF. mormot.core.unicode ajoute CountOccurrences pour les occurrences RawUtf8 non chevauchantes ; mormot.core.text corrige aussi le nom du paramètre transmis par UInt32DigitsToUtf8. Ruptures mormot.core.text+3 fe0b21d2+59-18

core: new CountOccurrences() function

Impact

Les conditions d’application ou de package testant HASUIPDF ne sélectionnent plus leur branche PDF avant renommage. Les projets peuvent exclure toute l’UI, le chemin VCL Delphi ou seulement le PDF ; CountOccurrences est disponible en Delphi et FPC.

Migration nécessaire

Recherchez HASUIPDF dans les sources, packages et defines de build, remplacez-le par HAS_UI_PDF puis recompilez chaque cible UI et sans interface.

API publique

  • HASUIPDFremoved — Remplacer les tests de projet par HAS_UI_PDF.
  • HAS_UI / HAS_UI_VCL_LCL / HAS_UI_PDFadded — Décrivent les capacités UI actives après les exclusions du projet.
  • NO_UI / NO_UI_VCL / NO_UI_PDFadded — Options projet pour désactiver toute l’UI, VCL/LCL ou le support PDF.
  • CountOccurrencesadded — Compte les occurrences non chevauchantes de SubStr dans un RawUtf8 Text.

Arnaud Bouchez · 09:47 UTC · voir le commit sur GitHub →

6 Moyenne Le nettoyage du bitmap des noms passe sous le verrou global TSynLog.NotifyThreadEnded dans mormot.core.log protège l’accès à SynLogFamily et aux bitmaps fGlobalLog.fThreadNameLogged avec SynLogGlobalLock. Le travail existant sous SynLogThreads.Safe est d’abord imbriqué dans cette protection. Correctifs mormot.core.log 6539d93d+24-19

core: fixed a paranoid race in TSynLog.NotifyThreadEnded

Impact

Un thread terminé ne modifie plus les bitmaps de nom en concurrence avec le cycle de vie des familles de logs. Le commit ultérieur 68f8a3c finalise l’ordre avant la réutilisation du slot.

Arnaud · 21:33 UTC · voir le commit sur GitHub →

7 Moyenne La maintenance asynchrone utilise une seule échelle monotone mormot.net.async fixe fLastOperationMS avant que ProcessWaitingWrite puisse réentrer dans le traitement idle, puis le rafraîchit après. La cadence des callbacks non-IOCP dérive maintenant tix de GetTickCount64 shr 16 plutôt que GetTickSec shr 6, comme le reste de la logique en millisecondes. Correctifs mormot.net.async f50a5e53+6-4

net: fixed async internal ticks computation

Impact

La maintenance des sockets asynchrones évite un travail récursif au même tick et utilise une tranche cohérente d’environ 65 secondes. Cela concerne surtout les backends poll POSIX ; les API ne changent pas.

Arnaud Bouchez · 14:56 UTC · voir le commit sur GitHub →

8 Faible Les types de hash et buffers fixes s’étendent jusqu’à 4096 bits mormot.core.base ajoute THash1024, THash2048 et THash4096 avec leurs pointeurs, ainsi que TTemp128 et TTemp256. Des tableaux fixes dans SHA-512, CPU sets, SSPI, ISO, DHCP et TFTP sont remplacés par les types nommés équivalents sans changer leur taille. Nouveautés mormot.core.base+7 487c21e6+29-21

core: new THash1024..4096 and TTemp128..512 types

Impact

Le code applicatif gagne des déclarations standard de 128, 256 et 512 octets pour données binaires et buffers de pile. Les records existants gardent leur disposition, sans changement de format réseau.

API publique

  • THash1024 / PHash1024 / THash2048 / PHash2048 / THash4096 / PHash4096added — Tableaux d’octets nommés et pointeurs pour des valeurs de 128, 256 et 512 octets.
  • TTemp128 / TTemp256added — Buffers temporaires AnsiChar fixes de 128 et 256 octets.

Arnaud Bouchez · 14:54 UTC · voir le commit sur GitHub →

9 Faible Le contexte des exceptions inclut maintenant le numéro de thread mormot.core.log formate le contexte d’exception standard en [#numéro nom], en omettant chaque partie indisponible. _GetCurrentThreadName est simplifié sans changer son verrou et TDebugFile.AddLog appelle directement DebugFileGet. Nouveautés mormot.core.log 93da31e1+24-15

core: refined exception logging entry

Impact

Les lignes d’exception sont plus faciles à corréler avec TSynLog, mais les parseurs qui attendent seulement un nom entre crochets méritent une vérification. La gestion des exceptions et les API ne changent pas.

À regarder

API publique

  • TSynLog exception row formatbehaviour-changed — Le contexte standard ajoute #ThreadNumber avant le nom de thread optionnel.

Arnaud · 22:01 UTC · voir le commit sur GitHub →

10 Faible TMultiLightLock utilise des drapeaux 32 bits et des identifiants natifs mormot.core.os change les champs privés TMultiLightLock.Flags de PtrUInt en cardinal et ThreadID de pointer en TThreadID. Les opérations utilisent donc LockedExc32 et LockedDec32, et zéro remplace nil pour l’identifiant. Sous le capot mormot.core.os aa0c8213+13-13

core: simplified TMultiLightLock

Impact

La propriété du verrou et le compteur réentrant gardent la même sémantique, avec un compteur atomique 32 bits sur toutes les cibles. Les utilisateurs n’accèdent qu’aux méthodes publiques ; aucun changement applicatif n’est attendu après recompilation.

Arnaud Bouchez · 19:19 UTC · voir le commit sur GitHub →

11 Faible TCachedValue conserve toujours le rafraîchissement terminé en dernier TCachedValue.Cache dans mormot.core.os supprime la condition TixShr = Tix32 avant d’affecter Value après le callback. La liste publique de paramètres est seulement reformattée et mormot.core.os.security précise qu’un décalage de huit représente 256 secondes de cache. Sous le capot mormot.core.os+1 a697074f+6-7

core: minor TCachedValue.Cache change

Impact

Si des callbacks de rafraîchissement de périodes différentes se chevauchent, le dernier terminé est conservé même si un autre appel a avancé Tix32. Les caches de fichiers et certificats gardent la même API et durée.

Arnaud Bouchez · 14:57 UTC · voir le commit sur GitHub →

12 Faible Les tests PDF sont isolés derrière les nouveaux noms de capacité UI mormot.ui.pdf et le runner d’intégration remplacent HASUIPDF par HAS_UI_PDF, tandis que mormot.defines ajoute HAS_UI_LCL pour FPC. test.ui.pdf est réorganisé, utilise mormot.lib.z pour son fixture et garde une unité vide sans support PDF UI. Tests mormot.defines+1 cf21f26e+202-232

ui: more refactoring of #571 test.ui.pdf process

Impact

Les builds de test sans UI n’initialisent plus VCL/LCL et n’incluent plus l’unité de tests PDF. Ce suivi ne change pas le comportement PDF à l’exécution ; il complète le renommage des conditions.

API publique

  • HAS_UI_LCLadded — Défini pour FPC lorsque le support UI est actif.

Arnaud Bouchez · 09:54 UTC · PR #571 · voir le commit sur GitHub →

Activité upstream commits par jour · 60 derniers jours
Commits977
Jours actifs44/60
Plus chargé2026-09-30
Pic60
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