Agir maintenantpeut affecter un système en productionLe payload brut contient deux commits de merge et 19 commits non-merge ; chacun des commits non-merge est couvert ci-dessous. Il ne contient ni marqueur superseded_by ni avis de dépréciation. La plage à éviter découle directement de la réparation ultérieure de la build 16942 dans la séquence intégrée.
Les verrous par writer arrivent avec des réparations de fallback indispensables
TSynLog remplace son verrou d’écriture global au processus par un verrou par writer, réduisant la contention mais révélant aussi des chemins d’échec réparés plus tard dans la même série. Les utilisateurs directs de TX64CpuFeatures doivent supprimer les références à cpuSSSE3, tandis que les cibles x86-64 compatibles sélectionnent désormais automatiquement le parser SSSE3 des nombres JSON. Les viewers de logs, les outils de diagnostic et les appelants de AppendShortByteHex reçoivent aussi des améliorations concrètes de correction et d’API.
En bref
- Visez la build 2.4.16943 au commit 0b26918230d72e33b79365a79c1bc444ec3029b1 ; évitez la séquence TSynLog incomplète des builds 2.4.16937 à 2.4.16941.
- TSynLog sérialise maintenant les écritures par logger plutôt qu’avec un verrou d’écriture global, réduisant la contention entre logs indépendants.
- La build 2.4.16942 répare les chemins d’échec de Enter, EnterLocal et ManualEnter introduits par le refactoring des verrous.
- TX64CpuFeatures.cpuSSSE3 est supprimé ; utilisez cfSSSE3 dans CpuFeatures pour détecter cette capacité.
- Les cibles Delphi et FPC x86-64 non-PIC compatibles sélectionnent désormais automatiquement GetNumericVariantSsse3 pour les nombres JSON.
- La recherche dans les fichiers TSynLogFile en texte brut fonctionne à nouveau, et AppendShortByteHex accepte sans débordement les PtrUInt supérieurs à 255.
Conseil de mise à jour
Prenez la build 2.4.16943 au head actuel et ne vous arrêtez pas sur les builds 2.4.16937 à 2.4.16941, dont le nouveau verrouillage par writer conserve des chemins d’échec de Enter et de comptage de récursion réparés en 16942. Recherchez cpuSSSE3 dans le code applicatif et remplacez-le par cfSSSE3 dans CpuFeatures. Recompilez chaque cible Delphi/FPC, puis testez les échecs au démarrage et à la rotation des logs, les callbacks imbriqués du writer, les loggers indépendants concurrents, la recherche en texte brut et le parsing JSON sur machines avec et sans SSSE3.
19 sur 19 entrées · 21 commits upstream
1
Élevée
Le flag de capacité dupliqué cpuSSSE3 est supprimé
mormot.core.base supprime cpuSSSE3 de l’énumération publique TX64CpuFeatures. Les utilisateurs internes testent maintenant cfSSSE3 dans le set général CpuFeatures, et la détection paranoïaque retire cfSSSE3 lorsque cfSSE3 est absent.
Ruptures
mormot.core.base+2
5f7b6d39+7-8
core: removed cpuSSSE3 from X64CpuFeatures
Impact
Le code Delphi ou FPC qui référence directement cpuSSSE3 ou l’attend dans X64CpuFeatures ne compile plus. Les consommateurs généraux doivent utiliser cfSSSE3 dans CpuFeatures.
Migration nécessaire
Recherchez cpuSSSE3 et X64CpuFeatures ; remplacez le premier par cfSSSE3 dans CpuFeatures, puis recompilez chaque cible x86-64.
API publique
TX64CpuFeatures.cpuSSSE3removed — Utilisez cfSSSE3 dans le set général CpuFeatures.
2
Élevée
Un échec d’entrée de log ne se présente plus comme un succès
TSynLog LogEnter et LogEnterFmt indiquent maintenant si la préparation du writer a réussi. Enter et EnterLocal renvoient nil en cas d’échec, ManualEnter enregistre un marqueur de récursion nul, ManualLeave le consomme et _Release équilibre toujours EndWrite.
Correctifs
mormot.core.log
c3462904+72-52
core: fixed TSynLog.Enter* fallback on failure
Impact
Les échecs au démarrage, à la rotation ou dans un writer imbriqué ne produisent plus un faux scope ISynLog ni un comptage de récursion déséquilibré. C’est la correction indispensable pour les applications prenant les commits précédents.
Mise à jour recommandée
Passez à la build 2.4.16942 ou ultérieure et testez l’échec de création du fichier, la rotation et les callbacks CreateLogWriter personnalisés avant la production.
Unités
3
Élevée
La réécriture des verrous de log compile à nouveau sous Delphi
mormot.core.log introduit TSynLogFamilyDynArray et l’utilise pour le tableau global des familles de logger et sa copie locale, résolvant l’incompatibilité de type Delphi E2008 après le refactoring des verrous.
Compilateur & plateforme
mormot.core.log
f8937aeb+3-2
core: fix Delphi E2008 in SynLogException - Delphi treats each inline 'array of TSynLogFamily' declaration as a distinct type, so 'families := copy(SynLogFamily)' failed to compile. Use a named TSynLogFamilyDynArray for both.
Impact
L’état précédent du refactoring ne compilait pas avec les versions Delphi concernées. Ce commit rétablit les builds Delphi ; le comportement FPC et la sémantique runtime des logs ne changent pas.
Mise à jour recommandée
N’utilisez pas la réécriture des verrous sans cette correction de compatibilité ; recompilez toutes les versions Delphi prises en charge.
API publique
TSynLogFamilyDynArrayadded — Type de tableau dynamique nommé utilisé par le registre des familles de logger.
Unités
4
Élevée
Chaque writer TSynLog reçoit son propre verrou d’écriture
La réécriture principale de TSynLog remplace le verrou d’écriture global par fWriteSafe sur chaque logger, sépare les verrous d’exceptions et de liste des loggers, suit les écritures actives dans les flags du thread et introduit BeginWrite, EndWrite et LockAndPrepareWrite.
Sous le capot
mormot.core.log
001b4c2d+9347-9020
core: huge refactoring of TSynLog locking
Impact
Des loggers indépendants peuvent écrire en parallèle au lieu de se disputer un verrou global au processus, mais le refactoring modifie les chemins sensibles d’initialisation, de rotation et de réentrance. Les builds précédant la réparation 16942 ne doivent pas être déployées.
À regarder
Prenez ce changement uniquement avec la réparation 16942, puis testez en charge plusieurs instances TSynLog, la rotation, les exceptions et les callbacks de writer en concurrence.
Unités
5
Moyenne
La recherche dans les logs en texte brut fonctionne à nouveau
TSynLogFile.LineContains délègue maintenant à TMemoryMapText.LineContains lorsqu’aucun niveau de log parsé n’existe, au lieu de renvoyer false pour chaque ligne d’un fichier texte brut.
Correctifs
mormot.core.log
638616f1+28-4
core: fixed TSynLogFile.LineContains() on plain text files
Impact
SearchNext et SearchPrevious de TSynLogFileView retrouvent du texte dans les fichiers non-SynLog. La recherche structurée SynLog reste inchangée pour les applications Delphi et FPC.
Mise à jour recommandée
Mettez à niveau les déploiements du viewer ouvrant des fichiers texte quelconques et vérifiez la recherche avant et arrière avec un fixture texte brut.
API publique
TSynLogFile.LineContainsbehaviour-changed — Les fichiers texte brut utilisent maintenant l’implémentation de recherche héritée.
Unités
6
Moyenne
Le temps écoulé du log commence à la création de TSynLog
Le constructeur TSynLog initialise maintenant immédiatement son timestamp de départ haute résolution et sa date UTC. LogFileInit utilise cette valeur UTC et ne la convertit en heure locale qu’à l’écriture du header.
Correctifs
mormot.core.log
71e8dc08+12-13
core: set TSynLog timestamp at startup
Impact
Les timestamps écoulés et les headers de log partagent une origine cohérente même si l’initialisation du fichier est retardée. Les appels existants et signatures publiques Delphi/FPC ne changent pas.
Mise à jour recommandée
Mettez à niveau si le temps écoulé des logs sert au diagnostic du démarrage, et vérifiez le fuseau du header ainsi que la première durée enregistrée.
Unités
7
Moyenne
Les ajouts hexadécimaux ne dépassent plus la table des chiffres
AppendShortByteHex dans mormot.core.base masque maintenant le nibble haut comme le nibble bas avant d’indexer HexCharsUpper ; une valeur PtrUInt supérieure à 255 ne peut donc plus lire au-delà de la table.
Correctifs
mormot.core.base
ae5a3b33+5-4
core: fixed AppendShortByteHex() overflow
Impact
Les appelants Delphi et FPC passant une valeur byte ne voient aucun changement. Ceux qui passent un PtrUInt plus large obtiennent maintenant l’octet bas sur deux chiffres hexadécimaux au lieu d’une lecture hors limites.
Mise à jour recommandée
Mettez à niveau si AppendShortByteHex peut recevoir des identifiants ou offsets non masqués dépassant un octet, et ajoutez un cas de régression supérieur à 255.
API publique
AppendShortByteHexbehaviour-changed — Les valeurs dépassant un octet sont maintenant réduites en sécurité à leur octet bas.
Unités
8
Moyenne
La recherche de symboles du fichier debug devient publique
TDebugFile expose publiquement FindSymbol, les deux overloads de FindBlock et FindBlockByName, et ajoute Lookup(aRva), qui combine fichier source, ligne et symbole pour une adresse.
Nouveautés
mormot.core.log
5a3e5210+49-22
core: new TDebugFile public methods
Impact
Les outils de diagnostic Delphi et FPC peuvent interroger directement les métadonnées debug chargées sans sous-classer TDebugFile. Les appelants existants conservent le même comportement.
API publique
TDebugFile.FindSymbol / FindBlock / FindBlockByNamebehaviour-changed — Ces méthodes existantes passent de la visibilité protected à public.TDebugFile.Lookupadded — Renvoie les informations formatées de source et de symbole pour une RVA.
Unités
9
Moyenne
Le texte brut du log est préparé avant le verrou du writer
TSynLog.LogInternalText tronque et valide maintenant l’UTF-8 avant le verrou, puis choisit une écriture directe sans échappement si HasControlChars est false et utilise une sortie échappée pour l’UTF-8 invalide.
Performance
mormot.core.log
5fc4a796+35-29
core: optimized TSynLog.LogInternalText() process
Impact
Les services Delphi et FPC concurrents passent moins de temps dans le verrou d’écriture du logger pour le texte brut. La sortie valide reste identique et l’UTF-8 malformé passe toujours par l’échappement.
Unités
10
Moyenne
SSSE3 devient le parser JSON numérique par défaut sur les cibles x86-64 éligibles
GetNumericVariantFromJson affecte maintenant GetNumericVariantStub à GetNumericVariantSsse3 lors de l’initialisation quand cpuSSSE3 est présent dans les builds ASMX64NOTPIC. L’opt-in FORCE_SSSE3_JSON est supprimé.
Performance
mormot.core.text+1
4d78fdfe+7-11
core: enable GetNumericVariantSsse3() by default
Impact
Les signatures publiques et les résultats numériques restent identiques, mais les backends Delphi Win64 et FPC x86-64 non-PIC compatibles utilisent automatiquement le chemin SIMD. Les autres CPU et builds PIC restent sur l’implémentation Pascal.
À regarder
Exécutez des charges JSON numériques représentatives sur chaque cible compiler x86-64 et conservez des tests de limites pour entiers, fractions et exposants.
API publique
GetNumericVariantFromJsonbehaviour-changed — Les builds x86-64 éligibles utilisent maintenant GetNumericVariantSsse3 par défaut.
11
Faible
Les buffers UTF-8 gagnent un test direct des caractères de contrôle
mormot.core.unicode ajoute le helper public HasControlChars(P, Len), qui détecte les octets de zéro à 31 et renvoie false pour un buffer nil ou vide.
Nouveautés
mormot.core.unicode
6f1bd299+21-2
core: new HasControlChars() function
Impact
Les applications existantes ne changent pas. Le code Delphi et FPC peut réutiliser ce helper pour décider si un texte UTF-8 doit être échappé ou traité par ligne.
API publique
HasControlCharsadded — Teste une plage d’octets UTF-8 pour les caractères de contrôle ASCII.
Unités
12
Faible
ShortString reçoit l’ajout formaté de variants
mormot.core.text ajoute la procédure publique AppendShortVar, qui formate un array of const via TFormatUtf8 et ajoute le résultat dans la capacité d’un ShortString.
Nouveautés
mormot.core.text
7565759e+15-2
core: new AppendShortVar() function
Impact
Le code applicatif n’est pas affecté tant qu’il n’adopte pas ce helper ; les appelants Delphi et FPC peuvent ajouter des valeurs hétérogènes sans créer d’abord une chaîne UTF-8 temporaire.
API publique
AppendShortVaradded — Formate directement des valeurs array of const dans un ShortString existant.
Unités
13
Faible
Les limites numériques utilisent des tests directs sur 53 bits
Les chemins Pascal et x86-64 de GetNumericVariantFromJson remplacent les comparaisons avec MAX_SAFE_JS_INTEGER par des shifts testant directement si une valeur unsigned dépasse 53 bits, et simplifient la garde du fast path de Clinger.
Performance
mormot.core.base.asmx64+1
ba4b5c99+11-12
core: minor GetNumericVariantFromJson() optimization
Impact
Les résultats des nombres JSON et les signatures publiques ne changent pas ; les builds Delphi et FPC reçoivent seulement un contrôle interne de limite plus léger sur ces chemins.
14
Faible
Les variants entiers se convertissent en Double sans fallback générique
VariantToDouble dans mormot.core.base ajoute des cas directs pour varInteger et varInt64 avant de recourir au mécanisme général de conversion Variant pour les autres types.
Performance
mormot.core.base
25e283ab+8-4
core: optimized VariantToDouble()
Impact
Les variants entiers courants se convertissent avec moins de coût sous Delphi et FPC. La signature publique et la valeur numérique attendue ne changent pas.
Unités
15
Faible
Les benchmarks numériques utilisent une entrée contiguë stable
BenchmarkNumbers pré-génère maintenant des tokens numériques déterministes terminés par zéro dans un seul buffer, mesure séparément les parsers Pascal et SSSE3 et vérifie que le parsing ne modifie pas la source.
Tests
7e251513+123-108
tests: rewritten BenchmarkNumbers process
Impact
Il n’y a aucun impact sur le code applicatif. La suite de tests obtient des comparaisons de parsers plus reproductibles et peut détecter une écriture accidentelle dans l’entrée JSON.
16
Faible
Les tests core lents peuvent s’exécuter en parallèle
Le runner de tests core marque d’autres composants lents de TTestCoreBase pour l’exécution parallèle avec l’option multithread, tout en gardant le test d’événement sur le thread principal.
Tests
c772c201+61-47
tests: parallelize TTestCoreBase for /multithread
Impact
Il n’y a aucun impact runtime ni applicatif. Les mainteneurs peuvent observer des tests multithread plus courts sans changement des units de production.
17
Faible
Les tests de log couvrent la création imbriquée du writer
TestLogFileInit est adapté au verrouillage par writer et vérifie qu’une tentative de log depuis CreateLogWriter ne relance pas une seconde création du writer et ne modifie pas l’état d’exception.
Tests
de95ebb6+18-12
tests: fixed TestLogFileInit after huge TSynLog refactoring
Impact
Il n’y a aucun impact direct sur le code applicatif. Le test protège les implémentations personnalisées de logging family contre l’initialisation récursive après le refactoring.
18
Faible
Les benchmarks de parser comparent les résultats Pascal et SSSE3
BenchmarkNumbers étend les contrôles de correction entre GetExtended et GetNumericVariantFromJson ainsi qu’entre leurs implémentations Pascal et SSSE3, avec un reporting de temps plus cohérent.
Tests
63edb4c2+26-3
tests: BenchmarkNumbers check values consistency
Impact
Il n’y a aucun impact sur le code applicatif. Les régressions du parser numérique entre Delphi/FPC et les chemins SIMD/non-SIMD deviennent plus faciles à détecter.
19
Faible
Le nettoyage des warnings suit la réécriture des logs
L’unit de log supprime une affectation locale nil inutile, et les tests affectent les littéraux à des variables typées avant les appels overload pour éviter les warnings du compiler.
Entretien
mormot.core.log
d4bbc57f+8-6
core: fixed some Delphi compiler warnings
Impact
Il n’y a aucun impact sur le code applicatif ni le runtime Delphi ou FPC ; ce changement garde seulement le code et les tests sans warnings.