mORMot2 DailyLecture quotidienne des commits upstream

Les correctifs de verrouillage et de processus font du build 16652 le point d'arrivée sûr

Cette série corrige deux risques de production : une course pouvant manquer un réveil dans TOSLightLock et plusieurs défauts anciens de RunRedirect sous POSIX, notamment des processus enfants orphelins et une boucle active en fin de flux. Elle ajoute aussi un verrou lecture-écriture basé sur futex, corrige l'inférence des types ODBC, étend les API LDAP et de trace de pile, puis résout les régressions de compilation Delphi et BSD avant le build final.

En bref

  • 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.

Conseil de mise à jour

Intégrez la révision finale 2.4.16652 pour les services POSIX utilisant RunRedirect, les charges utilisant TOSLightLock, les consommateurs ODBC ou toute compilation Delphi/BSD. Ne vous arrêtez pas sur une révision intermédiaire : des commits ultérieurs réparent des problèmes de compilation et de compatibilité source introduits plus tôt dans la même série.

Build2.4.16629 → 2.4.16652
Commits23
Lignes+1303 -403
Lecture7 min

21 sur 21 entrées · 23 commits upstream

# Entrée Catégorie Unités
1 Élevée Sous POSIX, RunRedirect ne fuit plus les processus enfants et ne boucle plus après EOF L'implémentation POSIX FPC remplace popen par un chemin fork/execve préparé. L'enfant crée sa propre session, stdout est redirigé explicitement, les délais signalent tout le groupe de processus, EOF utilise n<=0, l'environnement et le répertoire sont respectés, les commandes simples utilisent le PATH fourni et exitcode reçoit le résultat de WaitProcess sauf en cas d'abandon. Correctifs mormot.core.os.posix 667509df+231-77

core: rewrite POSIX RunRedirect() from popen() to fork/execve - fix #463

Impact

Les attentes INFINITE ne bouclent plus à 100 % CPU lorsque l'enfant ferme stdout, les abandons ne laissent plus les workers lancés par shell orphelins sous PID 1, wrkdir ne change plus le processus parent et env/options ne sont plus ignorés sous POSIX. La sémantique d'exécution est corrigée sans changer la signature publique.

API publique

  • RunRedirectbehaviour-changed — L'exécution POSIX utilise maintenant fork/execve, respecte les paramètres existants, renvoie le véritable code de sortie et termine les groupes de processus.

zen010101 · 06:39 UTC · PR #463 · voir le commit sur GitHub →

2 Élevée TOSLightLock pouvait oublier un thread en attente au déverrouillage TOSLightLock.UnLock effectue désormais toujours LockedExc32 de EV_LOCKED vers EV_NONE avant de choisir le chemin de réveil. L'ancien chemin rapide Intel lisait fMutex puis écrivait EV_NONE sans atomicité, permettant à un thread en attente de publier EV_WAITER entre les deux opérations puis d'être écrasé. Correctifs mormot.core.os ad8f8d38+6-16

core: fixed race in TOSLightLock.UnLock

Impact

Sous contention, l'ancienne séquence de déverrouillage pouvait oublier de réveiller un thread et le laisser bloqué indéfiniment. Les services utilisant TOSLightLock directement ou via les composants internes du framework doivent intégrer ce correctif malgré le faible coût du CAS sans contention.

API publique

  • TOSLightLock.UnLockbehaviour-changed — Le déverrouillage utilise maintenant une transition atomique avant de décider si un thread doit être réveillé.

Arnaud Bouchez · 17:24 UTC · voir le commit sur GitHub →

3 Élevée La compilation Delphi est rétablie pour les nouvelles API de verrou et LDAP TOSRWLightLock retire sous Delphi les directives inline de méthodes qui ne pouvaient pas y être inlinées. Dans mormot.net.ldap, la déclaration d'ensemble anonyme devient une énumération TNormalizeDN plus un ensemble TNormalizeDNs, et DNToCN, DNsToCN et NormalizeDN acceptent TNormalizeDNs. Compilateur & plateforme mormot.core.os+1 63b43ba0+12-12

