Reproducción determinista

THotPDF.DeterministicReplayLog captura las decisiones externas que pueden hacer que una operación se comporte de forma distinta entre ejecuciones y luego sustituye los resultados registrados durante la reproducción

Decisiones capturadas

Registro y reproducción

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;

Ordenación y validación

Cada evento lleva un número de secuencia monótono, un tipo de evento, un nombre, dos argumentos con signo de 64 bits y un resultado tipado

La reproducción consume los eventos en orden y valida su firma completa antes de devolver el resultado registrado; el modo estricto lanza EHPDFDeterministicReplayMismatch al agotarse o divergir, mientras que el modo no estricto conserva un recuento de discrepancias y un diagnóstico y usa el resultado observado

CompleteReplay solo tiene éxito después de que cada evento conservado se haya consumido sin discrepancias ni eventos de registro descartados

Límites y rendimiento

EventLimit tiene como valor predeterminado 100 000 eventos, DroppedEventCount informa del desbordamiento y el almacenamiento de eventos crece geométricamente, de modo que el coste de añadir sigue siendo de tiempo constante amortizado

El esquema JSON es hotpdf-deterministic-replay-v1; los argumentos de 64 bits y los resultados enteros se codifican como cadenas decimales para conservar los valores exactos entre implementaciones JSON

APIs relacionadas