zstd-ruby 1.5.1.1 → 1.5.5.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/.gitignore +2 -0
- data/README.md +78 -5
- data/Rakefile +8 -2
- data/ext/zstdruby/common.h +15 -0
- data/ext/zstdruby/extconf.rb +1 -1
- data/ext/zstdruby/libzstd/common/allocations.h +55 -0
- data/ext/zstdruby/libzstd/common/bits.h +200 -0
- data/ext/zstdruby/libzstd/common/bitstream.h +19 -60
- data/ext/zstdruby/libzstd/common/compiler.h +26 -3
- 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 +12 -40
- data/ext/zstdruby/libzstd/common/error_private.c +9 -2
- data/ext/zstdruby/libzstd/common/error_private.h +1 -1
- data/ext/zstdruby/libzstd/common/fse.h +5 -83
- data/ext/zstdruby/libzstd/common/fse_decompress.c +7 -99
- data/ext/zstdruby/libzstd/common/huf.h +65 -156
- data/ext/zstdruby/libzstd/common/mem.h +39 -46
- data/ext/zstdruby/libzstd/common/pool.c +37 -16
- data/ext/zstdruby/libzstd/common/pool.h +9 -3
- data/ext/zstdruby/libzstd/common/portability_macros.h +28 -3
- data/ext/zstdruby/libzstd/common/threading.c +68 -14
- data/ext/zstdruby/libzstd/common/threading.h +5 -10
- data/ext/zstdruby/libzstd/common/xxhash.c +2 -2
- data/ext/zstdruby/libzstd/common/xxhash.h +8 -8
- data/ext/zstdruby/libzstd/common/zstd_common.c +1 -36
- data/ext/zstdruby/libzstd/common/zstd_deps.h +1 -1
- data/ext/zstdruby/libzstd/common/zstd_internal.h +20 -122
- data/ext/zstdruby/libzstd/common/zstd_trace.h +3 -3
- data/ext/zstdruby/libzstd/compress/clevels.h +1 -1
- data/ext/zstdruby/libzstd/compress/fse_compress.c +7 -124
- 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 +234 -169
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +1317 -594
- data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +272 -165
- data/ext/zstdruby/libzstd/compress/zstd_compress_literals.c +115 -39
- data/ext/zstdruby/libzstd/compress/zstd_compress_literals.h +16 -8
- data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.c +13 -13
- data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +25 -21
- data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +162 -82
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +95 -33
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +3 -2
- data/ext/zstdruby/libzstd/compress/zstd_fast.c +434 -149
- data/ext/zstdruby/libzstd/compress/zstd_fast.h +3 -2
- data/ext/zstdruby/libzstd/compress/zstd_lazy.c +405 -348
- data/ext/zstdruby/libzstd/compress/zstd_lazy.h +4 -2
- data/ext/zstdruby/libzstd/compress/zstd_ldm.c +9 -7
- data/ext/zstdruby/libzstd/compress/zstd_ldm.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_ldm_geartab.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_opt.c +149 -100
- data/ext/zstdruby/libzstd/compress/zstd_opt.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +32 -16
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +5 -2
- data/ext/zstdruby/libzstd/decompress/huf_decompress.c +434 -441
- data/ext/zstdruby/libzstd/decompress/huf_decompress_amd64.S +42 -37
- data/ext/zstdruby/libzstd/decompress/zstd_ddict.c +4 -4
- data/ext/zstdruby/libzstd/decompress/zstd_ddict.h +1 -1
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +205 -80
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +201 -81
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +6 -1
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +4 -2
- data/ext/zstdruby/libzstd/dictBuilder/cover.c +19 -15
- data/ext/zstdruby/libzstd/dictBuilder/cover.h +1 -1
- data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +2 -2
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +13 -91
- data/ext/zstdruby/libzstd/zdict.h +53 -31
- data/ext/zstdruby/libzstd/zstd.h +580 -135
- data/ext/zstdruby/libzstd/zstd_errors.h +27 -8
- data/ext/zstdruby/main.c +20 -0
- data/ext/zstdruby/skippable_frame.c +63 -0
- data/ext/zstdruby/streaming_compress.c +177 -0
- data/ext/zstdruby/streaming_compress.h +5 -0
- data/ext/zstdruby/streaming_decompress.c +123 -0
- data/ext/zstdruby/zstdruby.c +113 -31
- data/lib/zstd-ruby/version.rb +1 -1
- data/lib/zstd-ruby.rb +0 -1
- data/zstd-ruby.gemspec +1 -1
- metadata +11 -37
- data/.github/dependabot.yml +0 -8
- data/.github/workflows/ruby.yml +0 -35
- data/ext/zstdruby/libzstd/.gitignore +0 -3
- data/ext/zstdruby/libzstd/BUCK +0 -232
- data/ext/zstdruby/libzstd/Makefile +0 -357
- data/ext/zstdruby/libzstd/README.md +0 -217
- data/ext/zstdruby/libzstd/deprecated/zbuff.h +0 -214
- data/ext/zstdruby/libzstd/deprecated/zbuff_common.c +0 -26
- data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +0 -167
- data/ext/zstdruby/libzstd/deprecated/zbuff_decompress.c +0 -75
- data/ext/zstdruby/libzstd/dll/example/Makefile +0 -48
- data/ext/zstdruby/libzstd/dll/example/README.md +0 -63
- data/ext/zstdruby/libzstd/dll/example/build_package.bat +0 -20
- data/ext/zstdruby/libzstd/dll/example/fullbench-dll.sln +0 -25
- data/ext/zstdruby/libzstd/dll/example/fullbench-dll.vcxproj +0 -181
- data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +0 -415
- data/ext/zstdruby/libzstd/legacy/zstd_v01.c +0 -2158
- data/ext/zstdruby/libzstd/legacy/zstd_v01.h +0 -94
- data/ext/zstdruby/libzstd/legacy/zstd_v02.c +0 -3518
- data/ext/zstdruby/libzstd/legacy/zstd_v02.h +0 -93
- data/ext/zstdruby/libzstd/legacy/zstd_v03.c +0 -3160
- data/ext/zstdruby/libzstd/legacy/zstd_v03.h +0 -93
- data/ext/zstdruby/libzstd/legacy/zstd_v04.c +0 -3647
- data/ext/zstdruby/libzstd/legacy/zstd_v04.h +0 -142
- data/ext/zstdruby/libzstd/legacy/zstd_v05.c +0 -4050
- data/ext/zstdruby/libzstd/legacy/zstd_v05.h +0 -162
- data/ext/zstdruby/libzstd/legacy/zstd_v06.c +0 -4154
- data/ext/zstdruby/libzstd/legacy/zstd_v06.h +0 -172
- data/ext/zstdruby/libzstd/legacy/zstd_v07.c +0 -4541
- data/ext/zstdruby/libzstd/legacy/zstd_v07.h +0 -187
- data/ext/zstdruby/libzstd/libzstd.mk +0 -185
- data/ext/zstdruby/libzstd/libzstd.pc.in +0 -16
- data/ext/zstdruby/libzstd/modulemap/module.modulemap +0 -4
- data/ext/zstdruby/zstdruby.h +0 -6
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
#define ZSTD_PORTABILITY_MACROS_H
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
* This header file contains macro
|
|
15
|
+
* This header file contains macro definitions to support portability.
|
|
16
16
|
* This header is shared between C and ASM code, so it MUST only
|
|
17
17
|
* contain macro definitions. It MUST not contain any C code.
|
|
18
18
|
*
|
|
@@ -65,6 +65,12 @@
|
|
|
65
65
|
# endif
|
|
66
66
|
#endif
|
|
67
67
|
|
|
68
|
+
/* Mark the internal assembly functions as hidden */
|
|
69
|
+
#ifdef __ELF__
|
|
70
|
+
# define ZSTD_HIDE_ASM_FUNCTION(func) .hidden func
|
|
71
|
+
#else
|
|
72
|
+
# define ZSTD_HIDE_ASM_FUNCTION(func)
|
|
73
|
+
#endif
|
|
68
74
|
|
|
69
75
|
/* Enable runtime BMI2 dispatch based on the CPU.
|
|
70
76
|
* Enabled for clang & gcc >=4.8 on x86 when BMI2 isn't enabled by default.
|
|
@@ -82,7 +88,7 @@
|
|
|
82
88
|
#endif
|
|
83
89
|
|
|
84
90
|
/**
|
|
85
|
-
* Only enable assembly for GNUC
|
|
91
|
+
* Only enable assembly for GNUC compatible compilers,
|
|
86
92
|
* because other platforms may not support GAS assembly syntax.
|
|
87
93
|
*
|
|
88
94
|
* Only enable assembly for Linux / MacOS, other platforms may
|
|
@@ -128,4 +134,23 @@
|
|
|
128
134
|
# define ZSTD_ENABLE_ASM_X86_64_BMI2 0
|
|
129
135
|
#endif
|
|
130
136
|
|
|
137
|
+
/*
|
|
138
|
+
* For x86 ELF targets, add .note.gnu.property section for Intel CET in
|
|
139
|
+
* assembly sources when CET is enabled.
|
|
140
|
+
*
|
|
141
|
+
* Additionally, any function that may be called indirectly must begin
|
|
142
|
+
* with ZSTD_CET_ENDBRANCH.
|
|
143
|
+
*/
|
|
144
|
+
#if defined(__ELF__) && (defined(__x86_64__) || defined(__i386__)) \
|
|
145
|
+
&& defined(__has_include)
|
|
146
|
+
# if __has_include(<cet.h>)
|
|
147
|
+
# include <cet.h>
|
|
148
|
+
# define ZSTD_CET_ENDBRANCH _CET_ENDBR
|
|
149
|
+
# endif
|
|
150
|
+
#endif
|
|
151
|
+
|
|
152
|
+
#ifndef ZSTD_CET_ENDBRANCH
|
|
153
|
+
# define ZSTD_CET_ENDBRANCH
|
|
154
|
+
#endif
|
|
155
|
+
|
|
131
156
|
#endif /* ZSTD_PORTABILITY_MACROS_H */
|
|
@@ -23,8 +23,7 @@ int g_ZSTD_threading_useless_symbol;
|
|
|
23
23
|
#if defined(ZSTD_MULTITHREAD) && defined(_WIN32)
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
* Windows minimalist Pthread Wrapper
|
|
27
|
-
* http://www.cse.wustl.edu/~schmidt/win32-cv-1.html
|
|
26
|
+
* Windows minimalist Pthread Wrapper
|
|
28
27
|
*/
|
|
29
28
|
|
|
30
29
|
|
|
@@ -35,37 +34,92 @@ int g_ZSTD_threading_useless_symbol;
|
|
|
35
34
|
|
|
36
35
|
/* === Implementation === */
|
|
37
36
|
|
|
37
|
+
typedef struct {
|
|
38
|
+
void* (*start_routine)(void*);
|
|
39
|
+
void* arg;
|
|
40
|
+
int initialized;
|
|
41
|
+
ZSTD_pthread_cond_t initialized_cond;
|
|
42
|
+
ZSTD_pthread_mutex_t initialized_mutex;
|
|
43
|
+
} ZSTD_thread_params_t;
|
|
44
|
+
|
|
38
45
|
static unsigned __stdcall worker(void *arg)
|
|
39
46
|
{
|
|
40
|
-
|
|
41
|
-
|
|
47
|
+
void* (*start_routine)(void*);
|
|
48
|
+
void* thread_arg;
|
|
49
|
+
|
|
50
|
+
/* Initialized thread_arg and start_routine and signal main thread that we don't need it
|
|
51
|
+
* to wait any longer.
|
|
52
|
+
*/
|
|
53
|
+
{
|
|
54
|
+
ZSTD_thread_params_t* thread_param = (ZSTD_thread_params_t*)arg;
|
|
55
|
+
thread_arg = thread_param->arg;
|
|
56
|
+
start_routine = thread_param->start_routine;
|
|
57
|
+
|
|
58
|
+
/* Signal main thread that we are running and do not depend on its memory anymore */
|
|
59
|
+
ZSTD_pthread_mutex_lock(&thread_param->initialized_mutex);
|
|
60
|
+
thread_param->initialized = 1;
|
|
61
|
+
ZSTD_pthread_cond_signal(&thread_param->initialized_cond);
|
|
62
|
+
ZSTD_pthread_mutex_unlock(&thread_param->initialized_mutex);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
start_routine(thread_arg);
|
|
66
|
+
|
|
42
67
|
return 0;
|
|
43
68
|
}
|
|
44
69
|
|
|
45
70
|
int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused,
|
|
46
71
|
void* (*start_routine) (void*), void* arg)
|
|
47
72
|
{
|
|
73
|
+
ZSTD_thread_params_t thread_param;
|
|
48
74
|
(void)unused;
|
|
49
|
-
thread->arg = arg;
|
|
50
|
-
thread->start_routine = start_routine;
|
|
51
|
-
thread->handle = (HANDLE) _beginthreadex(NULL, 0, worker, thread, 0, NULL);
|
|
52
75
|
|
|
53
|
-
|
|
76
|
+
thread_param.start_routine = start_routine;
|
|
77
|
+
thread_param.arg = arg;
|
|
78
|
+
thread_param.initialized = 0;
|
|
79
|
+
*thread = NULL;
|
|
80
|
+
|
|
81
|
+
/* Setup thread initialization synchronization */
|
|
82
|
+
if(ZSTD_pthread_cond_init(&thread_param.initialized_cond, NULL)) {
|
|
83
|
+
/* Should never happen on Windows */
|
|
84
|
+
return -1;
|
|
85
|
+
}
|
|
86
|
+
if(ZSTD_pthread_mutex_init(&thread_param.initialized_mutex, NULL)) {
|
|
87
|
+
/* Should never happen on Windows */
|
|
88
|
+
ZSTD_pthread_cond_destroy(&thread_param.initialized_cond);
|
|
89
|
+
return -1;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* Spawn thread */
|
|
93
|
+
*thread = (HANDLE)_beginthreadex(NULL, 0, worker, &thread_param, 0, NULL);
|
|
94
|
+
if (!thread) {
|
|
95
|
+
ZSTD_pthread_mutex_destroy(&thread_param.initialized_mutex);
|
|
96
|
+
ZSTD_pthread_cond_destroy(&thread_param.initialized_cond);
|
|
54
97
|
return errno;
|
|
55
|
-
|
|
56
|
-
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Wait for thread to be initialized */
|
|
101
|
+
ZSTD_pthread_mutex_lock(&thread_param.initialized_mutex);
|
|
102
|
+
while(!thread_param.initialized) {
|
|
103
|
+
ZSTD_pthread_cond_wait(&thread_param.initialized_cond, &thread_param.initialized_mutex);
|
|
104
|
+
}
|
|
105
|
+
ZSTD_pthread_mutex_unlock(&thread_param.initialized_mutex);
|
|
106
|
+
ZSTD_pthread_mutex_destroy(&thread_param.initialized_mutex);
|
|
107
|
+
ZSTD_pthread_cond_destroy(&thread_param.initialized_cond);
|
|
108
|
+
|
|
109
|
+
return 0;
|
|
57
110
|
}
|
|
58
111
|
|
|
59
|
-
int ZSTD_pthread_join(ZSTD_pthread_t thread
|
|
112
|
+
int ZSTD_pthread_join(ZSTD_pthread_t thread)
|
|
60
113
|
{
|
|
61
114
|
DWORD result;
|
|
62
115
|
|
|
63
|
-
if (!thread
|
|
116
|
+
if (!thread) return 0;
|
|
117
|
+
|
|
118
|
+
result = WaitForSingleObject(thread, INFINITE);
|
|
119
|
+
CloseHandle(thread);
|
|
64
120
|
|
|
65
|
-
result = WaitForSingleObject(thread.handle, INFINITE);
|
|
66
121
|
switch (result) {
|
|
67
122
|
case WAIT_OBJECT_0:
|
|
68
|
-
if (value_ptr) *value_ptr = thread.arg;
|
|
69
123
|
return 0;
|
|
70
124
|
case WAIT_ABANDONED:
|
|
71
125
|
return EINVAL;
|
|
@@ -23,8 +23,7 @@ extern "C" {
|
|
|
23
23
|
#if defined(ZSTD_MULTITHREAD) && defined(_WIN32)
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
* Windows minimalist Pthread Wrapper
|
|
27
|
-
* http://www.cse.wustl.edu/~schmidt/win32-cv-1.html
|
|
26
|
+
* Windows minimalist Pthread Wrapper
|
|
28
27
|
*/
|
|
29
28
|
#ifdef WINVER
|
|
30
29
|
# undef WINVER
|
|
@@ -62,16 +61,12 @@ extern "C" {
|
|
|
62
61
|
#define ZSTD_pthread_cond_broadcast(a) WakeAllConditionVariable((a))
|
|
63
62
|
|
|
64
63
|
/* ZSTD_pthread_create() and ZSTD_pthread_join() */
|
|
65
|
-
typedef
|
|
66
|
-
HANDLE handle;
|
|
67
|
-
void* (*start_routine)(void*);
|
|
68
|
-
void* arg;
|
|
69
|
-
} ZSTD_pthread_t;
|
|
64
|
+
typedef HANDLE ZSTD_pthread_t;
|
|
70
65
|
|
|
71
66
|
int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused,
|
|
72
67
|
void* (*start_routine) (void*), void* arg);
|
|
73
68
|
|
|
74
|
-
int ZSTD_pthread_join(ZSTD_pthread_t thread
|
|
69
|
+
int ZSTD_pthread_join(ZSTD_pthread_t thread);
|
|
75
70
|
|
|
76
71
|
/**
|
|
77
72
|
* add here more wrappers as required
|
|
@@ -99,7 +94,7 @@ int ZSTD_pthread_join(ZSTD_pthread_t thread, void** value_ptr);
|
|
|
99
94
|
|
|
100
95
|
#define ZSTD_pthread_t pthread_t
|
|
101
96
|
#define ZSTD_pthread_create(a, b, c, d) pthread_create((a), (b), (c), (d))
|
|
102
|
-
#define ZSTD_pthread_join(a
|
|
97
|
+
#define ZSTD_pthread_join(a) pthread_join((a),NULL)
|
|
103
98
|
|
|
104
99
|
#else /* DEBUGLEVEL >= 1 */
|
|
105
100
|
|
|
@@ -124,7 +119,7 @@ int ZSTD_pthread_cond_destroy(ZSTD_pthread_cond_t* cond);
|
|
|
124
119
|
|
|
125
120
|
#define ZSTD_pthread_t pthread_t
|
|
126
121
|
#define ZSTD_pthread_create(a, b, c, d) pthread_create((a), (b), (c), (d))
|
|
127
|
-
#define ZSTD_pthread_join(a
|
|
122
|
+
#define ZSTD_pthread_join(a) pthread_join((a),NULL)
|
|
128
123
|
|
|
129
124
|
#endif
|
|
130
125
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* xxHash - Fast Hash algorithm
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
4
4
|
*
|
|
5
5
|
* You can contact the author at :
|
|
6
|
-
* - xxHash homepage:
|
|
6
|
+
* - xxHash homepage: https://cyan4973.github.io/xxHash/
|
|
7
7
|
* - xxHash source repository : https://github.com/Cyan4973/xxHash
|
|
8
8
|
*
|
|
9
9
|
* This source code is licensed under both the BSD-style license (found in the
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* xxHash - Fast Hash algorithm
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
4
4
|
*
|
|
5
5
|
* You can contact the author at :
|
|
6
|
-
* - xxHash homepage:
|
|
6
|
+
* - xxHash homepage: https://cyan4973.github.io/xxHash/
|
|
7
7
|
* - xxHash source repository : https://github.com/Cyan4973/xxHash
|
|
8
8
|
*
|
|
9
9
|
* This source code is licensed under both the BSD-style license (found in the
|
|
@@ -1314,7 +1314,7 @@ XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr,
|
|
|
1314
1314
|
* care, as what works on one compiler/platform/optimization level may cause
|
|
1315
1315
|
* another to read garbage data or even crash.
|
|
1316
1316
|
*
|
|
1317
|
-
* See
|
|
1317
|
+
* See https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html for details.
|
|
1318
1318
|
*
|
|
1319
1319
|
* Prefer these methods in priority order (0 > 3 > 1 > 2)
|
|
1320
1320
|
*/
|
|
@@ -1534,7 +1534,7 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) { return ZSTD_
|
|
|
1534
1534
|
* @brief Used to prevent unwanted optimizations for @p var.
|
|
1535
1535
|
*
|
|
1536
1536
|
* It uses an empty GCC inline assembly statement with a register constraint
|
|
1537
|
-
* which forces @p var into a general purpose register (
|
|
1537
|
+
* which forces @p var into a general purpose register (e.g. eax, ebx, ecx
|
|
1538
1538
|
* on x86) and marks it as modified.
|
|
1539
1539
|
*
|
|
1540
1540
|
* This is used in a few places to avoid unwanted autovectorization (e.g.
|
|
@@ -1655,7 +1655,7 @@ static xxh_u32 XXH_read32(const void* ptr)
|
|
|
1655
1655
|
|
|
1656
1656
|
/*
|
|
1657
1657
|
* Portable and safe solution. Generally efficient.
|
|
1658
|
-
* see:
|
|
1658
|
+
* see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html
|
|
1659
1659
|
*/
|
|
1660
1660
|
static xxh_u32 XXH_read32(const void* memPtr)
|
|
1661
1661
|
{
|
|
@@ -2296,7 +2296,7 @@ static xxh_u64 XXH_read64(const void* ptr)
|
|
|
2296
2296
|
|
|
2297
2297
|
/*
|
|
2298
2298
|
* Portable and safe solution. Generally efficient.
|
|
2299
|
-
* see:
|
|
2299
|
+
* see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html
|
|
2300
2300
|
*/
|
|
2301
2301
|
static xxh_u64 XXH_read64(const void* memPtr)
|
|
2302
2302
|
{
|
|
@@ -2809,7 +2809,7 @@ enum XXH_VECTOR_TYPE /* fake enum */ {
|
|
|
2809
2809
|
* @ingroup tuning
|
|
2810
2810
|
* @brief Selects the minimum alignment for XXH3's accumulators.
|
|
2811
2811
|
*
|
|
2812
|
-
* When using SIMD, this should match the alignment
|
|
2812
|
+
* When using SIMD, this should match the alignment required for said vector
|
|
2813
2813
|
* type, so, for example, 32 for AVX2.
|
|
2814
2814
|
*
|
|
2815
2815
|
* Default: Auto detected.
|
|
@@ -3026,7 +3026,7 @@ enum XXH_VECTOR_TYPE /* fake enum */ {
|
|
|
3026
3026
|
* have more than 2 NEON (F0/F1) micro-ops. If you are only using NEON instructions,
|
|
3027
3027
|
* you are only using 2/3 of the CPU bandwidth.
|
|
3028
3028
|
*
|
|
3029
|
-
* This is even more
|
|
3029
|
+
* This is even more noticeable on the more advanced cores like the A76 which
|
|
3030
3030
|
* can dispatch 8 micro-ops per cycle, but still only 2 NEON micro-ops at once.
|
|
3031
3031
|
*
|
|
3032
3032
|
* Therefore, @ref XXH3_NEON_LANES lanes will be processed using NEON, and the
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
* Dependencies
|
|
15
15
|
***************************************/
|
|
16
16
|
#define ZSTD_DEPS_NEED_MALLOC
|
|
17
|
-
#include "zstd_deps.h" /* ZSTD_malloc, ZSTD_calloc, ZSTD_free, ZSTD_memset */
|
|
18
17
|
#include "error_private.h"
|
|
19
18
|
#include "zstd_internal.h"
|
|
20
19
|
|
|
@@ -47,37 +46,3 @@ ZSTD_ErrorCode ZSTD_getErrorCode(size_t code) { return ERR_getErrorCode(code); }
|
|
|
47
46
|
/*! ZSTD_getErrorString() :
|
|
48
47
|
* provides error code string from enum */
|
|
49
48
|
const char* ZSTD_getErrorString(ZSTD_ErrorCode code) { return ERR_getErrorString(code); }
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
/*=**************************************************************
|
|
54
|
-
* Custom allocator
|
|
55
|
-
****************************************************************/
|
|
56
|
-
void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem)
|
|
57
|
-
{
|
|
58
|
-
if (customMem.customAlloc)
|
|
59
|
-
return customMem.customAlloc(customMem.opaque, size);
|
|
60
|
-
return ZSTD_malloc(size);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem)
|
|
64
|
-
{
|
|
65
|
-
if (customMem.customAlloc) {
|
|
66
|
-
/* calloc implemented as malloc+memset;
|
|
67
|
-
* not as efficient as calloc, but next best guess for custom malloc */
|
|
68
|
-
void* const ptr = customMem.customAlloc(customMem.opaque, size);
|
|
69
|
-
ZSTD_memset(ptr, 0, size);
|
|
70
|
-
return ptr;
|
|
71
|
-
}
|
|
72
|
-
return ZSTD_calloc(1, size);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
void ZSTD_customFree(void* ptr, ZSTD_customMem customMem)
|
|
76
|
-
{
|
|
77
|
-
if (ptr!=NULL) {
|
|
78
|
-
if (customMem.customFree)
|
|
79
|
-
customMem.customFree(customMem.opaque, ptr);
|
|
80
|
-
else
|
|
81
|
-
ZSTD_free(ptr);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
|
@@ -28,7 +28,6 @@
|
|
|
28
28
|
#include "../zstd.h"
|
|
29
29
|
#define FSE_STATIC_LINKING_ONLY
|
|
30
30
|
#include "fse.h"
|
|
31
|
-
#define HUF_STATIC_LINKING_ONLY
|
|
32
31
|
#include "huf.h"
|
|
33
32
|
#ifndef XXH_STATIC_LINKING_ONLY
|
|
34
33
|
# define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */
|
|
@@ -67,7 +66,6 @@ extern "C" {
|
|
|
67
66
|
#define ZSTD_OPT_NUM (1<<12)
|
|
68
67
|
|
|
69
68
|
#define ZSTD_REP_NUM 3 /* number of repcodes */
|
|
70
|
-
#define ZSTD_REP_MOVE (ZSTD_REP_NUM-1)
|
|
71
69
|
static UNUSED_ATTR const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 };
|
|
72
70
|
|
|
73
71
|
#define KB *(1 <<10)
|
|
@@ -94,9 +92,9 @@ typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e;
|
|
|
94
92
|
#define ZSTD_FRAMECHECKSUMSIZE 4
|
|
95
93
|
|
|
96
94
|
#define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */
|
|
97
|
-
#define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */
|
|
95
|
+
#define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */) /* for a non-null block */
|
|
96
|
+
#define MIN_LITERALS_FOR_4_STREAMS 6
|
|
98
97
|
|
|
99
|
-
#define HufLog 12
|
|
100
98
|
typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingType_e;
|
|
101
99
|
|
|
102
100
|
#define LONGNBSEQ 0x7F00
|
|
@@ -104,6 +102,7 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy
|
|
|
104
102
|
#define MINMATCH 3
|
|
105
103
|
|
|
106
104
|
#define Litbits 8
|
|
105
|
+
#define LitHufLog 11
|
|
107
106
|
#define MaxLit ((1<<Litbits) - 1)
|
|
108
107
|
#define MaxML 52
|
|
109
108
|
#define MaxLL 35
|
|
@@ -114,6 +113,8 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy
|
|
|
114
113
|
#define LLFSELog 9
|
|
115
114
|
#define OffFSELog 8
|
|
116
115
|
#define MaxFSELog MAX(MAX(MLFSELog, LLFSELog), OffFSELog)
|
|
116
|
+
#define MaxMLBits 16
|
|
117
|
+
#define MaxLLBits 16
|
|
117
118
|
|
|
118
119
|
#define ZSTD_MAX_HUF_HEADER_SIZE 128 /* header + <= 127 byte tree description */
|
|
119
120
|
/* Each table cannot take more than #symbols * FSELog bits */
|
|
@@ -236,12 +237,6 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e
|
|
|
236
237
|
* one COPY16() in the first call. Then, do two calls per loop since
|
|
237
238
|
* at that point it is more likely to have a high trip count.
|
|
238
239
|
*/
|
|
239
|
-
#ifdef __aarch64__
|
|
240
|
-
do {
|
|
241
|
-
COPY16(op, ip);
|
|
242
|
-
}
|
|
243
|
-
while (op < oend);
|
|
244
|
-
#else
|
|
245
240
|
ZSTD_copy16(op, ip);
|
|
246
241
|
if (16 >= length) return;
|
|
247
242
|
op += 16;
|
|
@@ -251,7 +246,6 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e
|
|
|
251
246
|
COPY16(op, ip);
|
|
252
247
|
}
|
|
253
248
|
while (op < oend);
|
|
254
|
-
#endif
|
|
255
249
|
}
|
|
256
250
|
}
|
|
257
251
|
|
|
@@ -285,9 +279,9 @@ typedef enum {
|
|
|
285
279
|
* Private declarations
|
|
286
280
|
*********************************************/
|
|
287
281
|
typedef struct seqDef_s {
|
|
288
|
-
U32
|
|
282
|
+
U32 offBase; /* offBase == Offset + ZSTD_REP_NUM, or repcode 1,2,3 */
|
|
289
283
|
U16 litLength;
|
|
290
|
-
U16 matchLength
|
|
284
|
+
U16 mlBase; /* mlBase == matchLength - MINMATCH */
|
|
291
285
|
} seqDef;
|
|
292
286
|
|
|
293
287
|
/* Controls whether seqStore has a single "long" litLength or matchLength. See seqStore_t. */
|
|
@@ -300,11 +294,11 @@ typedef enum {
|
|
|
300
294
|
typedef struct {
|
|
301
295
|
seqDef* sequencesStart;
|
|
302
296
|
seqDef* sequences; /* ptr to end of sequences */
|
|
303
|
-
BYTE*
|
|
304
|
-
BYTE*
|
|
305
|
-
BYTE*
|
|
306
|
-
BYTE*
|
|
307
|
-
BYTE*
|
|
297
|
+
BYTE* litStart;
|
|
298
|
+
BYTE* lit; /* ptr to end of literals */
|
|
299
|
+
BYTE* llCode;
|
|
300
|
+
BYTE* mlCode;
|
|
301
|
+
BYTE* ofCode;
|
|
308
302
|
size_t maxNbSeq;
|
|
309
303
|
size_t maxNbLit;
|
|
310
304
|
|
|
@@ -312,8 +306,8 @@ typedef struct {
|
|
|
312
306
|
* in the seqStore that has a value larger than U16 (if it exists). To do so, we increment
|
|
313
307
|
* the existing value of the litLength or matchLength by 0x10000.
|
|
314
308
|
*/
|
|
315
|
-
ZSTD_longLengthType_e
|
|
316
|
-
U32
|
|
309
|
+
ZSTD_longLengthType_e longLengthType;
|
|
310
|
+
U32 longLengthPos; /* Index of the sequence to apply long length modification to */
|
|
317
311
|
} seqStore_t;
|
|
318
312
|
|
|
319
313
|
typedef struct {
|
|
@@ -329,13 +323,13 @@ MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore
|
|
|
329
323
|
{
|
|
330
324
|
ZSTD_sequenceLength seqLen;
|
|
331
325
|
seqLen.litLength = seq->litLength;
|
|
332
|
-
seqLen.matchLength = seq->
|
|
326
|
+
seqLen.matchLength = seq->mlBase + MINMATCH;
|
|
333
327
|
if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) {
|
|
334
328
|
if (seqStore->longLengthType == ZSTD_llt_literalLength) {
|
|
335
|
-
seqLen.litLength +=
|
|
329
|
+
seqLen.litLength += 0x10000;
|
|
336
330
|
}
|
|
337
331
|
if (seqStore->longLengthType == ZSTD_llt_matchLength) {
|
|
338
|
-
seqLen.matchLength +=
|
|
332
|
+
seqLen.matchLength += 0x10000;
|
|
339
333
|
}
|
|
340
334
|
}
|
|
341
335
|
return seqLen;
|
|
@@ -348,109 +342,13 @@ MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore
|
|
|
348
342
|
* `decompressedBound != ZSTD_CONTENTSIZE_ERROR`
|
|
349
343
|
*/
|
|
350
344
|
typedef struct {
|
|
345
|
+
size_t nbBlocks;
|
|
351
346
|
size_t compressedSize;
|
|
352
347
|
unsigned long long decompressedBound;
|
|
353
348
|
} ZSTD_frameSizeInfo; /* decompress & legacy */
|
|
354
349
|
|
|
355
350
|
const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx); /* compress & dictBuilder */
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
/* custom memory allocation functions */
|
|
359
|
-
void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem);
|
|
360
|
-
void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem);
|
|
361
|
-
void ZSTD_customFree(void* ptr, ZSTD_customMem customMem);
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
MEM_STATIC U32 ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */
|
|
365
|
-
{
|
|
366
|
-
assert(val != 0);
|
|
367
|
-
{
|
|
368
|
-
# if defined(_MSC_VER) /* Visual */
|
|
369
|
-
# if STATIC_BMI2 == 1
|
|
370
|
-
return _lzcnt_u32(val)^31;
|
|
371
|
-
# else
|
|
372
|
-
if (val != 0) {
|
|
373
|
-
unsigned long r;
|
|
374
|
-
_BitScanReverse(&r, val);
|
|
375
|
-
return (unsigned)r;
|
|
376
|
-
} else {
|
|
377
|
-
/* Should not reach this code path */
|
|
378
|
-
__assume(0);
|
|
379
|
-
}
|
|
380
|
-
# endif
|
|
381
|
-
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
|
|
382
|
-
return __builtin_clz (val) ^ 31;
|
|
383
|
-
# elif defined(__ICCARM__) /* IAR Intrinsic */
|
|
384
|
-
return 31 - __CLZ(val);
|
|
385
|
-
# else /* Software version */
|
|
386
|
-
static const U32 DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
|
|
387
|
-
U32 v = val;
|
|
388
|
-
v |= v >> 1;
|
|
389
|
-
v |= v >> 2;
|
|
390
|
-
v |= v >> 4;
|
|
391
|
-
v |= v >> 8;
|
|
392
|
-
v |= v >> 16;
|
|
393
|
-
return DeBruijnClz[(v * 0x07C4ACDDU) >> 27];
|
|
394
|
-
# endif
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* Counts the number of trailing zeros of a `size_t`.
|
|
400
|
-
* Most compilers should support CTZ as a builtin. A backup
|
|
401
|
-
* implementation is provided if the builtin isn't supported, but
|
|
402
|
-
* it may not be terribly efficient.
|
|
403
|
-
*/
|
|
404
|
-
MEM_STATIC unsigned ZSTD_countTrailingZeros(size_t val)
|
|
405
|
-
{
|
|
406
|
-
if (MEM_64bits()) {
|
|
407
|
-
# if defined(_MSC_VER) && defined(_WIN64)
|
|
408
|
-
# if STATIC_BMI2
|
|
409
|
-
return _tzcnt_u64(val);
|
|
410
|
-
# else
|
|
411
|
-
if (val != 0) {
|
|
412
|
-
unsigned long r;
|
|
413
|
-
_BitScanForward64(&r, (U64)val);
|
|
414
|
-
return (unsigned)r;
|
|
415
|
-
} else {
|
|
416
|
-
/* Should not reach this code path */
|
|
417
|
-
__assume(0);
|
|
418
|
-
}
|
|
419
|
-
# endif
|
|
420
|
-
# elif defined(__GNUC__) && (__GNUC__ >= 4)
|
|
421
|
-
return __builtin_ctzll((U64)val);
|
|
422
|
-
# else
|
|
423
|
-
static const int DeBruijnBytePos[64] = { 0, 1, 2, 7, 3, 13, 8, 19,
|
|
424
|
-
4, 25, 14, 28, 9, 34, 20, 56,
|
|
425
|
-
5, 17, 26, 54, 15, 41, 29, 43,
|
|
426
|
-
10, 31, 38, 35, 21, 45, 49, 57,
|
|
427
|
-
63, 6, 12, 18, 24, 27, 33, 55,
|
|
428
|
-
16, 53, 40, 42, 30, 37, 44, 48,
|
|
429
|
-
62, 11, 23, 32, 52, 39, 36, 47,
|
|
430
|
-
61, 22, 51, 46, 60, 50, 59, 58 };
|
|
431
|
-
return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58];
|
|
432
|
-
# endif
|
|
433
|
-
} else { /* 32 bits */
|
|
434
|
-
# if defined(_MSC_VER)
|
|
435
|
-
if (val != 0) {
|
|
436
|
-
unsigned long r;
|
|
437
|
-
_BitScanForward(&r, (U32)val);
|
|
438
|
-
return (unsigned)r;
|
|
439
|
-
} else {
|
|
440
|
-
/* Should not reach this code path */
|
|
441
|
-
__assume(0);
|
|
442
|
-
}
|
|
443
|
-
# elif defined(__GNUC__) && (__GNUC__ >= 3)
|
|
444
|
-
return __builtin_ctz((U32)val);
|
|
445
|
-
# else
|
|
446
|
-
static const int DeBruijnBytePos[32] = { 0, 1, 28, 2, 29, 14, 24, 3,
|
|
447
|
-
30, 22, 20, 15, 25, 17, 4, 8,
|
|
448
|
-
31, 27, 13, 23, 21, 19, 16, 7,
|
|
449
|
-
26, 12, 18, 6, 11, 5, 10, 9 };
|
|
450
|
-
return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27];
|
|
451
|
-
# endif
|
|
452
|
-
}
|
|
453
|
-
}
|
|
351
|
+
int ZSTD_seqToCodes(const seqStore_t* seqStorePtr); /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */
|
|
454
352
|
|
|
455
353
|
|
|
456
354
|
/* ZSTD_invalidateRepCodes() :
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
|
@@ -21,13 +21,13 @@ extern "C" {
|
|
|
21
21
|
* For now, enable conservatively:
|
|
22
22
|
* - Only GNUC
|
|
23
23
|
* - Only ELF
|
|
24
|
-
* - Only x86-64 and
|
|
24
|
+
* - Only x86-64, i386 and aarch64
|
|
25
25
|
* Also, explicitly disable on platforms known not to work so they aren't
|
|
26
26
|
* forgotten in the future.
|
|
27
27
|
*/
|
|
28
28
|
#if !defined(ZSTD_HAVE_WEAK_SYMBOLS) && \
|
|
29
29
|
defined(__GNUC__) && defined(__ELF__) && \
|
|
30
|
-
(defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)) && \
|
|
30
|
+
(defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) || defined(__aarch64__)) && \
|
|
31
31
|
!defined(__APPLE__) && !defined(_WIN32) && !defined(__MINGW32__) && \
|
|
32
32
|
!defined(__CYGWIN__) && !defined(_AIX)
|
|
33
33
|
# define ZSTD_HAVE_WEAK_SYMBOLS 1
|