net: fixed Delphi compilation

Impact

Delphi peut compiler les API introduites plus tôt dans la série. Le code écrit contre le build transitoire 16630 doit remplacer les variables d'ensemble TNormalizeDN par TNormalizeDNs ; le code utilisant l'API finale n'a aucune migration.

API publique

  • TNormalizeDNsadded — Le type d'ensemble utilisé pour filtrer les DN est maintenant explicitement nommé TNormalizeDNs.
  • DNToCN / DNsToCN / NormalizeDNsignature-changed — Leur paramètre extend utilise TNormalizeDNs au lieu du type d'ensemble transitoire TNormalizeDN.

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

4 Élevée La révision finale rétablit les builds BSD et la valeur par défaut de WaitForSafe Dans mormot.core.os, SPIN_FUTEX a été déplacé hors du bloc réservé à OSFUTEX afin que le code de repli de TOSRWLightLock puisse l'utiliser sous BSD. TSynEvent.WaitForSafe retrouve aussi DisableSafe=false comme argument public par défaut. Compilateur & plateforme mormot.core.os 951b4afd+6-5

core: fixed BSD compilation

Impact

Les cibles BSD peuvent compiler le nouveau verrou lecture-écriture, et le code existant appelant WaitForSafe avec seulement un délai compile à nouveau. Cette révision doit remplacer les builds intermédiaires 16645 à 16651.

API publique

  • TSynEvent.WaitForSafesignature-changed — DisableSafe vaut de nouveau false par défaut après être devenu obligatoire dans le build 16645.

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

5 Moyenne La liaison ODBC respecte désormais la précision numérique déclarée TSqlDBOdbcStatement.BindColumns transmet à ODBCColumnToFieldType les véritables ColumnSize et DecimalDigits fournis par SQLDescribeColW au lieu d'une précision codée en dur à 10. SQL_FLOAT sort aussi de l'heuristique entier/devise de DECIMAL et NUMERIC et correspond directement à ftDouble. Correctifs mormot.db.sql.odbc 5c4a0328+7-7

db: fixed TSqlDBOdbcStatement.BindColumns

Impact

Les colonnes de résultat ODBC peuvent désormais exposer le bon type ftInt64, ftCurrency ou ftDouble au lieu d'un type déduit d'une précision 10. Les applications dépendant des anciennes métadonnées ou conversions incorrectes doivent être testées.

Arnaud Bouchez · 16:08 UTC · voir le commit sur GitHub →

6 Moyenne WaitForSafe donne la priorité au travail synchronisé du thread principal Sur le thread principal, TSynEvent.WaitForSafe appelle désormais CheckSynchronize(10) puis sonde l'événement avec WaitFor(0), au lieu de vérifier la synchronisation pendant 1 ms puis de bloquer 10 ms sur l'événement. Un délai nul contourne la boucle sûre. Correctifs mormot.core.os 46404091+6-5

core: fixe TSynEvent.WaitForSafe Synchronize() call

Impact

Les attentes du thread principal traitent plus rapidement les appels Synchronize en attente et vérifient l'événement sans intervalle bloquant supplémentaire. Le code sensible à l'ordre de synchronisation ou aux limites de délai doit être retesté.

À regarder

Retestez les usages de RunWait sur le thread principal ou de WaitForSafe qui dépendent d'un délai précis ou de l'ordre de Synchronize.

API publique

  • TSynEvent.WaitForSafebehaviour-changed — Les attentes sûres du thread principal privilégient désormais CheckSynchronize et utilisent une vérification non bloquante de l'événement.

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

