Reprodução determinística
THotPDF.DeterministicReplayLog captura decisões externas que podem fazer uma operação se comportar de forma diferente entre execuções e, em seguida, substitui os resultados gravados durante a reprodução
Decisões capturadas
- Pontos de verificação de cancelamento gravam o nome da operação e se o cancelamento foi solicitado
- Sondas progressivas de acesso aleatório gravam o deslocamento de byte exato, a contagem de bytes e o resultado de disponibilidade
- Auxiliares de callback booleanos e de inteiro de 64 bits gravam um nome de callback estável, dois valores de contexto definidos pelo chamador e o resultado retornado
- A filtragem de anotação e o cancelamento de renderização de bloco usam o log de reprodução automaticamente ao gravar ou reproduzir por meio de
THotPDF
Gravar e reproduzir
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;
Ordenação e validação
Cada evento carrega um número de sequência monotônico, tipo de evento, nome, dois argumentos assinados de 64 bits e um resultado tipado
A reprodução consome eventos em ordem e valida sua assinatura completa antes de retornar o resultado gravado; o modo estrito gera EHPDFDeterministicReplayMismatch em esgotamento ou divergência, enquanto o modo não estrito retém uma contagem de incompatibilidade e diagnóstico e usa o resultado observado
CompleteReplay só tem sucesso depois que cada evento retido foi consumido sem incompatibilidades ou eventos de gravação descartados
Limites e desempenho
EventLimit assume o padrão de 100.000 eventos, DroppedEventCount relata estouro e o armazenamento de eventos cresce geometricamente para que o custo de anexação permaneça em tempo constante amortizado
O esquema JSON é hotpdf-deterministic-replay-v1; argumentos de 64 bits e resultados inteiros são codificados como strings decimais para preservar valores exatos entre implementações JSON