2017-08-18 23:52:05 +00:00
/*
2020-03-26 22:19:05 +00:00
* Copyright ( c ) 2016 - 2020 , Yann Collet , Facebook , Inc .
2017-01-20 22:00:41 +00:00
* All rights reserved .
*
2017-08-18 23:52:05 +00:00
* This source code is licensed under both the BSD - style license ( found in the
* LICENSE file in the root directory of this source tree ) and the GPLv2 ( found
* in the COPYING file in the root directory of this source tree ) .
2017-09-08 07:09:23 +00:00
* You may select , at your option , one of the above - listed licenses .
2017-01-20 22:00:41 +00:00
*/
2016-12-27 06:19:36 +00:00
2017-01-28 00:00:19 +00:00
# ifndef ZSTDMT_COMPRESS_H
# define ZSTDMT_COMPRESS_H
# if defined (__cplusplus)
extern " C " {
# endif
2017-01-25 01:02:26 +00:00
2017-07-06 00:20:52 +00:00
/* Note : This is an internal API.
2019-04-08 01:47:52 +00:00
* These APIs used to be exposed with ZSTDLIB_API ,
2017-07-12 00:18:26 +00:00
* because it used to be the only way to invoke MT compression .
2019-04-16 05:49:44 +00:00
* Now , it ' s recommended to use ZSTD_compress2 and ZSTD_compressStream2 ( )
* instead .
2019-04-08 01:47:52 +00:00
*
* If you depend on these APIs and can ' t switch , then define
* ZSTD_LEGACY_MULTITHREADED_API when making the dynamic library .
* However , we may completely remove these functions in a future
* release , so please switch soon .
2019-04-16 05:49:44 +00:00
*
* This API requires ZSTD_MULTITHREAD to be defined during compilation ,
* otherwise ZSTDMT_createCCtx * ( ) will fail .
2019-04-08 01:47:52 +00:00
*/
# ifdef ZSTD_LEGACY_MULTITHREADED_API
# define ZSTDMT_API ZSTDLIB_API
# else
# define ZSTDMT_API
# endif
2017-01-25 01:02:26 +00:00
2017-01-12 00:25:46 +00:00
/* === Dependencies === */
2020-08-07 03:18:05 +00:00
# include "../common/zstd_deps.h" /* size_t */
2017-01-19 23:32:07 +00:00
# define ZSTD_STATIC_LINKING_ONLY /* ZSTD_parameters */
2020-05-01 20:07:57 +00:00
# include "../zstd.h" /* ZSTD_inBuffer, ZSTD_outBuffer, ZSTDLIB_API */
2016-12-27 06:19:36 +00:00
2018-11-20 23:13:27 +00:00
/* === Constants === */
2018-12-12 01:41:42 +00:00
# ifndef ZSTDMT_NBWORKERS_MAX
# define ZSTDMT_NBWORKERS_MAX 200
# endif
2018-11-21 00:06:00 +00:00
# ifndef ZSTDMT_JOBSIZE_MIN
2018-12-12 01:41:42 +00:00
# define ZSTDMT_JOBSIZE_MIN (1 MB)
2018-11-21 00:06:00 +00:00
# endif
2019-07-12 22:45:18 +00:00
# define ZSTDMT_JOBLOG_MAX (MEM_32bits() ? 29 : 30)
2018-12-13 20:14:36 +00:00
# define ZSTDMT_JOBSIZE_MAX (MEM_32bits() ? (512 MB) : (1024 MB))
2018-11-20 23:13:27 +00:00
2017-06-02 00:56:14 +00:00
/* === Memory management === */
2017-01-12 00:25:46 +00:00
typedef struct ZSTDMT_CCtx_s ZSTDMT_CCtx ;
2019-04-16 05:49:44 +00:00
/* Requires ZSTD_MULTITHREAD to be defined during compilation, otherwise it will return NULL. */
2019-04-08 01:47:52 +00:00
ZSTDMT_API ZSTDMT_CCtx * ZSTDMT_createCCtx ( unsigned nbWorkers ) ;
2019-04-16 05:49:44 +00:00
/* Requires ZSTD_MULTITHREAD to be defined during compilation, otherwise it will return NULL. */
2019-04-08 01:47:52 +00:00
ZSTDMT_API ZSTDMT_CCtx * ZSTDMT_createCCtx_advanced ( unsigned nbWorkers ,
2017-06-02 00:56:14 +00:00
ZSTD_customMem cMem ) ;
2019-04-08 01:47:52 +00:00
ZSTDMT_API size_t ZSTDMT_freeCCtx ( ZSTDMT_CCtx * mtctx ) ;
2017-06-02 00:56:14 +00:00
2019-04-08 01:47:52 +00:00
ZSTDMT_API size_t ZSTDMT_sizeof_CCtx ( ZSTDMT_CCtx * mtctx ) ;
2017-06-02 00:56:14 +00:00
2018-02-02 00:13:31 +00:00
/* === Simple one-pass compression function === */
2016-12-27 06:19:36 +00:00
2019-04-08 01:47:52 +00:00
ZSTDMT_API size_t ZSTDMT_compressCCtx ( ZSTDMT_CCtx * mtctx ,
2017-06-02 20:47:11 +00:00
void * dst , size_t dstCapacity ,
const void * src , size_t srcSize ,
int compressionLevel ) ;
2017-01-12 00:25:46 +00:00
2017-06-30 21:51:01 +00:00
2017-01-12 00:25:46 +00:00
/* === Streaming functions === */
2019-04-08 01:47:52 +00:00
ZSTDMT_API size_t ZSTDMT_initCStream ( ZSTDMT_CCtx * mtctx , int compressionLevel ) ;
ZSTDMT_API size_t ZSTDMT_resetCStream ( ZSTDMT_CCtx * mtctx , unsigned long long pledgedSrcSize ) ; /**< if srcSize is not known at reset time, use ZSTD_CONTENTSIZE_UNKNOWN. Note: for compatibility with older programs, 0 means the same as ZSTD_CONTENTSIZE_UNKNOWN, but it will change in the future to mean "empty" */
2017-01-25 01:02:26 +00:00
2019-04-08 01:47:52 +00:00
ZSTDMT_API size_t ZSTDMT_nextInputSizeHint ( const ZSTDMT_CCtx * mtctx ) ;
ZSTDMT_API size_t ZSTDMT_compressStream ( ZSTDMT_CCtx * mtctx , ZSTD_outBuffer * output , ZSTD_inBuffer * input ) ;
2017-01-25 01:02:26 +00:00
2019-04-08 01:47:52 +00:00
ZSTDMT_API size_t ZSTDMT_flushStream ( ZSTDMT_CCtx * mtctx , ZSTD_outBuffer * output ) ; /**< @return : 0 == all flushed; >0 : still some data to be flushed; or an error code (ZSTD_isError()) */
ZSTDMT_API size_t ZSTDMT_endStream ( ZSTDMT_CCtx * mtctx , ZSTD_outBuffer * output ) ; /**< @return : 0 == all flushed; >0 : still some data to be flushed; or an error code (ZSTD_isError()) */
2017-01-25 01:02:26 +00:00
/* === Advanced functions and parameters === */
2019-04-08 01:47:52 +00:00
ZSTDMT_API size_t ZSTDMT_compress_advanced ( ZSTDMT_CCtx * mtctx ,
void * dst , size_t dstCapacity ,
const void * src , size_t srcSize ,
const ZSTD_CDict * cdict ,
ZSTD_parameters params ,
int overlapLog ) ;
2017-06-30 21:51:01 +00:00
2019-04-08 01:47:52 +00:00
ZSTDMT_API size_t ZSTDMT_initCStream_advanced ( ZSTDMT_CCtx * mtctx ,
2017-06-03 01:20:48 +00:00
const void * dict , size_t dictSize , /* dict can be released after init, a local copy is preserved within zcs */
ZSTD_parameters params ,
unsigned long long pledgedSrcSize ) ; /* pledgedSrcSize is optional and can be zero == unknown */
2017-01-19 23:32:07 +00:00
2019-04-08 01:47:52 +00:00
ZSTDMT_API size_t ZSTDMT_initCStream_usingCDict ( ZSTDMT_CCtx * mtctx ,
2017-06-03 08:15:02 +00:00
const ZSTD_CDict * cdict ,
ZSTD_frameParameters fparams ,
unsigned long long pledgedSrcSize ) ; /* note : zero means empty */
2017-05-31 00:11:39 +00:00
2017-08-25 23:13:40 +00:00
/* ZSTDMT_parameter :
2017-01-25 01:02:26 +00:00
* List of parameters that can be set using ZSTDMT_setMTCtxParameter ( ) */
2017-01-26 00:39:03 +00:00
typedef enum {
2018-12-12 01:41:42 +00:00
ZSTDMT_p_jobSize , /* Each job is compressed in parallel. By default, this value is dynamically determined depending on compression parameters. Can be set explicitly here. */
2019-04-12 18:18:11 +00:00
ZSTDMT_p_overlapLog , /* Each job may reload a part of previous job to enhance compression ratio; 0 == no overlap, 6(default) == use 1/8th of window, >=9 == use full window. This is a "sticky" parameter : its value will be re-used on next compression job */
2018-12-12 01:41:42 +00:00
ZSTDMT_p_rsyncable /* Enables rsyncable mode. */
2017-08-25 23:13:40 +00:00
} ZSTDMT_parameter ;
2017-01-19 23:32:07 +00:00
2017-01-25 01:02:26 +00:00
/* ZSTDMT_setMTCtxParameter() :
* allow setting individual parameters , one at a time , among a list of enums defined in ZSTDMT_parameter .
2017-12-13 00:20:51 +00:00
* The function must be called typically after ZSTD_createCCtx ( ) but __before ZSTDMT_init * ( ) ! __
2017-01-25 01:02:26 +00:00
* Parameters not explicitly reset by ZSTDMT_init * ( ) remain the same in consecutive compression sessions .
* @ return : 0 , or an error code ( which can be tested using ZSTD_isError ( ) ) */
2019-04-08 01:47:52 +00:00
ZSTDMT_API size_t ZSTDMT_setMTCtxParameter ( ZSTDMT_CCtx * mtctx , ZSTDMT_parameter parameter , int value ) ;
2017-01-28 00:00:19 +00:00
2018-06-25 22:21:08 +00:00
/* ZSTDMT_getMTCtxParameter() :
* Query the ZSTDMT_CCtx for a parameter value .
* @ return : 0 , or an error code ( which can be tested using ZSTD_isError ( ) ) */
2019-04-08 01:47:52 +00:00
ZSTDMT_API size_t ZSTDMT_getMTCtxParameter ( ZSTDMT_CCtx * mtctx , ZSTDMT_parameter parameter , int * value ) ;
2018-06-25 22:21:08 +00:00
2017-01-28 00:00:19 +00:00
2017-06-06 01:32:48 +00:00
/*! ZSTDMT_compressStream_generic() :
2018-01-20 06:11:11 +00:00
* Combines ZSTDMT_compressStream ( ) with optional ZSTDMT_flushStream ( ) or ZSTDMT_endStream ( )
2017-06-20 21:11:49 +00:00
* depending on flush directive .
2017-06-06 01:32:48 +00:00
* @ return : minimum amount of data still to be flushed
* 0 if fully flushed
2018-01-20 06:11:11 +00:00
* or an error code
* note : needs to be init using any ZSTD_initCStream * ( ) variant */
2019-04-08 01:47:52 +00:00
ZSTDMT_API size_t ZSTDMT_compressStream_generic ( ZSTDMT_CCtx * mtctx ,
2017-06-06 01:32:48 +00:00
ZSTD_outBuffer * output ,
ZSTD_inBuffer * input ,
ZSTD_EndDirective endOp ) ;
2018-02-02 00:13:31 +00:00
/* ========================================================
* = = = Private interface , for use by ZSTD_compress . c = = =
* = = = Not exposed in libzstd . Never invoke directly = = =
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
2017-09-11 21:09:34 +00:00
2018-08-18 01:11:54 +00:00
/*! ZSTDMT_toFlushNow()
* Tell how many bytes are ready to be flushed immediately .
* Probe the oldest active job ( not yet entirely flushed ) and check its output buffer .
* If return 0 , it means there is no active job ,
* or , it means oldest job is still active , but everything produced has been flushed so far ,
* therefore flushing is limited by speed of oldest job . */
size_t ZSTDMT_toFlushNow ( ZSTDMT_CCtx * mtctx ) ;
/*! ZSTDMT_CCtxParam_setMTCtxParameter()
* like ZSTDMT_setMTCtxParameter ( ) , but into a ZSTD_CCtx_Params */
2018-12-12 01:41:42 +00:00
size_t ZSTDMT_CCtxParam_setMTCtxParameter ( ZSTD_CCtx_params * params , ZSTDMT_parameter parameter , int value ) ;
2017-09-11 21:09:34 +00:00
2018-08-18 01:11:54 +00:00
/*! ZSTDMT_CCtxParam_setNbWorkers()
* Set nbWorkers , and clamp it .
* Also reset jobSize and overlapLog */
2018-02-02 03:29:30 +00:00
size_t ZSTDMT_CCtxParam_setNbWorkers ( ZSTD_CCtx_params * params , unsigned nbWorkers ) ;
2017-09-11 21:09:34 +00:00
2018-02-02 23:58:13 +00:00
/*! ZSTDMT_updateCParams_whileCompressing() :
2018-03-19 21:41:23 +00:00
* Updates only a selected set of compression parameters , to remain compatible with current frame .
2018-02-02 22:24:56 +00:00
* New parameters will be applied to next compression job . */
2018-03-19 21:41:23 +00:00
void ZSTDMT_updateCParams_whileCompressing ( ZSTDMT_CCtx * mtctx , const ZSTD_CCtx_params * cctxParams ) ;
2018-02-02 00:13:31 +00:00
2018-08-18 01:11:54 +00:00
/*! ZSTDMT_getFrameProgression():
* tells how much data has been consumed ( input ) and produced ( output ) for current frame .
* able to count progression inside worker threads .
2018-01-18 00:39:02 +00:00
*/
ZSTD_frameProgression ZSTDMT_getFrameProgression ( ZSTDMT_CCtx * mtctx ) ;
2017-09-11 21:09:34 +00:00
/*! ZSTDMT_initCStream_internal() :
* Private use only . Init streaming operation .
* expects params to be valid .
* must receive dict , or cdict , or none , but not both .
* @ return : 0 , or an error code */
size_t ZSTDMT_initCStream_internal ( ZSTDMT_CCtx * zcs ,
2018-03-20 22:13:14 +00:00
const void * dict , size_t dictSize , ZSTD_dictContentType_e dictContentType ,
2017-09-11 21:09:34 +00:00
const ZSTD_CDict * cdict ,
ZSTD_CCtx_params params , unsigned long long pledgedSrcSize ) ;
2017-06-06 01:32:48 +00:00
2017-01-28 00:00:19 +00:00
# if defined (__cplusplus)
}
# endif
# endif /* ZSTDMT_COMPRESS_H */