zstd-ruby 0.1.2 → 1.1.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f36fa5ce3c67da9e29bf1f9c14a69654107b7c56
4
- data.tar.gz: b6fc396f80f5afcb56cbc1ee11c91c5e4b24c8f3
3
+ metadata.gz: 477faa534daab9e4b42a615f87b29a6ef16676b9
4
+ data.tar.gz: 3ad80717437d8b90e07b3c6c55762fa248a38a14
5
5
  SHA512:
6
- metadata.gz: 6bcbe17151418d36c061b73f5d9fc51c137665bbe33ca09313fd031a0233cda9c16f729163672482a071839ade35dc3eb277ef3fd770382394335c8f20510b44
7
- data.tar.gz: 99f1b056099e7d01baa07fa248705bfbebf318deaae8a8ac95f9a3c31ca7174605913cec277671d5e7659b48ff5378920abdddd8f9dfce7a4ec5c817dad8ed90
6
+ metadata.gz: c35693a0ffc216560e455cc78f5659797b4baefe685e8efe2ff0e37b712543914673fa31879261c3ba8b62a7b2c3589efe75512162c91e5b095ee75bb6f99d26
7
+ data.tar.gz: 086228081f38a4eabe4de8979fb07c61964e62e233c0233e15872d43deea534d98fa2ab7ef3022703984e3be8dc16b694211edd1b0beb231a8f8a12f6553e6fd
data/README.md CHANGED
@@ -9,7 +9,7 @@ See https://github.com/facebook/zstd
9
9
  Fork from https://github.com/jarredholman/ruby-zstd.
10
10
 
11
11
  ## Zstd version
