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

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

API associées