added POOL_tryAdd()
This commit is contained in:
@@ -582,10 +582,16 @@ size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, const ZSTD_CDict*
|
|||||||
If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN.
|
If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN.
|
||||||
If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end.
|
If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end.
|
||||||
For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs,
|
For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs,
|
||||||
but it may change to mean "empty" in some future version, so prefer using macro ZSTD_CONTENTSIZE_UNKNOWN.
|
but it will change to mean "empty" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead.
|
||||||
@return : 0, or an error code (which can be tested using ZSTD_isError())
|
@return : 0, or an error code (which can be tested using ZSTD_isError())
|
||||||
</p></pre><BR>
|
</p></pre><BR>
|
||||||
|
|
||||||
|
<pre><b>typedef struct {
|
||||||
|
unsigned long long ingested;
|
||||||
|
unsigned long long consumed;
|
||||||
|
unsigned long long produced;
|
||||||
|
} ZSTD_frameProgression;
|
||||||
|
</b></pre><BR>
|
||||||
<h3>Advanced Streaming decompression functions</h3><pre></pre><b><pre>typedef enum { DStream_p_maxWindowSize } ZSTD_DStreamParameter_e;
|
<h3>Advanced Streaming decompression functions</h3><pre></pre><b><pre>typedef enum { DStream_p_maxWindowSize } ZSTD_DStreamParameter_e;
|
||||||
size_t ZSTD_setDStreamParameter(ZSTD_DStream* zds, ZSTD_DStreamParameter_e paramType, unsigned paramValue); </b>/* obsolete : this API will be removed in a future version */<b>
|
size_t ZSTD_setDStreamParameter(ZSTD_DStream* zds, ZSTD_DStreamParameter_e paramType, unsigned paramValue); </b>/* obsolete : this API will be removed in a future version */<b>
|
||||||
size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); </b>/**< note: no dictionary will be used if dict == NULL or dictSize < 8 */<b>
|
size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); </b>/**< note: no dictionary will be used if dict == NULL or dictSize < 8 */<b>
|
||||||
|
|||||||
+47
-18
@@ -12,6 +12,7 @@
|
|||||||
/* ====== Dependencies ======= */
|
/* ====== Dependencies ======= */
|
||||||
#include <stddef.h> /* size_t */
|
#include <stddef.h> /* size_t */
|
||||||
#include "pool.h"
|
#include "pool.h"
|
||||||
|
#include "zstd_internal.h" /* ZSTD_malloc, ZSTD_free */
|
||||||
|
|
||||||
/* ====== Compiler specifics ====== */
|
/* ====== Compiler specifics ====== */
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
@@ -193,32 +194,54 @@ static int isQueueFull(POOL_ctx const* ctx) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void POOL_add(void* ctxVoid, POOL_function function, void *opaque) {
|
|
||||||
POOL_ctx* const ctx = (POOL_ctx*)ctxVoid;
|
|
||||||
if (!ctx) { return; }
|
|
||||||
|
|
||||||
ZSTD_pthread_mutex_lock(&ctx->queueMutex);
|
static void POOL_add_internal(POOL_ctx* ctx, POOL_function function, void *opaque)
|
||||||
{ POOL_job const job = {function, opaque};
|
{
|
||||||
|
POOL_job const job = {function, opaque};
|
||||||
|
assert(ctx != NULL);
|
||||||
|
if (ctx->shutdown) return;
|
||||||
|
|
||||||
/* Wait until there is space in the queue for the new job */
|
|
||||||
while (isQueueFull(ctx) && !ctx->shutdown) {
|
|
||||||
ZSTD_pthread_cond_wait(&ctx->queuePushCond, &ctx->queueMutex);
|
|
||||||
}
|
|
||||||
/* The queue is still going => there is space */
|
|
||||||
if (!ctx->shutdown) {
|
|
||||||
ctx->queueEmpty = 0;
|
ctx->queueEmpty = 0;
|
||||||
ctx->queue[ctx->queueTail] = job;
|
ctx->queue[ctx->queueTail] = job;
|
||||||
ctx->queueTail = (ctx->queueTail + 1) % ctx->queueSize;
|
ctx->queueTail = (ctx->queueTail + 1) % ctx->queueSize;
|
||||||
}
|
|
||||||
}
|
|
||||||
ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
|
|
||||||
ZSTD_pthread_cond_signal(&ctx->queuePopCond);
|
ZSTD_pthread_cond_signal(&ctx->queuePopCond);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* ZSTD_MULTITHREAD not defined */
|
void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque)
|
||||||
/* No multi-threading support */
|
{
|
||||||
|
assert(ctx != NULL);
|
||||||
|
ZSTD_pthread_mutex_lock(&ctx->queueMutex);
|
||||||
|
/* Wait until there is space in the queue for the new job */
|
||||||
|
while (isQueueFull(ctx) && (!ctx->shutdown)) {
|
||||||
|
ZSTD_pthread_cond_wait(&ctx->queuePushCond, &ctx->queueMutex);
|
||||||
|
}
|
||||||
|
POOL_add_internal(ctx, function, opaque);
|
||||||
|
ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
|
||||||
|
}
|
||||||
|
|
||||||
/* We don't need any data, but if it is empty malloc() might return NULL. */
|
|
||||||
|
int POOL_tryAdd(POOL_ctx* ctx, POOL_function function, void* opaque)
|
||||||
|
{
|
||||||
|
assert(ctx != NULL);
|
||||||
|
ZSTD_pthread_mutex_lock(&ctx->queueMutex);
|
||||||
|
if (isQueueFull(ctx)) {
|
||||||
|
ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
POOL_add_internal(ctx, function, opaque);
|
||||||
|
ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#else /* ZSTD_MULTITHREAD not defined */
|
||||||
|
|
||||||
|
/* ========================== */
|
||||||
|
/* No multi-threading support */
|
||||||
|
/* ========================== */
|
||||||
|
|
||||||
|
|
||||||
|
/* We don't need any data, but if it is empty, malloc() might return NULL. */
|
||||||
struct POOL_ctx_s {
|
struct POOL_ctx_s {
|
||||||
int dummy;
|
int dummy;
|
||||||
};
|
};
|
||||||
@@ -240,11 +263,17 @@ void POOL_free(POOL_ctx* ctx) {
|
|||||||
(void)ctx;
|
(void)ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
void POOL_add(void* ctx, POOL_function function, void* opaque) {
|
void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque) {
|
||||||
(void)ctx;
|
(void)ctx;
|
||||||
function(opaque);
|
function(opaque);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int POOL_tryAdd(POOL_ctx* ctx, POOL_function function, void* opaque) {
|
||||||
|
(void)ctx;
|
||||||
|
function(opaque);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
size_t POOL_sizeof(POOL_ctx* ctx) {
|
size_t POOL_sizeof(POOL_ctx* ctx) {
|
||||||
if (ctx==NULL) return 0; /* supports sizeof NULL */
|
if (ctx==NULL) return 0; /* supports sizeof NULL */
|
||||||
assert(ctx == &g_ctx);
|
assert(ctx == &g_ctx);
|
||||||
|
|||||||
+18
-9
@@ -17,7 +17,8 @@ extern "C" {
|
|||||||
|
|
||||||
|
|
||||||
#include <stddef.h> /* size_t */
|
#include <stddef.h> /* size_t */
|
||||||
#include "zstd_internal.h" /* ZSTD_customMem */
|
#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_customMem */
|
||||||
|
#include "zstd.h"
|
||||||
|
|
||||||
typedef struct POOL_ctx_s POOL_ctx;
|
typedef struct POOL_ctx_s POOL_ctx;
|
||||||
|
|
||||||
@@ -27,35 +28,43 @@ typedef struct POOL_ctx_s POOL_ctx;
|
|||||||
* The maximum number of queued jobs before blocking is `queueSize`.
|
* The maximum number of queued jobs before blocking is `queueSize`.
|
||||||
* @return : POOL_ctx pointer on success, else NULL.
|
* @return : POOL_ctx pointer on success, else NULL.
|
||||||
*/
|
*/
|
||||||
POOL_ctx *POOL_create(size_t numThreads, size_t queueSize);
|
POOL_ctx* POOL_create(size_t numThreads, size_t queueSize);
|
||||||
|
|
||||||
POOL_ctx *POOL_create_advanced(size_t numThreads, size_t queueSize, ZSTD_customMem customMem);
|
POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, ZSTD_customMem customMem);
|
||||||
|
|
||||||
/*! POOL_free() :
|
/*! POOL_free() :
|
||||||
Free a thread pool returned by POOL_create().
|
Free a thread pool returned by POOL_create().
|
||||||
*/
|
*/
|
||||||
void POOL_free(POOL_ctx *ctx);
|
void POOL_free(POOL_ctx* ctx);
|
||||||
|
|
||||||
/*! POOL_sizeof() :
|
/*! POOL_sizeof() :
|
||||||
return memory usage of pool returned by POOL_create().
|
return memory usage of pool returned by POOL_create().
|
||||||
*/
|
*/
|
||||||
size_t POOL_sizeof(POOL_ctx *ctx);
|
size_t POOL_sizeof(POOL_ctx* ctx);
|
||||||
|
|
||||||
/*! POOL_function :
|
/*! POOL_function :
|
||||||
The function type that can be added to a thread pool.
|
The function type that can be added to a thread pool.
|
||||||
*/
|
*/
|
||||||
typedef void (*POOL_function)(void *);
|
typedef void (*POOL_function)(void*);
|
||||||
/*! POOL_add_function :
|
/*! POOL_add_function :
|
||||||
The function type for a generic thread pool add function.
|
The function type for a generic thread pool add function.
|
||||||
*/
|
*/
|
||||||
typedef void (*POOL_add_function)(void *, POOL_function, void *);
|
typedef void (*POOL_add_function)(void*, POOL_function, void*);
|
||||||
|
|
||||||
/*! POOL_add() :
|
/*! POOL_add() :
|
||||||
Add the job `function(opaque)` to the thread pool.
|
Add the job `function(opaque)` to the thread pool. `ctx` must be valid.
|
||||||
Possibly blocks until there is room in the queue.
|
Possibly blocks until there is room in the queue.
|
||||||
Note : The function may be executed asynchronously, so `opaque` must live until the function has been completed.
|
Note : The function may be executed asynchronously, so `opaque` must live until the function has been completed.
|
||||||
*/
|
*/
|
||||||
void POOL_add(void *ctx, POOL_function function, void *opaque);
|
void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque);
|
||||||
|
|
||||||
|
|
||||||
|
/*! POOL_tryAdd() :
|
||||||
|
Add the job `function(opaque)` to the thread pool if a worker is available.
|
||||||
|
return immediately otherwise.
|
||||||
|
@return : 1 if successful, 0 if not.
|
||||||
|
*/
|
||||||
|
int POOL_tryAdd(POOL_ctx* ctx, POOL_function function, void* opaque);
|
||||||
|
|
||||||
|
|
||||||
#if defined (__cplusplus)
|
#if defined (__cplusplus)
|
||||||
|
|||||||
Reference in New Issue
Block a user