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
- Los puntos de comprobación de cancelación registran el nombre de la operación y si se solicitó la cancelación
- Las sondas progresivas de acceso aleatorio registran el desplazamiento de byte exacto, el recuento de bytes y el resultado de disponibilidad
- Los ayudantes de devolución de llamada de booleano e entero de 64 bits registran un nombre de devolución de llamada estable, dos valores de contexto definidos por el llamador y el resultado devuelto
- El filtrado de anotaciones y la cancelación de renderizado por teselas usan el registro de reproducción automáticamente al registrar o reproducir mediante
THotPDF
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