refactor(compress): move stream result policy to Rust
Move the post-call ZSTD_compressStream2_c policy into Rust: adapter errors now short-circuit before buffer publication, successful calls publish buffer expectations before calculating pending output, and the private C context remains behind a callback projection. Add ABI assertions and ordering tests for both paths. Test Plan: git diff --cached --check; focused Rust tests added; full capped Rust/native/original-suite verification will run after the MT slice is integrated.
This commit is contained in:
@@ -774,6 +774,43 @@ size_t ZSTD_compressStream2_c(ZSTD_CCtx* cctx,
|
||||
ZSTD_outBuffer* output,
|
||||
ZSTD_inBuffer* input,
|
||||
ZSTD_EndDirective endOp);
|
||||
typedef void (*ZSTD_rust_compressStream2SetBufferExpectations_f)(
|
||||
void* context, const void* output, const void* input);
|
||||
typedef struct {
|
||||
void* callbackContext;
|
||||
ZSTD_rust_compressStream2SetBufferExpectations_f setBufferExpectations;
|
||||
const void* output;
|
||||
const void* input;
|
||||
size_t compressResult;
|
||||
size_t outBuffContentSize;
|
||||
size_t outBuffFlushedSize;
|
||||
} ZSTD_rust_compressStream2ResultPolicyState;
|
||||
size_t ZSTD_rust_compressStream2ResultPolicy(
|
||||
const ZSTD_rust_compressStream2ResultPolicyState* state);
|
||||
typedef char ZSTD_rust_compress_stream2_result_policy_state_layout[
|
||||
(offsetof(ZSTD_rust_compressStream2ResultPolicyState, callbackContext)
|
||||
== 0
|
||||
&& offsetof(ZSTD_rust_compressStream2ResultPolicyState,
|
||||
setBufferExpectations)
|
||||
== sizeof(void*)
|
||||
&& offsetof(ZSTD_rust_compressStream2ResultPolicyState, output)
|
||||
== 2 * sizeof(void*)
|
||||
&& offsetof(ZSTD_rust_compressStream2ResultPolicyState, input)
|
||||
== 3 * sizeof(void*)
|
||||
&& offsetof(ZSTD_rust_compressStream2ResultPolicyState,
|
||||
compressResult)
|
||||
== 4 * sizeof(void*)
|
||||
&& offsetof(ZSTD_rust_compressStream2ResultPolicyState,
|
||||
outBuffContentSize)
|
||||
== 5 * sizeof(void*)
|
||||
&& offsetof(ZSTD_rust_compressStream2ResultPolicyState,
|
||||
outBuffFlushedSize)
|
||||
== 6 * sizeof(void*)
|
||||
&& sizeof(ZSTD_rust_compressStream2SetBufferExpectations_f)
|
||||
== sizeof(void*)
|
||||
&& sizeof(ZSTD_rust_compressStream2ResultPolicyState)
|
||||
== 7 * sizeof(void*))
|
||||
? 1 : -1];
|
||||
typedef struct {
|
||||
size_t outputPos;
|
||||
size_t outputSize;
|
||||
@@ -8005,6 +8042,15 @@ ZSTD_setBufferExpectations(ZSTD_CCtx* cctx, const ZSTD_outBuffer* output, const
|
||||
input);
|
||||
}
|
||||
|
||||
static void ZSTD_rust_compressStream2_setBufferExpectations(
|
||||
void* context, const void* output, const void* input)
|
||||
{
|
||||
ZSTD_setBufferExpectations(
|
||||
(ZSTD_CCtx*)context,
|
||||
(const ZSTD_outBuffer*)output,
|
||||
(const ZSTD_inBuffer*)input);
|
||||
}
|
||||
|
||||
/* Validate that the input/output buffers match the expectations set by
|
||||
* ZSTD_setBufferExpectations.
|
||||
*/
|
||||
@@ -8529,10 +8575,27 @@ size_t ZSTD_compressStream2_c( ZSTD_CCtx* cctx,
|
||||
return flushMin;
|
||||
}
|
||||
#endif /* ZSTD_MULTITHREAD */
|
||||
FORWARD_IF_ERROR( ZSTD_compressStream_generic(cctx, output, input, endOp) , "");
|
||||
DEBUGLOG(5, "completed ZSTD_compressStream2");
|
||||
ZSTD_setBufferExpectations(cctx, output, input);
|
||||
return cctx->outBuffContentSize - cctx->outBuffFlushedSize; /* remaining to flush */
|
||||
{ size_t const compressResult =
|
||||
ZSTD_compressStream_generic(cctx, output, input, endOp);
|
||||
if (!ERR_isError(compressResult)) {
|
||||
DEBUGLOG(5, "completed ZSTD_compressStream2");
|
||||
}
|
||||
{ ZSTD_rust_compressStream2ResultPolicyState const state = {
|
||||
cctx,
|
||||
ZSTD_rust_compressStream2_setBufferExpectations,
|
||||
output,
|
||||
input,
|
||||
compressResult,
|
||||
cctx->outBuffContentSize,
|
||||
cctx->outBuffFlushedSize
|
||||
};
|
||||
{ size_t const policyResult =
|
||||
ZSTD_rust_compressStream2ResultPolicy(&state);
|
||||
FORWARD_IF_ERROR(policyResult, "");
|
||||
return policyResult;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
size_t ZSTD_compressStream2_simpleArgs (
|
||||
|
||||
Reference in New Issue
Block a user