zstdlib 0.12.0-arm64-darwin → 0.13.0-arm64-darwin
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES.md +7 -0
- data/Rakefile +1 -1
- data/ext/zstdlib_c/extconf.rb +1 -1
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/allocations.h +1 -1
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/bitstream.h +49 -29
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/compiler.h +114 -22
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/cpu.h +36 -0
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/debug.c +6 -0
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/debug.h +20 -11
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/error_private.h +45 -36
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/fse.h +3 -2
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/fse_decompress.c +19 -17
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/huf.h +14 -1
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/mem.h +0 -9
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/pool.c +1 -1
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/pool.h +1 -1
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/portability_macros.h +2 -0
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/threading.c +8 -2
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/xxhash.c +5 -11
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/xxhash.h +2341 -1007
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/zstd_internal.h +5 -5
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/fse_compress.c +8 -7
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/huf_compress.c +54 -25
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress.c +282 -161
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_internal.h +29 -27
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_superblock.c +224 -113
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_cwksp.h +19 -13
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_double_fast.c +17 -5
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_double_fast.h +11 -0
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_fast.c +14 -6
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_lazy.c +129 -87
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_lazy.h +103 -28
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_ldm.c +8 -2
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_opt.c +216 -112
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_opt.h +31 -7
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstdmt_compress.c +94 -79
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/huf_decompress.c +188 -126
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/huf_decompress_amd64.S +38 -19
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_decompress.c +84 -32
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_decompress_block.c +231 -208
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_decompress_block.h +1 -1
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_decompress_internal.h +2 -0
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/zstd.h +129 -60
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzclose.c +1 -3
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzlib.c +20 -73
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzread.c +17 -58
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzwrite.c +18 -58
- data/lib/2.4/zstdlib_c.bundle +0 -0
- data/lib/2.5/zstdlib_c.bundle +0 -0
- data/lib/2.6/zstdlib_c.bundle +0 -0
- data/lib/2.7/zstdlib_c.bundle +0 -0
- data/lib/3.0/zstdlib_c.bundle +0 -0
- data/lib/3.1/zstdlib_c.bundle +0 -0
- data/lib/3.2/zstdlib_c.bundle +0 -0
- data/lib/3.3/zstdlib_c.bundle +0 -0
- metadata +75 -75
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/bits.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/entropy_common.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/error_private.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/threading.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/zstd_common.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/zstd_deps.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/zstd_trace.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/clevels.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/hist.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/hist.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_literals.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_literals.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_sequences.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_sequences.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_superblock.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_fast.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_ldm.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_ldm_geartab.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstdmt_compress.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_ddict.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_ddict.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/zdict.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/zstd_errors.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzcompatibility.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzguts.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/zstd_zlibwrapper.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/zstd_zlibwrapper.h +0 -0
@@ -17,30 +17,40 @@ extern "C" {
|
|
17
17
|
|
18
18
|
#include "zstd_compress_internal.h"
|
19
19
|
|
20
|
+
#if !defined(ZSTD_EXCLUDE_BTLAZY2_BLOCK_COMPRESSOR) \
|
21
|
+
|| !defined(ZSTD_EXCLUDE_BTOPT_BLOCK_COMPRESSOR) \
|
22
|
+
|| !defined(ZSTD_EXCLUDE_BTULTRA_BLOCK_COMPRESSOR)
|
20
23
|
/* used in ZSTD_loadDictionaryContent() */
|
21
24
|
void ZSTD_updateTree(ZSTD_matchState_t* ms, const BYTE* ip, const BYTE* iend);
|
25
|
+
#endif
|
22
26
|
|
27
|
+
#ifndef ZSTD_EXCLUDE_BTOPT_BLOCK_COMPRESSOR
|
23
28
|
size_t ZSTD_compressBlock_btopt(
|
24
29
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
25
30
|
void const* src, size_t srcSize);
|
26
|
-
size_t
|
31
|
+
size_t ZSTD_compressBlock_btopt_dictMatchState(
|
27
32
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
28
33
|
void const* src, size_t srcSize);
|
29
|
-
size_t
|
34
|
+
size_t ZSTD_compressBlock_btopt_extDict(
|
30
35
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
31
36
|
void const* src, size_t srcSize);
|
32
37
|
|
38
|
+
#define ZSTD_COMPRESSBLOCK_BTOPT ZSTD_compressBlock_btopt
|
39
|
+
#define ZSTD_COMPRESSBLOCK_BTOPT_DICTMATCHSTATE ZSTD_compressBlock_btopt_dictMatchState
|
40
|
+
#define ZSTD_COMPRESSBLOCK_BTOPT_EXTDICT ZSTD_compressBlock_btopt_extDict
|
41
|
+
#else
|
42
|
+
#define ZSTD_COMPRESSBLOCK_BTOPT NULL
|
43
|
+
#define ZSTD_COMPRESSBLOCK_BTOPT_DICTMATCHSTATE NULL
|
44
|
+
#define ZSTD_COMPRESSBLOCK_BTOPT_EXTDICT NULL
|
45
|
+
#endif
|
33
46
|
|
34
|
-
|
47
|
+
#ifndef ZSTD_EXCLUDE_BTULTRA_BLOCK_COMPRESSOR
|
48
|
+
size_t ZSTD_compressBlock_btultra(
|
35
49
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
36
50
|
void const* src, size_t srcSize);
|
37
51
|
size_t ZSTD_compressBlock_btultra_dictMatchState(
|
38
52
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
39
53
|
void const* src, size_t srcSize);
|
40
|
-
|
41
|
-
size_t ZSTD_compressBlock_btopt_extDict(
|
42
|
-
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
43
|
-
void const* src, size_t srcSize);
|
44
54
|
size_t ZSTD_compressBlock_btultra_extDict(
|
45
55
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
46
56
|
void const* src, size_t srcSize);
|
@@ -48,6 +58,20 @@ size_t ZSTD_compressBlock_btultra_extDict(
|
|
48
58
|
/* note : no btultra2 variant for extDict nor dictMatchState,
|
49
59
|
* because btultra2 is not meant to work with dictionaries
|
50
60
|
* and is only specific for the first block (no prefix) */
|
61
|
+
size_t ZSTD_compressBlock_btultra2(
|
62
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
63
|
+
void const* src, size_t srcSize);
|
64
|
+
|
65
|
+
#define ZSTD_COMPRESSBLOCK_BTULTRA ZSTD_compressBlock_btultra
|
66
|
+
#define ZSTD_COMPRESSBLOCK_BTULTRA_DICTMATCHSTATE ZSTD_compressBlock_btultra_dictMatchState
|
67
|
+
#define ZSTD_COMPRESSBLOCK_BTULTRA_EXTDICT ZSTD_compressBlock_btultra_extDict
|
68
|
+
#define ZSTD_COMPRESSBLOCK_BTULTRA2 ZSTD_compressBlock_btultra2
|
69
|
+
#else
|
70
|
+
#define ZSTD_COMPRESSBLOCK_BTULTRA NULL
|
71
|
+
#define ZSTD_COMPRESSBLOCK_BTULTRA_DICTMATCHSTATE NULL
|
72
|
+
#define ZSTD_COMPRESSBLOCK_BTULTRA_EXTDICT NULL
|
73
|
+
#define ZSTD_COMPRESSBLOCK_BTULTRA2 NULL
|
74
|
+
#endif
|
51
75
|
|
52
76
|
#if defined (__cplusplus)
|
53
77
|
}
|
@@ -15,17 +15,13 @@
|
|
15
15
|
#endif
|
16
16
|
|
17
17
|
|
18
|
-
/* ====== Constants ====== */
|
19
|
-
#define ZSTDMT_OVERLAPLOG_DEFAULT 0
|
20
|
-
|
21
|
-
|
22
18
|
/* ====== Dependencies ====== */
|
23
|
-
#include "../common/allocations.h"
|
19
|
+
#include "../common/allocations.h" /* ZSTD_customMalloc, ZSTD_customCalloc, ZSTD_customFree */
|
24
20
|
#include "../common/zstd_deps.h" /* ZSTD_memcpy, ZSTD_memset, INT_MAX, UINT_MAX */
|
25
21
|
#include "../common/mem.h" /* MEM_STATIC */
|
26
22
|
#include "../common/pool.h" /* threadpool */
|
27
23
|
#include "../common/threading.h" /* mutex */
|
28
|
-
#include "zstd_compress_internal.h"
|
24
|
+
#include "zstd_compress_internal.h" /* MIN, ERROR, ZSTD_*, ZSTD_highbit32 */
|
29
25
|
#include "zstd_ldm.h"
|
30
26
|
#include "zstdmt_compress.h"
|
31
27
|
|
@@ -44,12 +40,13 @@
|
|
44
40
|
# include <unistd.h>
|
45
41
|
# include <sys/times.h>
|
46
42
|
|
47
|
-
# define DEBUG_PRINTHEX(l,p,n)
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
43
|
+
# define DEBUG_PRINTHEX(l,p,n) \
|
44
|
+
do { \
|
45
|
+
unsigned debug_u; \
|
46
|
+
for (debug_u=0; debug_u<(n); debug_u++) \
|
47
|
+
RAWLOG(l, "%02X ", ((const unsigned char*)(p))[debug_u]); \
|
48
|
+
RAWLOG(l, " \n"); \
|
49
|
+
} while (0)
|
53
50
|
|
54
51
|
static unsigned long long GetCurrentClockTimeMicroseconds(void)
|
55
52
|
{
|
@@ -61,25 +58,28 @@ static unsigned long long GetCurrentClockTimeMicroseconds(void)
|
|
61
58
|
} }
|
62
59
|
|
63
60
|
#define MUTEX_WAIT_TIME_DLEVEL 6
|
64
|
-
#define ZSTD_PTHREAD_MUTEX_LOCK(mutex)
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
unsigned long long const
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
}
|
61
|
+
#define ZSTD_PTHREAD_MUTEX_LOCK(mutex) \
|
62
|
+
do { \
|
63
|
+
if (DEBUGLEVEL >= MUTEX_WAIT_TIME_DLEVEL) { \
|
64
|
+
unsigned long long const beforeTime = GetCurrentClockTimeMicroseconds(); \
|
65
|
+
ZSTD_pthread_mutex_lock(mutex); \
|
66
|
+
{ unsigned long long const afterTime = GetCurrentClockTimeMicroseconds(); \
|
67
|
+
unsigned long long const elapsedTime = (afterTime-beforeTime); \
|
68
|
+
if (elapsedTime > 1000) { \
|
69
|
+
/* or whatever threshold you like; I'm using 1 millisecond here */ \
|
70
|
+
DEBUGLOG(MUTEX_WAIT_TIME_DLEVEL, \
|
71
|
+
"Thread took %llu microseconds to acquire mutex %s \n", \
|
72
|
+
elapsedTime, #mutex); \
|
73
|
+
} } \
|
74
|
+
} else { \
|
75
|
+
ZSTD_pthread_mutex_lock(mutex); \
|
76
|
+
} \
|
77
|
+
} while (0)
|
78
78
|
|
79
79
|
#else
|
80
80
|
|
81
81
|
# define ZSTD_PTHREAD_MUTEX_LOCK(m) ZSTD_pthread_mutex_lock(m)
|
82
|
-
# define DEBUG_PRINTHEX(l,p,n) {}
|
82
|
+
# define DEBUG_PRINTHEX(l,p,n) do { } while (0)
|
83
83
|
|
84
84
|
#endif
|
85
85
|
|
@@ -100,18 +100,39 @@ typedef struct ZSTDMT_bufferPool_s {
|
|
100
100
|
unsigned totalBuffers;
|
101
101
|
unsigned nbBuffers;
|
102
102
|
ZSTD_customMem cMem;
|
103
|
-
buffer_t
|
103
|
+
buffer_t* buffers;
|
104
104
|
} ZSTDMT_bufferPool;
|
105
105
|
|
106
|
+
static void ZSTDMT_freeBufferPool(ZSTDMT_bufferPool* bufPool)
|
107
|
+
{
|
108
|
+
DEBUGLOG(3, "ZSTDMT_freeBufferPool (address:%08X)", (U32)(size_t)bufPool);
|
109
|
+
if (!bufPool) return; /* compatibility with free on NULL */
|
110
|
+
if (bufPool->buffers) {
|
111
|
+
unsigned u;
|
112
|
+
for (u=0; u<bufPool->totalBuffers; u++) {
|
113
|
+
DEBUGLOG(4, "free buffer %2u (address:%08X)", u, (U32)(size_t)bufPool->buffers[u].start);
|
114
|
+
ZSTD_customFree(bufPool->buffers[u].start, bufPool->cMem);
|
115
|
+
}
|
116
|
+
ZSTD_customFree(bufPool->buffers, bufPool->cMem);
|
117
|
+
}
|
118
|
+
ZSTD_pthread_mutex_destroy(&bufPool->poolMutex);
|
119
|
+
ZSTD_customFree(bufPool, bufPool->cMem);
|
120
|
+
}
|
121
|
+
|
106
122
|
static ZSTDMT_bufferPool* ZSTDMT_createBufferPool(unsigned maxNbBuffers, ZSTD_customMem cMem)
|
107
123
|
{
|
108
|
-
ZSTDMT_bufferPool* const bufPool =
|
109
|
-
|
124
|
+
ZSTDMT_bufferPool* const bufPool =
|
125
|
+
(ZSTDMT_bufferPool*)ZSTD_customCalloc(sizeof(ZSTDMT_bufferPool), cMem);
|
110
126
|
if (bufPool==NULL) return NULL;
|
111
127
|
if (ZSTD_pthread_mutex_init(&bufPool->poolMutex, NULL)) {
|
112
128
|
ZSTD_customFree(bufPool, cMem);
|
113
129
|
return NULL;
|
114
130
|
}
|
131
|
+
bufPool->buffers = (buffer_t*)ZSTD_customCalloc(maxNbBuffers * sizeof(buffer_t), cMem);
|
132
|
+
if (bufPool->buffers==NULL) {
|
133
|
+
ZSTDMT_freeBufferPool(bufPool);
|
134
|
+
return NULL;
|
135
|
+
}
|
115
136
|
bufPool->bufferSize = 64 KB;
|
116
137
|
bufPool->totalBuffers = maxNbBuffers;
|
117
138
|
bufPool->nbBuffers = 0;
|
@@ -119,32 +140,19 @@ static ZSTDMT_bufferPool* ZSTDMT_createBufferPool(unsigned maxNbBuffers, ZSTD_cu
|
|
119
140
|
return bufPool;
|
120
141
|
}
|
121
142
|
|
122
|
-
static void ZSTDMT_freeBufferPool(ZSTDMT_bufferPool* bufPool)
|
123
|
-
{
|
124
|
-
unsigned u;
|
125
|
-
DEBUGLOG(3, "ZSTDMT_freeBufferPool (address:%08X)", (U32)(size_t)bufPool);
|
126
|
-
if (!bufPool) return; /* compatibility with free on NULL */
|
127
|
-
for (u=0; u<bufPool->totalBuffers; u++) {
|
128
|
-
DEBUGLOG(4, "free buffer %2u (address:%08X)", u, (U32)(size_t)bufPool->bTable[u].start);
|
129
|
-
ZSTD_customFree(bufPool->bTable[u].start, bufPool->cMem);
|
130
|
-
}
|
131
|
-
ZSTD_pthread_mutex_destroy(&bufPool->poolMutex);
|
132
|
-
ZSTD_customFree(bufPool, bufPool->cMem);
|
133
|
-
}
|
134
|
-
|
135
143
|
/* only works at initialization, not during compression */
|
136
144
|
static size_t ZSTDMT_sizeof_bufferPool(ZSTDMT_bufferPool* bufPool)
|
137
145
|
{
|
138
|
-
size_t const poolSize = sizeof(*bufPool)
|
139
|
-
|
146
|
+
size_t const poolSize = sizeof(*bufPool);
|
147
|
+
size_t const arraySize = bufPool->totalBuffers * sizeof(buffer_t);
|
140
148
|
unsigned u;
|
141
149
|
size_t totalBufferSize = 0;
|
142
150
|
ZSTD_pthread_mutex_lock(&bufPool->poolMutex);
|
143
151
|
for (u=0; u<bufPool->totalBuffers; u++)
|
144
|
-
totalBufferSize += bufPool->
|
152
|
+
totalBufferSize += bufPool->buffers[u].capacity;
|
145
153
|
ZSTD_pthread_mutex_unlock(&bufPool->poolMutex);
|
146
154
|
|
147
|
-
return poolSize + totalBufferSize;
|
155
|
+
return poolSize + arraySize + totalBufferSize;
|
148
156
|
}
|
149
157
|
|
150
158
|
/* ZSTDMT_setBufferSize() :
|
@@ -187,9 +195,9 @@ static buffer_t ZSTDMT_getBuffer(ZSTDMT_bufferPool* bufPool)
|
|
187
195
|
DEBUGLOG(5, "ZSTDMT_getBuffer: bSize = %u", (U32)bufPool->bufferSize);
|
188
196
|
ZSTD_pthread_mutex_lock(&bufPool->poolMutex);
|
189
197
|
if (bufPool->nbBuffers) { /* try to use an existing buffer */
|
190
|
-
buffer_t const buf = bufPool->
|
198
|
+
buffer_t const buf = bufPool->buffers[--(bufPool->nbBuffers)];
|
191
199
|
size_t const availBufferSize = buf.capacity;
|
192
|
-
bufPool->
|
200
|
+
bufPool->buffers[bufPool->nbBuffers] = g_nullBuffer;
|
193
201
|
if ((availBufferSize >= bSize) & ((availBufferSize>>3) <= bSize)) {
|
194
202
|
/* large enough, but not too much */
|
195
203
|
DEBUGLOG(5, "ZSTDMT_getBuffer: provide buffer %u of size %u",
|
@@ -250,14 +258,14 @@ static void ZSTDMT_releaseBuffer(ZSTDMT_bufferPool* bufPool, buffer_t buf)
|
|
250
258
|
if (buf.start == NULL) return; /* compatible with release on NULL */
|
251
259
|
ZSTD_pthread_mutex_lock(&bufPool->poolMutex);
|
252
260
|
if (bufPool->nbBuffers < bufPool->totalBuffers) {
|
253
|
-
bufPool->
|
261
|
+
bufPool->buffers[bufPool->nbBuffers++] = buf; /* stored for later use */
|
254
262
|
DEBUGLOG(5, "ZSTDMT_releaseBuffer: stored buffer of size %u in slot %u",
|
255
263
|
(U32)buf.capacity, (U32)(bufPool->nbBuffers-1));
|
256
264
|
ZSTD_pthread_mutex_unlock(&bufPool->poolMutex);
|
257
265
|
return;
|
258
266
|
}
|
259
267
|
ZSTD_pthread_mutex_unlock(&bufPool->poolMutex);
|
260
|
-
/* Reached bufferPool capacity (should not happen) */
|
268
|
+
/* Reached bufferPool capacity (note: should not happen) */
|
261
269
|
DEBUGLOG(5, "ZSTDMT_releaseBuffer: pool capacity reached => freeing ");
|
262
270
|
ZSTD_customFree(buf.start, bufPool->cMem);
|
263
271
|
}
|
@@ -350,16 +358,20 @@ typedef struct {
|
|
350
358
|
int totalCCtx;
|
351
359
|
int availCCtx;
|
352
360
|
ZSTD_customMem cMem;
|
353
|
-
ZSTD_CCtx
|
361
|
+
ZSTD_CCtx** cctxs;
|
354
362
|
} ZSTDMT_CCtxPool;
|
355
363
|
|
356
|
-
/* note : all CCtx borrowed from the pool
|
364
|
+
/* note : all CCtx borrowed from the pool must be reverted back to the pool _before_ freeing the pool */
|
357
365
|
static void ZSTDMT_freeCCtxPool(ZSTDMT_CCtxPool* pool)
|
358
366
|
{
|
359
|
-
|
360
|
-
for (cid=0; cid<pool->totalCCtx; cid++)
|
361
|
-
ZSTD_freeCCtx(pool->cctx[cid]); /* note : compatible with free on NULL */
|
367
|
+
if (!pool) return;
|
362
368
|
ZSTD_pthread_mutex_destroy(&pool->poolMutex);
|
369
|
+
if (pool->cctxs) {
|
370
|
+
int cid;
|
371
|
+
for (cid=0; cid<pool->totalCCtx; cid++)
|
372
|
+
ZSTD_freeCCtx(pool->cctxs[cid]); /* free compatible with NULL */
|
373
|
+
ZSTD_customFree(pool->cctxs, pool->cMem);
|
374
|
+
}
|
363
375
|
ZSTD_customFree(pool, pool->cMem);
|
364
376
|
}
|
365
377
|
|
@@ -368,19 +380,24 @@ static void ZSTDMT_freeCCtxPool(ZSTDMT_CCtxPool* pool)
|
|
368
380
|
static ZSTDMT_CCtxPool* ZSTDMT_createCCtxPool(int nbWorkers,
|
369
381
|
ZSTD_customMem cMem)
|
370
382
|
{
|
371
|
-
ZSTDMT_CCtxPool* const cctxPool =
|
372
|
-
|
383
|
+
ZSTDMT_CCtxPool* const cctxPool =
|
384
|
+
(ZSTDMT_CCtxPool*) ZSTD_customCalloc(sizeof(ZSTDMT_CCtxPool), cMem);
|
373
385
|
assert(nbWorkers > 0);
|
374
386
|
if (!cctxPool) return NULL;
|
375
387
|
if (ZSTD_pthread_mutex_init(&cctxPool->poolMutex, NULL)) {
|
376
388
|
ZSTD_customFree(cctxPool, cMem);
|
377
389
|
return NULL;
|
378
390
|
}
|
379
|
-
cctxPool->cMem = cMem;
|
380
391
|
cctxPool->totalCCtx = nbWorkers;
|
392
|
+
cctxPool->cctxs = (ZSTD_CCtx**)ZSTD_customCalloc(nbWorkers * sizeof(ZSTD_CCtx*), cMem);
|
393
|
+
if (!cctxPool->cctxs) {
|
394
|
+
ZSTDMT_freeCCtxPool(cctxPool);
|
395
|
+
return NULL;
|
396
|
+
}
|
397
|
+
cctxPool->cMem = cMem;
|
398
|
+
cctxPool->cctxs[0] = ZSTD_createCCtx_advanced(cMem);
|
399
|
+
if (!cctxPool->cctxs[0]) { ZSTDMT_freeCCtxPool(cctxPool); return NULL; }
|
381
400
|
cctxPool->availCCtx = 1; /* at least one cctx for single-thread mode */
|
382
|
-
cctxPool->cctx[0] = ZSTD_createCCtx_advanced(cMem);
|
383
|
-
if (!cctxPool->cctx[0]) { ZSTDMT_freeCCtxPool(cctxPool); return NULL; }
|
384
401
|
DEBUGLOG(3, "cctxPool created, with %u workers", nbWorkers);
|
385
402
|
return cctxPool;
|
386
403
|
}
|
@@ -402,16 +419,16 @@ static size_t ZSTDMT_sizeof_CCtxPool(ZSTDMT_CCtxPool* cctxPool)
|
|
402
419
|
{
|
403
420
|
ZSTD_pthread_mutex_lock(&cctxPool->poolMutex);
|
404
421
|
{ unsigned const nbWorkers = cctxPool->totalCCtx;
|
405
|
-
size_t const poolSize = sizeof(*cctxPool)
|
406
|
-
|
407
|
-
unsigned u;
|
422
|
+
size_t const poolSize = sizeof(*cctxPool);
|
423
|
+
size_t const arraySize = cctxPool->totalCCtx * sizeof(ZSTD_CCtx*);
|
408
424
|
size_t totalCCtxSize = 0;
|
425
|
+
unsigned u;
|
409
426
|
for (u=0; u<nbWorkers; u++) {
|
410
|
-
totalCCtxSize += ZSTD_sizeof_CCtx(cctxPool->
|
427
|
+
totalCCtxSize += ZSTD_sizeof_CCtx(cctxPool->cctxs[u]);
|
411
428
|
}
|
412
429
|
ZSTD_pthread_mutex_unlock(&cctxPool->poolMutex);
|
413
430
|
assert(nbWorkers > 0);
|
414
|
-
return poolSize + totalCCtxSize;
|
431
|
+
return poolSize + arraySize + totalCCtxSize;
|
415
432
|
}
|
416
433
|
}
|
417
434
|
|
@@ -421,7 +438,7 @@ static ZSTD_CCtx* ZSTDMT_getCCtx(ZSTDMT_CCtxPool* cctxPool)
|
|
421
438
|
ZSTD_pthread_mutex_lock(&cctxPool->poolMutex);
|
422
439
|
if (cctxPool->availCCtx) {
|
423
440
|
cctxPool->availCCtx--;
|
424
|
-
{ ZSTD_CCtx* const cctx = cctxPool->
|
441
|
+
{ ZSTD_CCtx* const cctx = cctxPool->cctxs[cctxPool->availCCtx];
|
425
442
|
ZSTD_pthread_mutex_unlock(&cctxPool->poolMutex);
|
426
443
|
return cctx;
|
427
444
|
} }
|
@@ -435,7 +452,7 @@ static void ZSTDMT_releaseCCtx(ZSTDMT_CCtxPool* pool, ZSTD_CCtx* cctx)
|
|
435
452
|
if (cctx==NULL) return; /* compatibility with release on NULL */
|
436
453
|
ZSTD_pthread_mutex_lock(&pool->poolMutex);
|
437
454
|
if (pool->availCCtx < pool->totalCCtx)
|
438
|
-
pool->
|
455
|
+
pool->cctxs[pool->availCCtx++] = cctx;
|
439
456
|
else {
|
440
457
|
/* pool overflow : should not happen, since totalCCtx==nbWorkers */
|
441
458
|
DEBUGLOG(4, "CCtx pool overflow : free cctx");
|
@@ -601,11 +618,8 @@ static void ZSTDMT_serialState_update(serialState_t* serialState,
|
|
601
618
|
ZSTD_pthread_mutex_unlock(&serialState->mutex);
|
602
619
|
|
603
620
|
if (seqStore.size > 0) {
|
604
|
-
|
605
|
-
jobCCtx, seqStore.seq, seqStore.size);
|
621
|
+
ZSTD_referenceExternalSequences(jobCCtx, seqStore.seq, seqStore.size);
|
606
622
|
assert(serialState->params.ldmParams.enableLdm == ZSTD_ps_enable);
|
607
|
-
assert(!ZSTD_isError(err));
|
608
|
-
(void)err;
|
609
623
|
}
|
610
624
|
}
|
611
625
|
|
@@ -657,12 +671,13 @@ typedef struct {
|
|
657
671
|
unsigned frameChecksumNeeded; /* used only by mtctx */
|
658
672
|
} ZSTDMT_jobDescription;
|
659
673
|
|
660
|
-
#define JOB_ERROR(e)
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
674
|
+
#define JOB_ERROR(e) \
|
675
|
+
do { \
|
676
|
+
ZSTD_PTHREAD_MUTEX_LOCK(&job->job_mutex); \
|
677
|
+
job->cSize = e; \
|
678
|
+
ZSTD_pthread_mutex_unlock(&job->job_mutex); \
|
679
|
+
goto _endJob; \
|
680
|
+
} while (0)
|
666
681
|
|
667
682
|
/* ZSTDMT_compressionJob() is a POOL_function type */
|
668
683
|
static void ZSTDMT_compressionJob(void* jobDescription)
|
@@ -1091,7 +1106,7 @@ ZSTD_frameProgression ZSTDMT_getFrameProgression(ZSTDMT_CCtx* mtctx)
|
|
1091
1106
|
{ unsigned jobNb;
|
1092
1107
|
unsigned lastJobNb = mtctx->nextJobID + mtctx->jobReady; assert(mtctx->jobReady <= 1);
|
1093
1108
|
DEBUGLOG(6, "ZSTDMT_getFrameProgression: jobs: from %u to <%u (jobReady:%u)",
|
1094
|
-
mtctx->doneJobID, lastJobNb, mtctx->jobReady)
|
1109
|
+
mtctx->doneJobID, lastJobNb, mtctx->jobReady);
|
1095
1110
|
for (jobNb = mtctx->doneJobID ; jobNb < lastJobNb ; jobNb++) {
|
1096
1111
|
unsigned const wJobID = jobNb & mtctx->jobIDMask;
|
1097
1112
|
ZSTDMT_jobDescription* jobPtr = &mtctx->jobs[wJobID];
|