7 Moyenne Les traces de pile peuvent être capturées sans lever d'exception TDebugFile gagne des surcharges StackTrace renvoyant RawUtf8 ou ajoutant dans TTextWriter, avec les contrôles skip, depth et TSynLogStackTraceUse. FPC utilise CaptureBacktrace, Delphi Windows utilise RtlCaptureStackBackTrace avec repli manuel Win32, et TSynLog partage l'implémentation. Nouveautés mormot.core.log 702c8d0c+208-47

core: add TDebugFile.StackTrace() methods - request #401

Impact

Les endpoints de diagnostic et rapports d'erreur peuvent capturer la pile du thread courant sans fabriquer d'exception. Sous FPC x86_64, les frames utiles dépendent toujours de la génération des stack frames ; Delphi POSIX n'ajoute encore rien.

API publique

  • TDebugFile.StackTraceadded — Deux surcharges capturent sous forme de texte la pile du thread courant sans exception.

zen010101 · 06:38 UTC · PR #401 · voir le commit sur GitHub →

8 Moyenne Un nouveau verrou lecture-écriture assisté par l'OS favorise les lecteurs mormot.core.os ajoute TOSRWLightLock, un compteur de lecteurs 32 bits avec indicateur d'écriture utilisant WaitOnAddress/WakeByAddress sous Windows 8+, futex sous Linux et une attente active ailleurs. Il expose Init, Done, les verrous lecture/écriture, try-lock, unlock et IsLocked. Nouveautés mormot.core.os 583fe89c+196-7

core: new TOSRWLightLock efficient object

Impact

Les applications disposent d'une alternative légère à TRWLightLock, avec préférence lecteur plutôt que rédacteur. Des lecteurs continus peuvent retarder un rédacteur, et demander un verrou d'écriture depuis un verrou de lecture ou d'écriture provoque toujours un deadlock par contrat.

À regarder

Utilisez TOSRWLightLock uniquement si la préférence lecteur est acceptable ; conservez TRWLightLock lorsque les rédacteurs en attente doivent bloquer les nouveaux lecteurs.

API publique

  • TOSRWLightLockadded — Nouveau record/objet de verrou lecture-écriture assisté par l'OS et à préférence lecteur.

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

9 Moyenne La conversion des DN LDAP peut sélectionner les composants CN, OU et DC DNToCN, DNsToCN et NormalizeDN gagnent un ensemble optionnel extend contrôlant la présence des parties CN, OU et DC dans le résultat. Les valeurs par défaut conservent l'ancien résultat complet ; le build 16639 donne ensuite à l'ensemble son nom final TNormalizeDNs. Nouveautés mormot.net.ldap 9411aea0+52-24

net: introducing TNormalizeDN extend e.g. for DNToCN()

Impact

Les applications LDAP peuvent produire des noms canoniques ou normalisés ne contenant que certains niveaux DN sans réanalyser la chaîne. Les appels existants conservent leur résultat car DN_ALL reste la valeur par défaut.

API publique

  • DNToCN / DNsToCN / NormalizeDNsignature-changed — Un paramètre optionnel de sélection des composants a été ajouté avec DN_ALL par défaut.

Arnaud Bouchez · 07:27 UTC · voir le commit sur GitHub →

10 Moyenne La couche futex multiplateforme peut réveiller tous les threads en attente Un nouveau callback OsWakeAllOnValue est résolu vers WakeByAddressAll sous Windows 8+ et vers FUTEX_WAKE_PRIVATE avec MaxInt sous Linux. Il complète OsWaitOnValue et le callback OsWakeOnValue qui ne réveille qu'un thread. Nouveautés mormot.core.os+2 c849d860+25-12

core: implemented WakeByAddressAll() on Win8+ and Linux

Impact

Les primitives du framework comme TOSRWLightLock peuvent réveiller tous les lecteurs après la libération du verrou par un rédacteur. Le comportement applicatif existant ne change que si le code utilise directement le nouveau callback.

API publique

  • OsWakeAllOnValueadded — Nouveau callback optionnel pour réveiller tous les threads en attente sur une valeur 32 bits.

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

