Skip to content

Commit de7b7a7

Browse files
Brujo BenavidesPablo Polvorin
Brujo Benavides
and
Pablo Polvorin
authored
Reuse ctx (#2)
* Reuse a thread-specific zstd decompress context Simple, never deallocate, don't support reload, etc. * Same for compression ctx Co-authored-by: Pablo Polvorin <[email protected]>
1 parent a88d07b commit de7b7a7

File tree

1 file changed

+25
-3
lines changed

1 file changed

+25
-3
lines changed

c_src/zstd_nif.c

+25-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,20 @@
33
#include <stdlib.h>
44
#include <zstd.h>
55

6+
ErlNifTSDKey zstdDecompressContextKey;
7+
ErlNifTSDKey zstdCompressContextKey;
8+
69
static ERL_NIF_TERM zstd_nif_compress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
710
ErlNifBinary bin, ret_bin;
811
size_t buff_size, compressed_size;
912
unsigned int compression_level;
1013

14+
ZSTD_CCtx* ctx = (ZSTD_CCtx*)enif_tsd_get(zstdCompressContextKey);
15+
if (!ctx) {
16+
ctx = ZSTD_createCCtx();
17+
enif_tsd_set(zstdCompressContextKey, ctx);
18+
}
19+
1120
if(!enif_inspect_binary(env, argv[0], &bin)
1221
|| !enif_get_uint(env, argv[1], &compression_level)
1322
|| compression_level > ZSTD_maxCLevel())
@@ -18,7 +27,7 @@ static ERL_NIF_TERM zstd_nif_compress(ErlNifEnv* env, int argc, const ERL_NIF_TE
1827
if(!enif_alloc_binary(buff_size, &ret_bin))
1928
return enif_make_atom(env, "error");
2029

21-
compressed_size = ZSTD_compress(ret_bin.data, buff_size, bin.data, bin.size, compression_level);
30+
compressed_size = ZSTD_compressCCtx(ctx, ret_bin.data, buff_size, bin.data, bin.size, compression_level);
2231
if(ZSTD_isError(compressed_size))
2332
return enif_make_atom(env, "error");
2433

@@ -34,14 +43,20 @@ static ERL_NIF_TERM zstd_nif_decompress(ErlNifEnv* env, int argc, const ERL_NIF_
3443
ErlNifBinary bin;
3544
unsigned long long uncompressed_size;
3645

46+
ZSTD_DCtx* ctx = (ZSTD_DCtx*)enif_tsd_get(zstdDecompressContextKey);
47+
if (!ctx) {
48+
ctx = ZSTD_createDCtx();
49+
enif_tsd_set(zstdDecompressContextKey, ctx);
50+
}
51+
3752
if(!enif_inspect_binary(env, argv[0], &bin))
3853
return enif_make_badarg(env);
3954

4055
uncompressed_size = ZSTD_getDecompressedSize(bin.data, bin.size);
4156

4257
outp = enif_make_new_binary(env, uncompressed_size, &out);
4358

44-
if(ZSTD_decompress(outp, uncompressed_size, bin.data, bin.size) != uncompressed_size)
59+
if(ZSTD_decompressDCtx(ctx, outp, uncompressed_size, bin.data, bin.size) != uncompressed_size)
4560
return enif_make_atom(env, "error");
4661

4762
return out;
@@ -52,4 +67,11 @@ static ErlNifFunc nif_funcs[] = {
5267
{"decompress", 1, zstd_nif_decompress}
5368
};
5469

55-
ERL_NIF_INIT(zstd, nif_funcs, NULL, NULL, NULL, NULL);
70+
static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
71+
{
72+
enif_tsd_key_create("zstd_decompress_context_key", &zstdDecompressContextKey);
73+
enif_tsd_key_create("zstd_compress_context_key", &zstdCompressContextKey);
74+
return 0;
75+
}
76+
77+
ERL_NIF_INIT(zstd, nif_funcs, load, NULL, NULL, NULL);

0 commit comments

Comments
 (0)