Deterministic Replay
THotPDF.DeterministicReplayLog capture les décisions externes qui peuvent rendre une opération différente d'une exécution à l'autre, puis substitue les résultats enregistrés pendant la relecture
Décisions capturées
- Les points de contrôle d'annulation enregistrent le nom de l'opération et si l'annulation a été demandée
- Les sondes progressives à accès aléatoire enregistrent le décalage d'octets exact, le nombre d'octets et le résultat de disponibilité
- Les assistants de rappels booléens et entiers 64 bits enregistrent un nom de rappel stable, deux valeurs de contexte définies par l'appelant et le résultat renvoyé
- Le filtrage d'annotations et l'annulation du rendu par tuiles utilisent le journal de relecture automatiquement lors de l'enregistrement ou de la relecture via
THotPDF
Enregistrer et rejouer
var
ReplayJSON: AnsiString;
begin
PDF.DeterministicReplayLog.BeginRecording;
PDF.ReadProgressiveLinearizedFirstPageSection(Source, Output, Info);
ReplayJSON := PDF.DeterministicReplayLog.ExportJSON;
PDF.DeterministicReplayLog.ImportJSON(ReplayJSON);
PDF.ReadProgressiveLinearizedFirstPageSection(Source, Output, Info);
if not PDF.DeterministicReplayLog.CompleteReplay then
raise Exception.Create(PDF.DeterministicReplayLog.LastDiagnostic);
end;
Ordre et validation
Chaque événement porte un numéro de séquence monotone, un type d'événement, un nom, deux arguments signés 64 bits et un résultat typé
La relecture consomme les événements dans l'ordre et valide leur signature complète avant de renvoyer le résultat enregistré ; le mode strict lève EHPDFDeterministicReplayMismatch à l'épuisement ou à la divergence, tandis que le mode non strict conserve un compteur de discordances et un diagnostic et utilise le résultat observé
CompleteReplay ne réussit qu'après que chaque événement retenu a été consommé sans discordances ni événements enregistrés abandonnés
Limites et performance
EventLimit est défini par défaut à 100 000 événements, DroppedEventCount signale le débordement, et le stockage d'événements croît géométriquement afin que le coût d'ajout reste un temps constant amorti
Le schéma JSON est hotpdf-deterministic-replay-v1 ; les arguments 64 bits et les résultats entiers sont encodés comme chaînes décimales pour préserver les valeurs exactes entre les implémentations JSON