11 Moyenne TLoggedWorker attend un événement au lieu de sonder TLoggedWorker possède maintenant un TSynEvent nommé fIdle. RunOne le réinitialise au démarrage du travail, RunDone le signale lorsque fRunning atteint zéro, et RunWait délègue son délai et la synchronisation optionnelle du thread principal à WaitForSafe. Performance mormot.core.threads a22faf70+31-20

core: let TLoggedWorker use TSynEvent for WaitFor()

Impact

L'attente ne se réveille plus toutes les 10 ms, ce qui réduit l'utilisation CPU au repos et réagit immédiatement lorsque le worker devient inactif. Le contrat n'autorise désormais explicitement qu'un seul appelant RunWait simultané.

À regarder

Vérifiez que le code applicatif n'appelle pas RunWait simultanément sur la même instance de TLoggedWorker.

API publique

  • TLoggedWorker.RunWaitbehaviour-changed — L'implémentation est pilotée par événement et accepte un seul thread en attente à la fois.

Arnaud Bouchez · 18:32 UTC · voir le commit sur GitHub →

12 Faible Les listes d'attributs LDAP gagnent l'insertion de valeurs formatées TLdapAttributeList.AddFmt formate une valeur RawUtf8 avec FormatUtf8 puis la transmet à la surcharge Add existante avec le TLdapAddOption demandé. La méthode renvoie le TLdapAttribute concerné. Nouveautés mormot.net.ldap c7ba1bb3+17-3

net: new TLdapAttributeList.AddFmt() method

Impact

Le code client LDAP peut construire des valeurs d'attribut formatées sans chaîne temporaire. Les appels Add existants et leur comportement ne changent pas.

API publique

  • TLdapAttributeList.AddFmtadded — Nouvelle aide de type surcharge pour valeur formatée avec les arguments de FormatUtf8.

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

13 Faible Les objets ASN.1 gagnent une aide de tableau dynamique typé mormot.core.os.security ajoute TAsnObjects comme tableau de TAsnObject et AsnAddItem pour ajouter un objet encodé en renvoyant son index de base zéro. La construction de modificateurs LDAP est le cas d'usage indiqué. Nouveautés mormot.core.os.security 446a5be1+15-2

core: new TAsnObjects type and its AsnAddItem() wrapper

Impact

Le code assemblant plusieurs valeurs ASN.1 peut utiliser un type de tableau nommé et éviter les répétitions de SetLength. Les API d'encodage ASN.1 existantes ne changent pas.

API publique

  • TAsnObjectsadded — Type de tableau dynamique pour plusieurs valeurs TAsnObject.
  • AsnAddItemadded — Ajoute un objet ASN.1 et renvoie son index.

Arnaud Bouchez · 08:07 UTC · voir le commit sur GitHub →

14 Faible Le polling socket Windows utilise le chemin rapide des événements en attente TPollSockets.PollForPendingEvents ne limite plus son chemin rapide fPendingSafe.TryLock à POSIX. Windows tente désormais le même verrou non bloquant et déplace les événements en attente sans entrer dans le chemin lent en l'absence de contention. Performance mormot.core.os+1 79dd6c23+2-5

core: some TPollSockets optimization on Windows

Impact

Les serveurs Windows avec de fréquents changements d'abonnement socket peuvent passer moins de temps à fusionner les événements en attente. Le changement est interne et ne requiert aucune modification applicative.

Arnaud Bouchez · 15:32 UTC · voir le commit sur GitHub →

15 Faible Les événements socket en attente utilisent un verrou moins coûteux en faible contention TPollSockets.fPendingSafe passe de TOSLightLock à TLightLock. Le commit indique que la contention des événements en attente est faible et que le CAS obligatoire ajouté à TOSLightLock.UnLock rend ici le verrou simple plus rapide. Performance mormot.net.sock 60cb8bc7+3-3

net: let TPollSockets use TLightLock for the Pending envents

Impact

Le polling des sockets conserve la correction de course tout en évitant son coût supplémentaire de déverrouillage sans contention pour cette file interne. Aucun changement applicatif n'est requis.

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

