Agir maintenantpeut affecter un système en production
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.
21 sur 21 entrées · 23 commits upstream
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.
Mise à jour recommandée
Mettez à jour les services POSIX utilisant RunRedirect, puis testez la sortie normale, EOF, le délai, l'abandon par callback, env/PATH personnalisé, le répertoire de travail et l'arrêt des descendants.
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.
Unités
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.
Mise à jour recommandée
Recompilez les services fortement concurrents avec le build 2.4.16652 ou ultérieur et relancez les tests de contention des verrous.
API publique
TOSLightLock.UnLockbehaviour-changed — Le déverrouillage utilise maintenant une transition atomique avant de décider si un thread doit être réveillé.
Unités
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.
Mise à jour recommandée
Évitez les builds intermédiaires et compilez les applications Delphi avec le build 2.4.16652 ; recherchez TNormalizeDN si le build 16630 avait déjà été adopté.
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.
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.
Mise à jour recommandée
Placez-vous sur cette révision avant de compiler des cibles BSD ou d'adopter tout autre changement de cette édition.
API publique
TSynEvent.WaitForSafesignature-changed — DisableSafe vaut de nouveau false par défaut après être devenu obligatoire dans le build 16645.
Unités
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.
Mise à jour recommandée
Retestez les colonnes de résultat DECIMAL, NUMERIC et FLOAT avec chaque pilote ODBC utilisé en production.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
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.
Unités
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.
Unités
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.
Unités
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.
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.
Unités
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.
Unités
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.
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.
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.
Unités
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.
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.