12
- v1.1.2 (https://github.com/facebook/zstd/releases/tag/v1.1.2)
12
+ v1.1.3 (https://github.com/facebook/zstd/releases/tag/v1.1.3)
13
13
 
14
14
  ## Installation
15
15
 
@@ -0,0 +1,186 @@
1
+ cxx_library(
2
+ name='zstd',
3
+ header_namespace='',
4
+ visibility=['PUBLIC'],
5
+ deps=[
6
+ ':common',
7
+ ':compress',
8
+ ':decompress',
9
+ ':deprecated',
10
+ ],
11
+ )
12
+
13
+ cxx_library(
14
+ name='compress',
15
+ header_namespace='',
16
+ visibility=['PUBLIC'],
17
+ exported_headers=subdir_glob([
18
+ ('compress', 'zstdmt_compress.h'),
19
+ ]),
20
+ headers=subdir_glob([
21
+ ('compress', 'zstd_opt.h'),
22
+ ]),
23
+ srcs=[
24
+ 'compress/zstd_compress.c',
25
+ 'compress/zstdmt_compress.c',
26
+ ],
27
+ deps=[':common'],
28
+ )
29
+
30
+ cxx_library(
31
+ name='decompress',
32
+ header_namespace='',
33
+ visibility=['PUBLIC'],
34
+ srcs=['decompress/zstd_decompress.c'],
35
+ deps=[
36
+ ':common',
37
+ ':legacy',
38
+ ],
39
+ )
40
+
41
+ cxx_library(
42
+ name='deprecated',
43
+ header_namespace='',
44
+ visibility=['PUBLIC'],
45
+ exported_headers=subdir_glob([
46
+ ('decprecated', '*.h'),
47
+ ]),
48
+ srcs=glob(['deprecated/*.c']),
49
+ deps=[':common'],
50
+ )
51
+
52
+ cxx_library(
53
+ name='legacy',
54
+ header_namespace='',
55
+ visibility=['PUBLIC'],
56
+ exported_headers=subdir_glob([
57
+ ('legacy', '*.h'),
58
+ ]),
59
+ srcs=glob(['legacy/*.c']),
60
+ deps=[':common'],
61
+ )
62
+
63
+ cxx_library(
64
+ name='zdict',
65
+ header_namespace='',
66
+ visibility=['PUBLIC'],
67
+ exported_headers=subdir_glob([
68
+ ('dictBuilder', 'zdict.h'),
69
+ ]),
70
+ headers=subdir_glob([
71
+ ('dictBuilder', 'divsufsort.h'),
72
+ ]),
73
+ srcs=glob(['dictBuilder/*.c']),
74
+ deps=[':common'],
75
+ )
76
+
77
+ cxx_library(
78
+ name='bitstream',
79
+ header_namespace='',
80
+ visibility=['PUBLIC'],
81
+ exported_headers=subdir_glob([
82
+ ('common', 'bitstream.h'),
83
+ ]),
84
+ )
85
+
86
+ cxx_library(
87
+ name='entropy',
88
+ header_namespace='',
89
+ visibility=['PUBLIC'],
90
+ exported_headers=subdir_glob([
91
+ ('common', 'fse.h'),
92
+ ('common', 'huf.h'),
93
+ ]),
94
+ srcs=[
95
+ 'common/entropy_common.c',
96
+ 'common/fse_decompress.c',
97
+ 'compress/fse_compress.c',
98
+ 'compress/huf_compress.c',
99
+ 'decompress/huf_decompress.c',
100
+ ],
101
+ deps=[
102
+ ':bitstream',
103
+ ':errors',
104
+ ':mem',
105
+ ],
106
+ )
107
+
108
+ cxx_library(
109
+ name='errors',
110
+ header_namespace='',
111
+ visibility=['PUBLIC'],
112
+ exported_headers=subdir_glob([
113
+ ('common', 'error_private.h'),
114
+ ('common', 'zstd_errors.h'),
115
+ ]),
116
+ srcs=['common/error_private.c'],
117
+ )
118
+
119
+ cxx_library(
120
+ name='mem',
121
+ header_namespace='',
122
+ visibility=['PUBLIC'],
123
+ exported_headers=subdir_glob([
124
+ ('common', 'mem.h'),
125
+ ]),
126
+ )
127
+
128
+ cxx_library(
129
+ name='pool',
130
+ header_namespace='',
131
+ visibility=['PUBLIC'],
132
+ exported_headers=subdir_glob([
133
+ ('common', 'pool.h'),
134
+ ]),
135
+ srcs=['common/pool.c'],
136
+ deps=[':threading'],
137
+ )
138
+
139
+ cxx_library(
140
+ name='threading',
141
+ header_namespace='',
142
+ visibility=['PUBLIC'],
143
+ exported_headers=subdir_glob([
144
+ ('common', 'threading.h'),
145
+ ]),
146
+ srcs=['common/threading.c'],
147
+ )
148
+
149
+ cxx_library(
150
+ name='xxhash',
151
+ header_namespace='',
152
+ visibility=['PUBLIC'],
153
+ exported_headers=subdir_glob([
154
+ ('common', 'xxhash.h'),
155
+ ]),
156
+ srcs=['common/xxhash.c'],
157
+ )
158
+
159
+ cxx_library(
160
+ name='zstd_common',
161
+ header_namespace='',
162
+ visibility=['PUBLIC'],
163
+ exported_headers=subdir_glob([
164
+ ('', 'zstd.h'),
165
+ ('common', 'zstd_internal.h'),
166
+ ]),
167
+ srcs=['common/zstd_common.c'],
168
+ deps=[
169
+ ':errors',
170
+ ':mem',
171
+ ],
172
+ )
173
+
174
+ cxx_library(
175
+ name='common',
176
+ deps=[
177
+ ':bitstream',
178
+ ':entropy',
179
+ ':errors',
180
+ ':mem',
181
+ ':pool',
182
+ ':threading',
183
+ ':xxhash',
184
+ ':zstd_common',
185
+ ]
186
+ )
@@ -1,11 +1,13 @@
1
- # ################################################################
1
+ # ##########################################################################
2
2
  # Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
3
3
  # All rights reserved.
4
4
  #
5
+ # This Makefile is validated for Linux, macOS, *BSD, Hurd, Solaris, MSYS2 targets
6
+ #
5
7
  # This source code is licensed under the BSD-style license found in the
6
8
  # LICENSE file in the root directory of this source tree. An additional grant
7
9
  # of patent rights can be found in the PATENTS file in the same directory.
8
- # ################################################################
10
+ # ##########################################################################
9
11
 
10
12
  # Version numbers
11
13
  LIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
@@ -18,17 +20,12 @@ LIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT))
18
20
  LIBVER := $(shell echo $(LIBVER_SCRIPT))
19
21
  VERSION?= $(LIBVER)
20
22
 
