mORMot2 DailyLecture quotidienne des commits upstream

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.

Build2.4.16922 → 2.4.16943
Commits21
Lignes+9887 -9367
Lecture6 min

19 sur 19 entrées · 21 commits upstream

Sujets
# Entrée Catégorie Unités
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.

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

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.

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

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.

API publique

  • TSynLogFamilyDynArrayadded — Type de tableau dynamique nommé utilisé par le registre des familles de logger.

vennexTSE · 15:43 UTC · voir le commit sur GitHub →

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.

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

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.

API publique

  • TSynLogFile.LineContainsbehaviour-changed — Les fichiers texte brut utilisent maintenant l’implémentation de recherche héritée.

Sven Harazim · 20:06 UTC · voir le commit sur GitHub →

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.

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

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.

API publique

  • AppendShortByteHexbehaviour-changed — Les valeurs dépassant un octet sont maintenant réduites en sécurité à leur octet bas.

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

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.

Arnaud Bouchez · 10:42 UTC · voir le commit sur GitHub →

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.

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

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.

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

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.

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

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.

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

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.

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

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.

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

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.

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

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.

Arnaud Bouchez · 10:11 UTC · voir le commit sur GitHub →

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.

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

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.

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

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.

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