Replay Deterministico

THotPDF.DeterministicReplayLog cattura le decisioni esterne che possono far comportare diversamente un'operazione tra esecuzioni diverse, poi sostituisce i risultati registrati durante il replay

Decisioni catturate

Registrazione e replay

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;

Ordinamento e validazione

Ogni evento porta un numero di sequenza monotono, un tipo di evento, un nome, due argomenti interi con segno a 64 bit e un risultato tipizzato

Il replay consuma gli eventi in ordine e valida la loro firma completa prima di restituire il risultato registrato; la modalità strict solleva EHPDFDeterministicReplayMismatch in caso di esaurimento o divergenza, mentre la modalità non strict mantiene un conteggio dei mismatch e una diagnostica e usa il risultato osservato

CompleteReplay ha successo solo dopo che ogni evento conservato è stato consumato senza mismatch né eventi di registrazione scartati

Limiti e prestazioni

EventLimit vale 100.000 eventi per default, DroppedEventCount riporta l'overflow, e lo storage degli eventi cresce geometricamente così che il costo di append resti ammortizzato costante

Lo schema JSON è hotpdf-deterministic-replay-v1; gli argomenti a 64 bit e i risultati interi sono codificati come stringhe decimali per preservare i valori esatti tra implementazioni JSON diverse

API correlate