Reprodução determinística
THotPDF.DeterministicReplayLog regista as decisões externas que podem fazer uma operação comportar-se de forma diferente entre execuções e depois substitui-as pelos resultados gravados durante o replay
Captured decisions
- Os checkpoints de cancelamento registam o nome da operação e se o cancelamento foi pedido
- As sondas de acesso aleatório progressivo registam o offset exato em bytes, o número de bytes e o resultado de disponibilidade
- Os helpers de callback booleanos e de inteiros de 64 bits registam um nome de callback estável, dois valores de contexto definidos por quem chama e o resultado devolvido
- A filtragem de anotações e o cancelamento do tile-render usam automaticamente o replay log quando se grava ou reproduz através de
THotPDF
Record and 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;
Ordering and validation
Cada evento traz um número de sequência monótono, o tipo de evento, o nome, dois argumentos com sinal de 64 bits e um resultado tipado
O replay consome os eventos por ordem e valida a respetiva assinatura completa antes de devolver o resultado gravado; o modo strict lança EHPDFDeterministicReplayMismatch em caso de esgotamento ou divergência, enquanto o modo não strict guarda uma contagem de incoerências e um diagnóstico e usa o resultado observado
CompleteReplay succeeds only after every retained event has been consumed without mismatches or dropped recording events
Bounds and performance
EventLimit defaults to 100,000 events, DroppedEventCount reports overflow, and event storage grows geometrically so append cost remains amortised constant time
O schema JSON é hotpdf-deterministic-replay-v1; os argumentos de 64 bits e os resultados inteiros são codificados como strings decimais, para preservar os valores exatos entre implementações de JSON