zstd-ruby 1.4.9.0 → 1.5.0.0
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/.github/dependabot.yml +8 -0
- data/README.md +1 -1
- data/ext/zstdruby/libzstd/BUCK +5 -7
- data/ext/zstdruby/libzstd/Makefile +42 -13
- data/ext/zstdruby/libzstd/README.md +8 -4
- data/ext/zstdruby/libzstd/common/bitstream.h +1 -1
- data/ext/zstdruby/libzstd/common/compiler.h +1 -1
- data/ext/zstdruby/libzstd/common/cpu.h +1 -1
- data/ext/zstdruby/libzstd/common/debug.c +1 -1
- data/ext/zstdruby/libzstd/common/debug.h +1 -1
- data/ext/zstdruby/libzstd/common/entropy_common.c +1 -1
- data/ext/zstdruby/libzstd/common/error_private.c +1 -1
- data/ext/zstdruby/libzstd/common/error_private.h +3 -3
- data/ext/zstdruby/libzstd/common/fse.h +2 -2
- data/ext/zstdruby/libzstd/common/fse_decompress.c +25 -15
- data/ext/zstdruby/libzstd/common/huf.h +3 -2
- data/ext/zstdruby/libzstd/common/mem.h +3 -5
- data/ext/zstdruby/libzstd/common/pool.c +1 -1
- data/ext/zstdruby/libzstd/common/pool.h +1 -1
- data/ext/zstdruby/libzstd/common/xxhash.c +2 -4
- data/ext/zstdruby/libzstd/common/xxhash.h +1 -1
- data/ext/zstdruby/libzstd/common/zstd_common.c +1 -1
- data/ext/zstdruby/libzstd/common/zstd_deps.h +1 -1
- data/ext/zstdruby/libzstd/common/zstd_internal.h +21 -9
- data/ext/zstdruby/libzstd/common/zstd_trace.h +7 -5
- data/ext/zstdruby/libzstd/compress/fse_compress.c +1 -1
- data/ext/zstdruby/libzstd/compress/hist.c +1 -1
- data/ext/zstdruby/libzstd/compress/hist.h +1 -1
- data/ext/zstdruby/libzstd/compress/huf_compress.c +51 -28
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +1373 -275
- data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +164 -21
- data/ext/zstdruby/libzstd/compress/zstd_compress_literals.c +2 -2
- data/ext/zstdruby/libzstd/compress/zstd_compress_literals.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.c +14 -6
- data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +5 -282
- data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +147 -46
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +3 -3
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_fast.c +4 -4
- data/ext/zstdruby/libzstd/compress/zstd_fast.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_lazy.c +914 -142
- data/ext/zstdruby/libzstd/compress/zstd_lazy.h +39 -1
- data/ext/zstdruby/libzstd/compress/zstd_ldm.c +51 -15
- data/ext/zstdruby/libzstd/compress/zstd_ldm.h +2 -1
- data/ext/zstdruby/libzstd/compress/zstd_ldm_geartab.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_opt.c +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_opt.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +15 -6
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +5 -5
- data/ext/zstdruby/libzstd/decompress/huf_decompress.c +44 -43
- data/ext/zstdruby/libzstd/decompress/zstd_ddict.c +1 -1
- data/ext/zstdruby/libzstd/decompress/zstd_ddict.h +1 -1
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +3 -4
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +44 -36
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +1 -1
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +1 -2
- data/ext/zstdruby/libzstd/deprecated/zbuff.h +1 -1
- data/ext/zstdruby/libzstd/deprecated/zbuff_common.c +1 -1
- data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +1 -1
- data/ext/zstdruby/libzstd/deprecated/zbuff_decompress.c +1 -1
- data/ext/zstdruby/libzstd/dictBuilder/cover.c +7 -6
- data/ext/zstdruby/libzstd/dictBuilder/cover.h +6 -5
- data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +7 -6
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +8 -7
- data/ext/zstdruby/libzstd/dll/example/Makefile +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v01.c +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v01.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v02.c +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v02.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v03.c +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v03.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v04.c +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v04.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v05.c +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v05.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v06.c +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v06.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v07.c +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v07.h +1 -1
- data/ext/zstdruby/libzstd/{dictBuilder/zdict.h → zdict.h} +148 -2
- data/ext/zstdruby/libzstd/zstd.h +165 -83
- data/ext/zstdruby/libzstd/{common/zstd_errors.h → zstd_errors.h} +1 -1
- data/lib/zstd-ruby/version.rb +1 -1
- metadata +5 -5
- data/ext/zstdruby/libzstd/common/zstd_trace.c +0 -42
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c)
|
2
|
+
* Copyright (c) Yann Collet, Facebook, Inc.
|
3
3
|
* All rights reserved.
|
4
4
|
*
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
@@ -26,6 +26,7 @@ extern "C" {
|
|
26
26
|
#define ZSTD_LAZY_DDSS_BUCKET_LOG 2
|
27
27
|
|
28
28
|
U32 ZSTD_insertAndFindFirstIndex(ZSTD_matchState_t* ms, const BYTE* ip);
|
29
|
+
void ZSTD_row_update(ZSTD_matchState_t* const ms, const BYTE* ip);
|
29
30
|
|
30
31
|
void ZSTD_dedicatedDictSearch_lazy_loadDictionary(ZSTD_matchState_t* ms, const BYTE* const ip);
|
31
32
|
|
@@ -43,6 +44,15 @@ size_t ZSTD_compressBlock_lazy(
|
|
43
44
|
size_t ZSTD_compressBlock_greedy(
|
44
45
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
45
46
|
void const* src, size_t srcSize);
|
47
|
+
size_t ZSTD_compressBlock_lazy2_row(
|
48
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
49
|
+
void const* src, size_t srcSize);
|
50
|
+
size_t ZSTD_compressBlock_lazy_row(
|
51
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
52
|
+
void const* src, size_t srcSize);
|
53
|
+
size_t ZSTD_compressBlock_greedy_row(
|
54
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
55
|
+
void const* src, size_t srcSize);
|
46
56
|
|
47
57
|
size_t ZSTD_compressBlock_btlazy2_dictMatchState(
|
48
58
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
@@ -56,6 +66,15 @@ size_t ZSTD_compressBlock_lazy_dictMatchState(
|
|
56
66
|
size_t ZSTD_compressBlock_greedy_dictMatchState(
|
57
67
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
58
68
|
void const* src, size_t srcSize);
|
69
|
+
size_t ZSTD_compressBlock_lazy2_dictMatchState_row(
|
70
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
71
|
+
void const* src, size_t srcSize);
|
72
|
+
size_t ZSTD_compressBlock_lazy_dictMatchState_row(
|
73
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
74
|
+
void const* src, size_t srcSize);
|
75
|
+
size_t ZSTD_compressBlock_greedy_dictMatchState_row(
|
76
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
77
|
+
void const* src, size_t srcSize);
|
59
78
|
|
60
79
|
size_t ZSTD_compressBlock_lazy2_dedicatedDictSearch(
|
61
80
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
@@ -66,6 +85,15 @@ size_t ZSTD_compressBlock_lazy_dedicatedDictSearch(
|
|
66
85
|
size_t ZSTD_compressBlock_greedy_dedicatedDictSearch(
|
67
86
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
68
87
|
void const* src, size_t srcSize);
|
88
|
+
size_t ZSTD_compressBlock_lazy2_dedicatedDictSearch_row(
|
89
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
90
|
+
void const* src, size_t srcSize);
|
91
|
+
size_t ZSTD_compressBlock_lazy_dedicatedDictSearch_row(
|
92
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
93
|
+
void const* src, size_t srcSize);
|
94
|
+
size_t ZSTD_compressBlock_greedy_dedicatedDictSearch_row(
|
95
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
96
|
+
void const* src, size_t srcSize);
|
69
97
|
|
70
98
|
size_t ZSTD_compressBlock_greedy_extDict(
|
71
99
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
@@ -76,9 +104,19 @@ size_t ZSTD_compressBlock_lazy_extDict(
|
|
76
104
|
size_t ZSTD_compressBlock_lazy2_extDict(
|
77
105
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
78
106
|
void const* src, size_t srcSize);
|
107
|
+
size_t ZSTD_compressBlock_greedy_extDict_row(
|
108
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
109
|
+
void const* src, size_t srcSize);
|
110
|
+
size_t ZSTD_compressBlock_lazy_extDict_row(
|
111
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
112
|
+
void const* src, size_t srcSize);
|
113
|
+
size_t ZSTD_compressBlock_lazy2_extDict_row(
|
114
|
+
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
115
|
+
void const* src, size_t srcSize);
|
79
116
|
size_t ZSTD_compressBlock_btlazy2_extDict(
|
80
117
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
81
118
|
void const* src, size_t srcSize);
|
119
|
+
|
82
120
|
|
83
121
|
#if defined (__cplusplus)
|
84
122
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c)
|
2
|
+
* Copyright (c) Yann Collet, Facebook, Inc.
|
3
3
|
* All rights reserved.
|
4
4
|
*
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
@@ -57,6 +57,33 @@ static void ZSTD_ldm_gear_init(ldmRollingHashState_t* state, ldmParams_t const*
|
|
57
57
|
}
|
58
58
|
}
|
59
59
|
|
60
|
+
/** ZSTD_ldm_gear_reset()
|
61
|
+
* Feeds [data, data + minMatchLength) into the hash without registering any
|
62
|
+
* splits. This effectively resets the hash state. This is used when skipping
|
63
|
+
* over data, either at the beginning of a block, or skipping sections.
|
64
|
+
*/
|
65
|
+
static void ZSTD_ldm_gear_reset(ldmRollingHashState_t* state,
|
66
|
+
BYTE const* data, size_t minMatchLength)
|
67
|
+
{
|
68
|
+
U64 hash = state->rolling;
|
69
|
+
size_t n = 0;
|
70
|
+
|
71
|
+
#define GEAR_ITER_ONCE() do { \
|
72
|
+
hash = (hash << 1) + ZSTD_ldm_gearTab[data[n] & 0xff]; \
|
73
|
+
n += 1; \
|
74
|
+
} while (0)
|
75
|
+
while (n + 3 < minMatchLength) {
|
76
|
+
GEAR_ITER_ONCE();
|
77
|
+
GEAR_ITER_ONCE();
|
78
|
+
GEAR_ITER_ONCE();
|
79
|
+
GEAR_ITER_ONCE();
|
80
|
+
}
|
81
|
+
while (n < minMatchLength) {
|
82
|
+
GEAR_ITER_ONCE();
|
83
|
+
}
|
84
|
+
#undef GEAR_ITER_ONCE
|
85
|
+
}
|
86
|
+
|
60
87
|
/** ZSTD_ldm_gear_feed():
|
61
88
|
*
|
62
89
|
* Registers in the splits array all the split points found in the first
|
@@ -255,7 +282,7 @@ void ZSTD_ldm_fillHashTable(
|
|
255
282
|
while (ip < iend) {
|
256
283
|
size_t hashed;
|
257
284
|
unsigned n;
|
258
|
-
|
285
|
+
|
259
286
|
numSplits = 0;
|
260
287
|
hashed = ZSTD_ldm_gear_feed(&hashState, ip, iend - ip, splits, &numSplits);
|
261
288
|
|
@@ -327,16 +354,8 @@ static size_t ZSTD_ldm_generateSequences_internal(
|
|
327
354
|
|
328
355
|
/* Initialize the rolling hash state with the first minMatchLength bytes */
|
329
356
|
ZSTD_ldm_gear_init(&hashState, params);
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
while (n < minMatchLength) {
|
334
|
-
numSplits = 0;
|
335
|
-
n += ZSTD_ldm_gear_feed(&hashState, ip + n, minMatchLength - n,
|
336
|
-
splits, &numSplits);
|
337
|
-
}
|
338
|
-
ip += minMatchLength;
|
339
|
-
}
|
357
|
+
ZSTD_ldm_gear_reset(&hashState, ip, minMatchLength);
|
358
|
+
ip += minMatchLength;
|
340
359
|
|
341
360
|
while (ip < ilimit) {
|
342
361
|
size_t hashed;
|
@@ -361,6 +380,7 @@ static size_t ZSTD_ldm_generateSequences_internal(
|
|
361
380
|
for (n = 0; n < numSplits; n++) {
|
362
381
|
size_t forwardMatchLength = 0, backwardMatchLength = 0,
|
363
382
|
bestMatchLength = 0, mLength;
|
383
|
+
U32 offset;
|
364
384
|
BYTE const* const split = candidates[n].split;
|
365
385
|
U32 const checksum = candidates[n].checksum;
|
366
386
|
U32 const hash = candidates[n].hash;
|
@@ -428,9 +448,9 @@ static size_t ZSTD_ldm_generateSequences_internal(
|
|
428
448
|
}
|
429
449
|
|
430
450
|
/* Match found */
|
451
|
+
offset = (U32)(split - base) - bestEntry->offset;
|
431
452
|
mLength = forwardMatchLength + backwardMatchLength;
|
432
453
|
{
|
433
|
-
U32 const offset = (U32)(split - base) - bestEntry->offset;
|
434
454
|
rawSeq* const seq = rawSeqStore->seq + rawSeqStore->size;
|
435
455
|
|
436
456
|
/* Out of sequence storage */
|
@@ -447,6 +467,21 @@ static size_t ZSTD_ldm_generateSequences_internal(
|
|
447
467
|
ZSTD_ldm_insertEntry(ldmState, hash, newEntry, *params);
|
448
468
|
|
449
469
|
anchor = split + forwardMatchLength;
|
470
|
+
|
471
|
+
/* If we find a match that ends after the data that we've hashed
|
472
|
+
* then we have a repeating, overlapping, pattern. E.g. all zeros.
|
473
|
+
* If one repetition of the pattern matches our `stopMask` then all
|
474
|
+
* repetitions will. We don't need to insert them all into out table,
|
475
|
+
* only the first one. So skip over overlapping matches.
|
476
|
+
* This is a major speed boost (20x) for compressing a single byte
|
477
|
+
* repeated, when that byte ends up in the table.
|
478
|
+
*/
|
479
|
+
if (anchor > ip + hashed) {
|
480
|
+
ZSTD_ldm_gear_reset(&hashState, anchor - minMatchLength, minMatchLength);
|
481
|
+
/* Continue the outter loop at anchor (ip + hashed == anchor). */
|
482
|
+
ip = anchor - hashed;
|
483
|
+
break;
|
484
|
+
}
|
450
485
|
}
|
451
486
|
|
452
487
|
ip += hashed;
|
@@ -500,7 +535,7 @@ size_t ZSTD_ldm_generateSequences(
|
|
500
535
|
|
501
536
|
assert(chunkStart < iend);
|
502
537
|
/* 1. Perform overflow correction if necessary. */
|
503
|
-
if (ZSTD_window_needOverflowCorrection(ldmState->window, chunkEnd)) {
|
538
|
+
if (ZSTD_window_needOverflowCorrection(ldmState->window, 0, maxDist, ldmState->loadedDictEnd, chunkStart, chunkEnd)) {
|
504
539
|
U32 const ldmHSize = 1U << params->hashLog;
|
505
540
|
U32 const correction = ZSTD_window_correctOverflow(
|
506
541
|
&ldmState->window, /* cycleLog */ 0, maxDist, chunkStart);
|
@@ -622,12 +657,13 @@ void ZSTD_ldm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t nbBytes) {
|
|
622
657
|
|
623
658
|
size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore,
|
624
659
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
660
|
+
ZSTD_useRowMatchFinderMode_e useRowMatchFinder,
|
625
661
|
void const* src, size_t srcSize)
|
626
662
|
{
|
627
663
|
const ZSTD_compressionParameters* const cParams = &ms->cParams;
|
628
664
|
unsigned const minMatch = cParams->minMatch;
|
629
665
|
ZSTD_blockCompressor const blockCompressor =
|
630
|
-
ZSTD_selectBlockCompressor(cParams->strategy, ZSTD_matchState_dictMode(ms));
|
666
|
+
ZSTD_selectBlockCompressor(cParams->strategy, useRowMatchFinder, ZSTD_matchState_dictMode(ms));
|
631
667
|
/* Input bounds */
|
632
668
|
BYTE const* const istart = (BYTE const*)src;
|
633
669
|
BYTE const* const iend = istart + srcSize;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c)
|
2
|
+
* Copyright (c) Yann Collet, Facebook, Inc.
|
3
3
|
* All rights reserved.
|
4
4
|
*
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
@@ -66,6 +66,7 @@ size_t ZSTD_ldm_generateSequences(
|
|
66
66
|
*/
|
67
67
|
size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore,
|
68
68
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
69
|
+
ZSTD_useRowMatchFinderMode_e useRowMatchFinder,
|
69
70
|
void const* src, size_t srcSize);
|
70
71
|
|
71
72
|
/**
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c)
|
2
|
+
* Copyright (c) Yann Collet, Facebook, Inc.
|
3
3
|
* All rights reserved.
|
4
4
|
*
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
@@ -512,7 +512,7 @@ ZSTDMT_serialState_reset(serialState_t* serialState,
|
|
512
512
|
if (dictSize > 0) {
|
513
513
|
if (dictContentType == ZSTD_dct_rawContent) {
|
514
514
|
BYTE const* const dictEnd = (const BYTE*)dict + dictSize;
|
515
|
-
ZSTD_window_update(&serialState->ldmState.window, dict, dictSize);
|
515
|
+
ZSTD_window_update(&serialState->ldmState.window, dict, dictSize, /* forceNonContiguous */ 0);
|
516
516
|
ZSTD_ldm_fillHashTable(&serialState->ldmState, (const BYTE*)dict, dictEnd, ¶ms.ldmParams);
|
517
517
|
serialState->ldmState.loadedDictEnd = params.forceWindow ? 0 : (U32)(dictEnd - serialState->ldmState.window.base);
|
518
518
|
} else {
|
@@ -569,7 +569,7 @@ static void ZSTDMT_serialState_update(serialState_t* serialState,
|
|
569
569
|
assert(seqStore.seq != NULL && seqStore.pos == 0 &&
|
570
570
|
seqStore.size == 0 && seqStore.capacity > 0);
|
571
571
|
assert(src.size <= serialState->params.jobSize);
|
572
|
-
ZSTD_window_update(&serialState->ldmState.window, src.start, src.size);
|
572
|
+
ZSTD_window_update(&serialState->ldmState.window, src.start, src.size, /* forceNonContiguous */ 0);
|
573
573
|
error = ZSTD_ldm_generateSequences(
|
574
574
|
&serialState->ldmState, &seqStore,
|
575
575
|
&serialState->params.ldmParams, src.start, src.size);
|
@@ -695,6 +695,10 @@ static void ZSTDMT_compressionJob(void* jobDescription)
|
|
695
695
|
{ size_t const forceWindowError = ZSTD_CCtxParams_setParameter(&jobParams, ZSTD_c_forceMaxWindow, !job->firstJob);
|
696
696
|
if (ZSTD_isError(forceWindowError)) JOB_ERROR(forceWindowError);
|
697
697
|
}
|
698
|
+
if (!job->firstJob) {
|
699
|
+
size_t const err = ZSTD_CCtxParams_setParameter(&jobParams, ZSTD_c_deterministicRefPrefix, 0);
|
700
|
+
if (ZSTD_isError(err)) JOB_ERROR(err);
|
701
|
+
}
|
698
702
|
{ size_t const initError = ZSTD_compressBegin_advanced_internal(cctx,
|
699
703
|
job->prefix.start, job->prefix.size, ZSTD_dct_rawContent, /* load dictionary in "content-only" mode (no header analysis) */
|
700
704
|
ZSTD_dtlm_fast,
|
@@ -750,6 +754,12 @@ static void ZSTDMT_compressionJob(void* jobDescription)
|
|
750
754
|
if (ZSTD_isError(cSize)) JOB_ERROR(cSize);
|
751
755
|
lastCBlockSize = cSize;
|
752
756
|
} }
|
757
|
+
if (!job->firstJob) {
|
758
|
+
/* Double check that we don't have an ext-dict, because then our
|
759
|
+
* repcode invalidation doesn't work.
|
760
|
+
*/
|
761
|
+
assert(!ZSTD_window_hasExtDict(cctx->blockState.matchState.window));
|
762
|
+
}
|
753
763
|
ZSTD_CCtx_trace(cctx, 0);
|
754
764
|
|
755
765
|
_endJob:
|
@@ -1240,9 +1250,8 @@ size_t ZSTDMT_initCStream_internal(
|
|
1240
1250
|
|
1241
1251
|
if (params.rsyncable) {
|
1242
1252
|
/* Aim for the targetsectionSize as the average job size. */
|
1243
|
-
U32 const
|
1244
|
-
U32 const rsyncBits = ZSTD_highbit32(
|
1245
|
-
assert(jobSizeMB >= 1);
|
1253
|
+
U32 const jobSizeKB = (U32)(mtctx->targetSectionSize >> 10);
|
1254
|
+
U32 const rsyncBits = (assert(jobSizeKB >= 1), ZSTD_highbit32(jobSizeKB) + 10);
|
1246
1255
|
DEBUGLOG(4, "rsyncLog = %u", rsyncBits);
|
1247
1256
|
mtctx->rsync.hash = 0;
|
1248
1257
|
mtctx->rsync.hitMask = (1ULL << rsyncBits) - 1;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c)
|
2
|
+
* Copyright (c) Yann Collet, Facebook, Inc.
|
3
3
|
* All rights reserved.
|
4
4
|
*
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
@@ -32,11 +32,11 @@
|
|
32
32
|
|
33
33
|
|
34
34
|
/* === Constants === */
|
35
|
-
#ifndef ZSTDMT_NBWORKERS_MAX
|
36
|
-
# define ZSTDMT_NBWORKERS_MAX
|
35
|
+
#ifndef ZSTDMT_NBWORKERS_MAX /* a different value can be selected at compile time */
|
36
|
+
# define ZSTDMT_NBWORKERS_MAX ((sizeof(void*)==4) /*32-bit*/ ? 64 : 256)
|
37
37
|
#endif
|
38
|
-
#ifndef ZSTDMT_JOBSIZE_MIN
|
39
|
-
# define ZSTDMT_JOBSIZE_MIN (
|
38
|
+
#ifndef ZSTDMT_JOBSIZE_MIN /* a different value can be selected at compile time */
|
39
|
+
# define ZSTDMT_JOBSIZE_MIN (512 KB)
|
40
40
|
#endif
|
41
41
|
#define ZSTDMT_JOBLOG_MAX (MEM_32bits() ? 29 : 30)
|
42
42
|
#define ZSTDMT_JOBSIZE_MAX (MEM_32bits() ? (512 MB) : (1024 MB))
|
@@ -1,7 +1,7 @@
|
|
1
1
|
/* ******************************************************************
|
2
2
|
* huff0 huffman decoder,
|
3
3
|
* part of Finite State Entropy library
|
4
|
-
* Copyright (c)
|
4
|
+
* Copyright (c) Yann Collet, Facebook, Inc.
|
5
5
|
*
|
6
6
|
* You can contact the author at :
|
7
7
|
* - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
@@ -528,13 +528,15 @@ typedef rankValCol_t rankVal_t[HUF_TABLELOG_MAX];
|
|
528
528
|
static void HUF_fillDTableX2Level2(HUF_DEltX2* DTable, U32 sizeLog, const U32 consumed,
|
529
529
|
const U32* rankValOrigin, const int minWeight,
|
530
530
|
const sortedSymbol_t* sortedSymbols, const U32 sortedListSize,
|
531
|
-
U32 nbBitsBaseline, U16 baseSeq)
|
531
|
+
U32 nbBitsBaseline, U16 baseSeq, U32* wksp, size_t wkspSize)
|
532
532
|
{
|
533
533
|
HUF_DEltX2 DElt;
|
534
|
-
U32 rankVal
|
534
|
+
U32* rankVal = wksp;
|
535
535
|
|
536
|
+
assert(wkspSize >= HUF_TABLELOG_MAX + 1);
|
537
|
+
(void)wkspSize;
|
536
538
|
/* get pre-calculated rankVal */
|
537
|
-
ZSTD_memcpy(rankVal, rankValOrigin, sizeof(
|
539
|
+
ZSTD_memcpy(rankVal, rankValOrigin, sizeof(U32) * (HUF_TABLELOG_MAX + 1));
|
538
540
|
|
539
541
|
/* fill skipped values */
|
540
542
|
if (minWeight>1) {
|
@@ -569,14 +571,18 @@ static void HUF_fillDTableX2Level2(HUF_DEltX2* DTable, U32 sizeLog, const U32 co
|
|
569
571
|
static void HUF_fillDTableX2(HUF_DEltX2* DTable, const U32 targetLog,
|
570
572
|
const sortedSymbol_t* sortedList, const U32 sortedListSize,
|
571
573
|
const U32* rankStart, rankVal_t rankValOrigin, const U32 maxWeight,
|
572
|
-
const U32 nbBitsBaseline)
|
574
|
+
const U32 nbBitsBaseline, U32* wksp, size_t wkspSize)
|
573
575
|
{
|
574
|
-
U32 rankVal
|
576
|
+
U32* rankVal = wksp;
|
575
577
|
const int scaleLog = nbBitsBaseline - targetLog; /* note : targetLog >= srcLog, hence scaleLog <= 1 */
|
576
578
|
const U32 minBits = nbBitsBaseline - maxWeight;
|
577
579
|
U32 s;
|
578
580
|
|
579
|
-
|
581
|
+
assert(wkspSize >= HUF_TABLELOG_MAX + 1);
|
582
|
+
wksp += HUF_TABLELOG_MAX + 1;
|
583
|
+
wkspSize -= HUF_TABLELOG_MAX + 1;
|
584
|
+
|
585
|
+
ZSTD_memcpy(rankVal, rankValOrigin, sizeof(U32) * (HUF_TABLELOG_MAX + 1));
|
580
586
|
|
581
587
|
/* fill DTable */
|
582
588
|
for (s=0; s<sortedListSize; s++) {
|
@@ -594,7 +600,7 @@ static void HUF_fillDTableX2(HUF_DEltX2* DTable, const U32 targetLog,
|
|
594
600
|
HUF_fillDTableX2Level2(DTable+start, targetLog-nbBits, nbBits,
|
595
601
|
rankValOrigin[nbBits], minWeight,
|
596
602
|
sortedList+sortedRank, sortedListSize-sortedRank,
|
597
|
-
nbBitsBaseline, symbol);
|
603
|
+
nbBitsBaseline, symbol, wksp, wkspSize);
|
598
604
|
} else {
|
599
605
|
HUF_DEltX2 DElt;
|
600
606
|
MEM_writeLE16(&(DElt.sequence), symbol);
|
@@ -608,6 +614,15 @@ static void HUF_fillDTableX2(HUF_DEltX2* DTable, const U32 targetLog,
|
|
608
614
|
}
|
609
615
|
}
|
610
616
|
|
617
|
+
typedef struct {
|
618
|
+
rankValCol_t rankVal[HUF_TABLELOG_MAX];
|
619
|
+
U32 rankStats[HUF_TABLELOG_MAX + 1];
|
620
|
+
U32 rankStart0[HUF_TABLELOG_MAX + 2];
|
621
|
+
sortedSymbol_t sortedSymbol[HUF_SYMBOLVALUE_MAX + 1];
|
622
|
+
BYTE weightList[HUF_SYMBOLVALUE_MAX + 1];
|
623
|
+
U32 calleeWksp[HUF_READ_STATS_WORKSPACE_SIZE_U32];
|
624
|
+
} HUF_ReadDTableX2_Workspace;
|
625
|
+
|
611
626
|
size_t HUF_readDTableX2_wksp(HUF_DTable* DTable,
|
612
627
|
const void* src, size_t srcSize,
|
613
628
|
void* workSpace, size_t wkspSize)
|
@@ -620,47 +635,32 @@ size_t HUF_readDTableX2_wksp(HUF_DTable* DTable,
|
|
620
635
|
HUF_DEltX2* const dt = (HUF_DEltX2*)dtPtr;
|
621
636
|
U32 *rankStart;
|
622
637
|
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
rankVal = (rankValCol_t *)((U32 *)workSpace + spaceUsed32);
|
631
|
-
spaceUsed32 += (sizeof(rankValCol_t) * HUF_TABLELOG_MAX) >> 2;
|
632
|
-
rankStats = (U32 *)workSpace + spaceUsed32;
|
633
|
-
spaceUsed32 += HUF_TABLELOG_MAX + 1;
|
634
|
-
rankStart0 = (U32 *)workSpace + spaceUsed32;
|
635
|
-
spaceUsed32 += HUF_TABLELOG_MAX + 2;
|
636
|
-
sortedSymbol = (sortedSymbol_t *)workSpace + (spaceUsed32 * sizeof(U32)) / sizeof(sortedSymbol_t);
|
637
|
-
spaceUsed32 += HUF_ALIGN(sizeof(sortedSymbol_t) * (HUF_SYMBOLVALUE_MAX + 1), sizeof(U32)) >> 2;
|
638
|
-
weightList = (BYTE *)((U32 *)workSpace + spaceUsed32);
|
639
|
-
spaceUsed32 += HUF_ALIGN(HUF_SYMBOLVALUE_MAX + 1, sizeof(U32)) >> 2;
|
640
|
-
|
641
|
-
if ((spaceUsed32 << 2) > wkspSize) return ERROR(tableLog_tooLarge);
|
642
|
-
|
643
|
-
rankStart = rankStart0 + 1;
|
644
|
-
ZSTD_memset(rankStats, 0, sizeof(U32) * (2 * HUF_TABLELOG_MAX + 2 + 1));
|
638
|
+
HUF_ReadDTableX2_Workspace* const wksp = (HUF_ReadDTableX2_Workspace*)workSpace;
|
639
|
+
|
640
|
+
if (sizeof(*wksp) > wkspSize) return ERROR(GENERIC);
|
641
|
+
|
642
|
+
rankStart = wksp->rankStart0 + 1;
|
643
|
+
ZSTD_memset(wksp->rankStats, 0, sizeof(wksp->rankStats));
|
644
|
+
ZSTD_memset(wksp->rankStart0, 0, sizeof(wksp->rankStart0));
|
645
645
|
|
646
646
|
DEBUG_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(HUF_DTable)); /* if compiler fails here, assertion is wrong */
|
647
647
|
if (maxTableLog > HUF_TABLELOG_MAX) return ERROR(tableLog_tooLarge);
|
648
648
|
/* ZSTD_memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */
|
649
649
|
|
650
|
-
iSize =
|
650
|
+
iSize = HUF_readStats_wksp(wksp->weightList, HUF_SYMBOLVALUE_MAX + 1, wksp->rankStats, &nbSymbols, &tableLog, src, srcSize, wksp->calleeWksp, sizeof(wksp->calleeWksp), /* bmi2 */ 0);
|
651
651
|
if (HUF_isError(iSize)) return iSize;
|
652
652
|
|
653
653
|
/* check result */
|
654
654
|
if (tableLog > maxTableLog) return ERROR(tableLog_tooLarge); /* DTable can't fit code depth */
|
655
655
|
|
656
656
|
/* find maxWeight */
|
657
|
-
for (maxW = tableLog; rankStats[maxW]==0; maxW--) {} /* necessarily finds a solution before 0 */
|
657
|
+
for (maxW = tableLog; wksp->rankStats[maxW]==0; maxW--) {} /* necessarily finds a solution before 0 */
|
658
658
|
|
659
659
|
/* Get start index of each weight */
|
660
660
|
{ U32 w, nextRankStart = 0;
|
661
661
|
for (w=1; w<maxW+1; w++) {
|
662
662
|
U32 curr = nextRankStart;
|
663
|
-
nextRankStart += rankStats[w];
|
663
|
+
nextRankStart += wksp->rankStats[w];
|
664
664
|
rankStart[w] = curr;
|
665
665
|
}
|
666
666
|
rankStart[0] = nextRankStart; /* put all 0w symbols at the end of sorted list*/
|
@@ -670,37 +670,38 @@ size_t HUF_readDTableX2_wksp(HUF_DTable* DTable,
|
|
670
670
|
/* sort symbols by weight */
|
671
671
|
{ U32 s;
|
672
672
|
for (s=0; s<nbSymbols; s++) {
|
673
|
-
U32 const w = weightList[s];
|
673
|
+
U32 const w = wksp->weightList[s];
|
674
674
|
U32 const r = rankStart[w]++;
|
675
|
-
sortedSymbol[r].symbol = (BYTE)s;
|
676
|
-
sortedSymbol[r].weight = (BYTE)w;
|
675
|
+
wksp->sortedSymbol[r].symbol = (BYTE)s;
|
676
|
+
wksp->sortedSymbol[r].weight = (BYTE)w;
|
677
677
|
}
|
678
678
|
rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */
|
679
679
|
}
|
680
680
|
|
681
681
|
/* Build rankVal */
|
682
|
-
{ U32* const rankVal0 = rankVal[0];
|
682
|
+
{ U32* const rankVal0 = wksp->rankVal[0];
|
683
683
|
{ int const rescale = (maxTableLog-tableLog) - 1; /* tableLog <= maxTableLog */
|
684
684
|
U32 nextRankVal = 0;
|
685
685
|
U32 w;
|
686
686
|
for (w=1; w<maxW+1; w++) {
|
687
687
|
U32 curr = nextRankVal;
|
688
|
-
nextRankVal += rankStats[w] << (w+rescale);
|
688
|
+
nextRankVal += wksp->rankStats[w] << (w+rescale);
|
689
689
|
rankVal0[w] = curr;
|
690
690
|
} }
|
691
691
|
{ U32 const minBits = tableLog+1 - maxW;
|
692
692
|
U32 consumed;
|
693
693
|
for (consumed = minBits; consumed < maxTableLog - minBits + 1; consumed++) {
|
694
|
-
U32* const rankValPtr = rankVal[consumed];
|
694
|
+
U32* const rankValPtr = wksp->rankVal[consumed];
|
695
695
|
U32 w;
|
696
696
|
for (w = 1; w < maxW+1; w++) {
|
697
697
|
rankValPtr[w] = rankVal0[w] >> consumed;
|
698
698
|
} } } }
|
699
699
|
|
700
700
|
HUF_fillDTableX2(dt, maxTableLog,
|
701
|
-
sortedSymbol, sizeOfSort,
|
702
|
-
rankStart0, rankVal, maxW,
|
703
|
-
tableLog+1
|
701
|
+
wksp->sortedSymbol, sizeOfSort,
|
702
|
+
wksp->rankStart0, wksp->rankVal, maxW,
|
703
|
+
tableLog+1,
|
704
|
+
wksp->calleeWksp, sizeof(wksp->calleeWksp) / sizeof(U32));
|
704
705
|
|
705
706
|
dtd.tableLog = (BYTE)maxTableLog;
|
706
707
|
dtd.tableType = 1;
|
@@ -1225,7 +1226,7 @@ size_t HUF_decompress1X1 (void* dst, size_t dstSize, const void* cSrc, size_t cS
|
|
1225
1226
|
HUF_CREATE_STATIC_DTABLEX1(DTable, HUF_TABLELOG_MAX);
|
1226
1227
|
return HUF_decompress1X1_DCtx (DTable, dst, dstSize, cSrc, cSrcSize);
|
1227
1228
|
}
|
1228
|
-
#endif
|
1229
|
+
#endif
|
1229
1230
|
|
1230
1231
|
#ifndef HUF_FORCE_DECOMPRESS_X1
|
1231
1232
|
size_t HUF_readDTableX2(HUF_DTable* DTable, const void* src, size_t srcSize)
|