BMK_benchOutcome_t BMK_benchMemAdvanced()

in programs/benchzstd.c [557:645]


BMK_benchOutcome_t BMK_benchMemAdvanced(const void* srcBuffer, size_t srcSize,
                        void* dstBuffer, size_t dstCapacity,
                        const size_t* fileSizes, unsigned nbFiles,
                        int cLevel, const ZSTD_compressionParameters* comprParams,
                        const void* dictBuffer, size_t dictBufferSize,
                        int displayLevel, const char* displayName, const BMK_advancedParams_t* adv)

{
    int const dstParamsError = !dstBuffer ^ !dstCapacity;  /* must be both NULL or none */

    size_t const blockSize = ((adv->blockSize>=32 && (adv->mode != BMK_decodeOnly)) ? adv->blockSize : srcSize) + (!srcSize) /* avoid div by 0 */ ;
    U32 const maxNbBlocks = (U32) ((srcSize + (blockSize-1)) / blockSize) + nbFiles;

    /* these are the blockTable parameters, just split up */
    const void ** const srcPtrs = (const void**)malloc(maxNbBlocks * sizeof(void*));
    size_t* const srcSizes = (size_t*)malloc(maxNbBlocks * sizeof(size_t));


    void ** const cPtrs = (void**)malloc(maxNbBlocks * sizeof(void*));
    size_t* const cSizes = (size_t*)malloc(maxNbBlocks * sizeof(size_t));
    size_t* const cCapacities = (size_t*)malloc(maxNbBlocks * sizeof(size_t));

    void ** const resPtrs = (void**)malloc(maxNbBlocks * sizeof(void*));
    size_t* const resSizes = (size_t*)malloc(maxNbBlocks * sizeof(size_t));

    BMK_timedFnState_t* timeStateCompress = BMK_createTimedFnState(adv->nbSeconds * 1000, BMK_RUNTEST_DEFAULT_MS);
    BMK_timedFnState_t* timeStateDecompress = BMK_createTimedFnState(adv->nbSeconds * 1000, BMK_RUNTEST_DEFAULT_MS);

    ZSTD_CCtx* const cctx = ZSTD_createCCtx();
    ZSTD_DCtx* const dctx = ZSTD_createDCtx();

    const size_t maxCompressedSize = dstCapacity ? dstCapacity : ZSTD_compressBound(srcSize) + (maxNbBlocks * 1024);

    void* const internalDstBuffer = dstBuffer ? NULL : malloc(maxCompressedSize);
    void* const compressedBuffer = dstBuffer ? dstBuffer : internalDstBuffer;

    BMK_benchOutcome_t outcome = BMK_benchOutcome_error();  /* error by default */

    void* resultBuffer = srcSize ? malloc(srcSize) : NULL;

    int allocationincomplete = !srcPtrs || !srcSizes || !cPtrs ||
        !cSizes || !cCapacities || !resPtrs || !resSizes ||
        !timeStateCompress || !timeStateDecompress ||
        !cctx || !dctx ||
        !compressedBuffer || !resultBuffer;


    if (!allocationincomplete && !dstParamsError) {
        outcome = BMK_benchMemAdvancedNoAlloc(srcPtrs, srcSizes,
                                            cPtrs, cCapacities, cSizes,
                                            resPtrs, resSizes,
                                            &resultBuffer,
                                            compressedBuffer, maxCompressedSize,
                                            timeStateCompress, timeStateDecompress,
                                            srcBuffer, srcSize,
                                            fileSizes, nbFiles,
                                            cLevel, comprParams,
                                            dictBuffer, dictBufferSize,
                                            cctx, dctx,
                                            displayLevel, displayName, adv);
    }

    /* clean up */
    BMK_freeTimedFnState(timeStateCompress);
    BMK_freeTimedFnState(timeStateDecompress);

    ZSTD_freeCCtx(cctx);
    ZSTD_freeDCtx(dctx);

    free(internalDstBuffer);
    free(resultBuffer);

    free((void*)srcPtrs);
    free(srcSizes);
    free(cPtrs);
    free(cSizes);
    free(cCapacities);
    free(resPtrs);
    free(resSizes);

    if(allocationincomplete) {
        RETURN_ERROR(31, BMK_benchOutcome_t, "allocation error : not enough memory");
    }

    if(dstParamsError) {
        RETURN_ERROR(32, BMK_benchOutcome_t, "Dst parameters not coherent");
    }
    return outcome;
}