21
- DESTDIR?=
22
- PREFIX ?= /usr/local
23
- LIBDIR ?= $(PREFIX)/lib
24
- INCLUDEDIR=$(PREFIX)/include
25
-
26
23
  CPPFLAGS+= -I. -I./common -DXXH_NAMESPACE=ZSTD_
27
24
  CFLAGS ?= -O3
28
- CFLAGS += -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow -Wstrict-aliasing=1 \
29
- -Wswitch-enum -Wdeclaration-after-statement -Wstrict-prototypes -Wundef \
30
- -Wpointer-arith
31
- CFLAGS += $(MOREFLAGS)
25
+ DEBUGFLAGS = -g -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \
26
+ -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \
27
+ -Wstrict-prototypes -Wundef -Wpointer-arith
28
+ CFLAGS += $(DEBUGFLAGS) $(MOREFLAGS)
32
29
  FLAGS = $(CPPFLAGS) $(CFLAGS)
33
30
 
34
31
 
@@ -41,6 +38,8 @@ CPPFLAGS += -I./legacy -DZSTD_LEGACY_SUPPORT=1
41
38
  ZSTD_FILES+= $(wildcard legacy/*.c)
42
39
  endif
43
40
 
41
+ ZSTD_OBJ := $(patsubst %.c,%.o,$(ZSTD_FILES))
42
+
44
43
  # OS X linker doesn't support -soname, and use different extension
45
44
  # see : https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryDesignGuidelines.html
46
45
  ifeq ($(shell uname), Darwin)
@@ -60,15 +59,14 @@ LIBZSTD = libzstd.$(SHARED_EXT_VER)
60
59
 
61
60
  .PHONY: default all clean install uninstall
62
61
 
63
- default: lib
62
+ default: lib-release
64
63
 
65
64
  all: lib
66
65
 
67
66
  libzstd.a: ARFLAGS = rcs
68
- libzstd.a: $(ZSTD_FILES)
67
+ libzstd.a: $(ZSTD_OBJ)
69
68
  @echo compiling static library
70
- @$(CC) $(FLAGS) -c $^
71
- @$(AR) $(ARFLAGS) $@ *.o
69
+ @$(AR) $(ARFLAGS) $@ $^
72
70
 
73
71
  $(LIBZSTD): LDFLAGS += -shared -fPIC -fvisibility=hidden
74
72
  $(LIBZSTD): $(ZSTD_FILES)
@@ -87,14 +85,41 @@ libzstd : $(LIBZSTD)
87
85
 
88
86
  lib: libzstd.a libzstd
89
87
 
88
+ lib-release: DEBUGFLAGS :=
89
+ lib-release: lib
90
+
90
91
  clean:
91
- @$(RM) core *.o *.a *.gcda *.$(SHARED_EXT) *.$(SHARED_EXT).* libzstd.pc dll/libzstd.dll dll/libzstd.lib
92
- @$(RM) decompress/*.o
92
+ @$(RM) -r *.dSYM # Mac OS-X specific
93
+ @$(RM) core *.o *.a *.gcda *.$(SHARED_EXT) *.$(SHARED_EXT).* libzstd.pc
94
+ @$(RM) dll/libzstd.dll dll/libzstd.lib
95
+ @$(RM) common/*.o compress/*.o decompress/*.o dictBuilder/*.o legacy/*.o deprecated/*.o
93
96
  @echo Cleaning library completed
94
97
 
95
- #------------------------------------------------------------------------
96
- #make install is validated only for Linux, OSX, kFreeBSD, Hurd and some BSD targets
97
- ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU FreeBSD DragonFly NetBSD))
98
+ #-----------------------------------------------------------------------------
99
+ # make install is validated only for Linux, OSX, BSD, Hurd and Solaris targets
100
+ #-----------------------------------------------------------------------------
101
+ ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS))
102
+
103
+ ifneq (,$(filter $(shell uname),SunOS))
104
+ INSTALL ?= ginstall
105
+ else
106
+ INSTALL ?= install
107
+ endif
108
+
109
+ PREFIX ?= /usr/local
110
+ DESTDIR ?=
111
+ LIBDIR ?= $(PREFIX)/lib
112
+ INCLUDEDIR ?= $(PREFIX)/include
113
+
114
+ ifneq (,$(filter $(shell uname),OpenBSD FreeBSD NetBSD DragonFly))
115
+ PKGCONFIGDIR ?= $(PREFIX)/libdata/pkgconfig
116
+ else
117
+ PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig
118
+ endif
119
+
120
+ INSTALL_LIB ?= $(INSTALL) -m 755
121
+ INSTALL_DATA ?= $(INSTALL) -m 644
122
+
98
123
 
99
124
  libzstd.pc:
100
125
  libzstd.pc: libzstd.pc.in
@@ -106,16 +131,18 @@ libzstd.pc: libzstd.pc.in
106
131
  $< >$@
107
132
 
108
133
  install: libzstd.a libzstd libzstd.pc
109
- @install -d -m 755 $(DESTDIR)$(LIBDIR)/pkgconfig/ $(DESTDIR)$(INCLUDEDIR)/
110
- @install -m 755 libzstd.$(SHARED_EXT_VER) $(DESTDIR)$(LIBDIR)
111
- @cp -a libzstd.$(SHARED_EXT_MAJOR) $(DESTDIR)$(LIBDIR)
112
- @cp -a libzstd.$(SHARED_EXT) $(DESTDIR)$(LIBDIR)
113
- @cp -a libzstd.pc $(DESTDIR)$(LIBDIR)/pkgconfig/
114
- @install -m 644 libzstd.a $(DESTDIR)$(LIBDIR)
115
- @install -m 644 zstd.h $(DESTDIR)$(INCLUDEDIR)
116
- @install -m 644 common/zstd_errors.h $(DESTDIR)$(INCLUDEDIR)
117
- @install -m 644 deprecated/zbuff.h $(DESTDIR)$(INCLUDEDIR) # prototypes generate deprecation warnings
118
- @install -m 644 dictBuilder/zdict.h $(DESTDIR)$(INCLUDEDIR)
134
+ @$(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/ $(DESTDIR)$(INCLUDEDIR)/
135
+ @$(INSTALL_DATA) libzstd.pc $(DESTDIR)$(PKGCONFIGDIR)/
136
+ @echo Installing libraries
137
+ @$(INSTALL_LIB) libzstd.a $(DESTDIR)$(LIBDIR)
138
+ @$(INSTALL_LIB) libzstd.$(SHARED_EXT_VER) $(DESTDIR)$(LIBDIR)
139
+ @ln -sf libzstd.$(SHARED_EXT_VER) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
140
+ @ln -sf libzstd.$(SHARED_EXT_VER) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
141
+ @echo Installing includes
142
+ @$(INSTALL_DATA) zstd.h $(DESTDIR)$(INCLUDEDIR)
143
+ @$(INSTALL_DATA) common/zstd_errors.h $(DESTDIR)$(INCLUDEDIR)
144
+ @$(INSTALL_DATA) deprecated/zbuff.h $(DESTDIR)$(INCLUDEDIR) # prototypes generate deprecation warnings
145
+ @$(INSTALL_DATA) dictBuilder/zdict.h $(DESTDIR)$(INCLUDEDIR)
119
146
  @echo zstd static and shared library installed
120
147
 
121
148
  uninstall:
@@ -123,7 +150,7 @@ uninstall:
123
150
  @$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
124
151
  @$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
125
152
  @$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_VER)
126
- @$(RM) $(DESTDIR)$(LIBDIR)/pkgconfig/libzstd.pc
153
+ @$(RM) $(DESTDIR)$(PKGCONFIGDIR)/libzstd.pc
127
154
  @$(RM) $(DESTDIR)$(INCLUDEDIR)/zstd.h
128
155
  @$(RM) $(DESTDIR)$(INCLUDEDIR)/zstd_errors.h
129
156
  @$(RM) $(DESTDIR)$(INCLUDEDIR)/zbuff.h # Deprecated streaming functions
@@ -39,7 +39,7 @@ extern "C" {
39
39
  #endif
40
40
 
41
41
  /* code only tested on 32 and 64 bits systems */
42
- #define MEM_STATIC_ASSERT(c) { enum { XXH_static_assert = 1/(int)(!!(c)) }; }
42
+ #define MEM_STATIC_ASSERT(c) { enum { MEM_static_assert = 1/(int)(!!(c)) }; }
43
43
  MEM_STATIC void MEM_check(void) { MEM_STATIC_ASSERT((sizeof(size_t)==4) || (sizeof(size_t)==8)); }
44
44
 
45
45
 
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Copyright (c) 2016-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+
11
+ /* ====== Dependencies ======= */
12
+ #include <stddef.h> /* size_t */
13
+ #include <stdlib.h> /* malloc, calloc, free */
14
+ #include "pool.h"
15
+
16
+ /* ====== Compiler specifics ====== */
17
+ #if defined(_MSC_VER)
18
+ # pragma warning(disable : 4204) /* disable: C4204: non-constant aggregate initializer */
19
+ #endif
20
+
21
+
22
+ #ifdef ZSTD_MULTITHREAD
23
+
24
+ #include "threading.h" /* pthread adaptation */
25
+
26
+ /* A job is a function and an opaque argument */
27
+ typedef struct POOL_job_s {
28
+ POOL_function function;
29
+ void *opaque;
30
+ } POOL_job;
31
+
32
+ struct POOL_ctx_s {
33
+ /* Keep track of the threads */
34
+ pthread_t *threads;
35
+ size_t numThreads;
36
+
37
+ /* The queue is a circular buffer */
38
+ POOL_job *queue;
39
+ size_t queueHead;
40
+ size_t queueTail;
41
+ size_t queueSize;
42
+ /* The mutex protects the queue */
43
+ pthread_mutex_t queueMutex;
44
+ /* Condition variable for pushers to wait on when the queue is full */
45
+ pthread_cond_t queuePushCond;
46
+ /* Condition variables for poppers to wait on when the queue is empty */
47
+ pthread_cond_t queuePopCond;
48
+ /* Indicates if the queue is shutting down */
49
+ int shutdown;
50
+ };
51
+
52
+ /* POOL_thread() :
53
+ Work thread for the thread pool.
54
+ Waits for jobs and executes them.
55
+ @returns : NULL on failure else non-null.
56
+ */
57
+ static void* POOL_thread(void* opaque) {
58
+ POOL_ctx* const ctx = (POOL_ctx*)opaque;
59
+ if (!ctx) { return NULL; }
60
+ for (;;) {
61
+ /* Lock the mutex and wait for a non-empty queue or until shutdown */
62
+ pthread_mutex_lock(&ctx->queueMutex);
63
+ while (ctx->queueHead == ctx->queueTail && !ctx->shutdown) {
64
+ pthread_cond_wait(&ctx->queuePopCond, &ctx->queueMutex);
65
+ }
66
+ /* empty => shutting down: so stop */
67
+ if (ctx->queueHead == ctx->queueTail) {
68
+ pthread_mutex_unlock(&ctx->queueMutex);
69
+ return opaque;
70
+ }
71
+ /* Pop a job off the queue */
72
+ { POOL_job const job = ctx->queue[ctx->queueHead];
73
+ ctx->queueHead = (ctx->queueHead + 1) % ctx->queueSize;
74
+ /* Unlock the mutex, signal a pusher, and run the job */
75
+ pthread_mutex_unlock(&ctx->queueMutex);
76
+ pthread_cond_signal(&ctx->queuePushCond);
77
+ job.function(job.opaque);
78
+ }
79
+ }
80
+ /* Unreachable */
81
+ }
82
+
83
+ POOL_ctx *POOL_create(size_t numThreads, size_t queueSize) {
84
+ POOL_ctx *ctx;
85
+ /* Check the parameters */
86
+ if (!numThreads || !queueSize) { return NULL; }
87
+ /* Allocate the context and zero initialize */
88
+ ctx = (POOL_ctx *)calloc(1, sizeof(POOL_ctx));
89
+ if (!ctx) { return NULL; }
90
+ /* Initialize the job queue.
91
+ * It needs one extra space since one space is wasted to differentiate empty
92
+ * and full queues.
93
+ */
94
+ ctx->queueSize = queueSize + 1;
95
+ ctx->queue = (POOL_job *)malloc(ctx->queueSize * sizeof(POOL_job));
96
+ ctx->queueHead = 0;
97
+ ctx->queueTail = 0;
98
+ pthread_mutex_init(&ctx->queueMutex, NULL);
99
+ pthread_cond_init(&ctx->queuePushCond, NULL);
100
+ pthread_cond_init(&ctx->queuePopCond, NULL);
101
+ ctx->shutdown = 0;
102
+ /* Allocate space for the thread handles */
103
+ ctx->threads = (pthread_t *)malloc(numThreads * sizeof(pthread_t));
104
+ ctx->numThreads = 0;
105
+ /* Check for errors */
106
+ if (!ctx->threads || !ctx->queue) { POOL_free(ctx); return NULL; }
107
+ /* Initialize the threads */
108
+ { size_t i;
109
+ for (i = 0; i < numThreads; ++i) {
110
+ if (pthread_create(&ctx->threads[i], NULL, &POOL_thread, ctx)) {
111
+ ctx->numThreads = i;
112
+ POOL_free(ctx);
113
+ return NULL;
114
+ } }
115
+ ctx->numThreads = numThreads;
116
+ }
117
+ return ctx;
118
+ }
119
+
120
+ /*! POOL_join() :
121
+ Shutdown the queue, wake any sleeping threads, and join all of the threads.
122
+ */
123
+ static void POOL_join(POOL_ctx *ctx) {
124
+ /* Shut down the queue */
125
+ pthread_mutex_lock(&ctx->queueMutex);
126
+ ctx->shutdown = 1;
127
+ pthread_mutex_unlock(&ctx->queueMutex);
128
+ /* Wake up sleeping threads */
129
+ pthread_cond_broadcast(&ctx->queuePushCond);
130
+ pthread_cond_broadcast(&ctx->queuePopCond);
131
+ /* Join all of the threads */
132
+ { size_t i;
133
+ for (i = 0; i < ctx->numThreads; ++i) {
134
+ pthread_join(ctx->threads[i], NULL);
135
+ } }
136
+ }
137
+
138
+ void POOL_free(POOL_ctx *ctx) {
139
+ if (!ctx) { return; }
140
+ POOL_join(ctx);
141
+ pthread_mutex_destroy(&ctx->queueMutex);
142
+ pthread_cond_destroy(&ctx->queuePushCond);
143
+ pthread_cond_destroy(&ctx->queuePopCond);
144
+ if (ctx->queue) free(ctx->queue);
145
+ if (ctx->threads) free(ctx->threads);
146
+ free(ctx);
147
+ }
148
+
149
+ void POOL_add(void *ctxVoid, POOL_function function, void *opaque) {
150
+ POOL_ctx *ctx = (POOL_ctx *)ctxVoid;
151
+ if (!ctx) { return; }
152
+
153
+ pthread_mutex_lock(&ctx->queueMutex);
154
+ { POOL_job const job = {function, opaque};
155
+ /* Wait until there is space in the queue for the new job */
156
+ size_t newTail = (ctx->queueTail + 1) % ctx->queueSize;
157
+ while (ctx->queueHead == newTail && !ctx->shutdown) {
158
+ pthread_cond_wait(&ctx->queuePushCond, &ctx->queueMutex);
159
+ newTail = (ctx->queueTail + 1) % ctx->queueSize;
160
+ }
161
+ /* The queue is still going => there is space */
162
+ if (!ctx->shutdown) {
163
+ ctx->queue[ctx->queueTail] = job;
164
+ ctx->queueTail = newTail;
165
+ }
166
+ }
167
+ pthread_mutex_unlock(&ctx->queueMutex);
168
+ pthread_cond_signal(&ctx->queuePopCond);
169
+ }
170
+
171
+ #else /* ZSTD_MULTITHREAD not defined */
172
+ /* No multi-threading support */
173
+
174
+ /* We don't need any data, but if it is empty malloc() might return NULL. */
175
+ struct POOL_ctx_s {
176
+ int data;
177
+ };
178
+
179
+ POOL_ctx *POOL_create(size_t numThreads, size_t queueSize) {
180
+ (void)numThreads;
181
+ (void)queueSize;
182
+ return (POOL_ctx *)malloc(sizeof(POOL_ctx));
183
+ }
184
+
185
+ void POOL_free(POOL_ctx *ctx) {
186
+ if (ctx) free(ctx);
187
+ }
188
+
189
+ void POOL_add(void *ctx, POOL_function function, void *opaque) {
190
+ (void)ctx;
191
+ function(opaque);
192
+ }
193
+
194
+ #endif /* ZSTD_MULTITHREAD */