16 Faible TRWLightLock gagne un finaliseur vide pour l'interchangeabilité des verrous TRWLightLock expose maintenant Done comme méthode vide, conformément au cycle de vie de TOSLock et des primitives associées. Sa documentation indique aussi explicitement la préférence rédacteur. Compilateur & plateforme mormot.core.os d5844b6a+12-2

core: new TRWLightLock.Done void method

Impact

Le code générique peut appeler Init et Done pour chaque type de verrou sans nettoyage conditionnel. Done ne fait rien, donc le comportement d'exécution existant ne change pas.

API publique

  • TRWLightLock.Doneadded — Méthode de cycle de vie vide compatible avec les autres records de verrou.

Arnaud Bouchez · 08:07 UTC · voir le commit sur GitHub →

17 Faible Les registres de classes base de données et REST utilisent des tableaux de pointeurs Les registres internes de définitions de classes dans TSqlDBConnectionProperties et TRest appellent maintenant PtrArrayAddOnce au lieu de stocker des TClass via des conversions TObject. Le nom et le formatage de l'aide ODBC ont été normalisés sans changer sa portée. Sous le capot mormot.db.sql+2 9fbd6c32+13-13

all: minor code refactoring

Impact

Il n'y a aucun changement fonctionnel ni migration applicative. La représentation du registre correspond désormais aux valeurs de pointeur réellement stockées.

Arnaud Bouchez · 16:22 UTC · voir le commit sur GitHub →

18 Faible Le test du relais de tunnel supprime une variable de générateur aléatoire inutilisée TNetworkProtocols.TunnelRelay ne déclare et n'initialise plus une variable PLecuyer inutilisée. Aucune assertion, aucun flux de contrôle ni aucune unité du framework n'est modifié. Tests b1f1302d+2-4

tests: minor unused variable cleanup

Impact

Il n'y a aucun impact sur le code applicatif ni sur le comportement d'exécution ; le changement supprime seulement un avertissement du compilateur dans les tests.

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

19 Faible L'unité texte vérifie que son formateur tient toujours dans le tampon de pile L'initialisation de mormot.core.text ajoute un Assert vérifiant que SizeOf(TFormatUtf8) ne dépasse pas SizeOf(TTextWriterStackBuffer). Les tailles attendues sont actuellement de 4 Ko et 8 Ko. Tests mormot.core.text e171e5aa+3-2

core: added paranoid Assert() about TFormatUtf8

Impact

Les builds normaux ne changent pas. Les builds avec assertions échoueront tôt si une future croissance du formateur invalide l'hypothèse sur le tampon de pile.

Arnaud Bouchez · 08:06 UTC · voir le commit sur GitHub →

20 Faible La préférence des verrous et le comportement des sockets en attente sont documentés Les commentaires distinguent maintenant la préférence lecteur de TOSRWLightLock du modèle SRW de Windows et décrivent plus précisément les substitutions d'événements en attente de TPollSockets. EnsurePending nomme aussi explicitement son index initial sans changer la recherche. Documentation mormot.core.os+1 181c2d7b+13-9

core: mostly comments/documentation precisions

Impact

Il n'y a aucun impact à l'exécution ni sur le code source. La documentation clarifie les compromis de choix des verrous et les responsabilités des sous-classes socket.

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

21 Faible La documentation de TUri confirme l'acceptation des noms de serveur seuls Le commentaire de TUri.From mentionne explicitement un nom de serveur seul, sans schéma ni chemin, comme entrée interprétée en HTTP. Aucun code du parseur n'est modifié. Documentation mormot.net.sock ff62d966+4-4

net: TUri.From() documentation precision

Impact

Il n'y a aucun changement d'exécution. Les développeurs peuvent s'appuyer sur l'analyse existante des hôtes seuls avec une documentation plus claire.

Arnaud Bouchez · 08:24 UTC · 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