Skip to content

Commit

Permalink
fixup! fixup! stdlib: Add zstd module
Browse files Browse the repository at this point in the history
  • Loading branch information
garazdawi committed Jan 20, 2025
1 parent 37725f8 commit c1feba5
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 17 deletions.
46 changes: 30 additions & 16 deletions erts/emulator/nifs/common/zstd_nif.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,14 +173,28 @@ static ZstdCtx *get_zstd_context(ErlNifEnv *env, ERL_NIF_TERM ctx_term,

enif_self(env, &self);

if (enif_get_resource(env, ctx_term, type, (void **)&ctx)) {
if (!enif_get_resource(env, ctx_term, type, (void **)&ctx) || ctx->handle.c == NULL) {
enif_make_badarg(env);
return NULL;
}

if (enif_compare_pids(&self, &ctx->owner) == 0 && ctx->handle.c) {
return ctx;
}
if (enif_compare_pids(&self, &ctx->owner) != 0) {
enif_raise_exception(env,
enif_make_atom(env, "not_on_controlling_process"));
return NULL;
}

return NULL;
return ctx;

}

static ERL_NIF_TERM make_badarg(ErlNifEnv *env) {
ERL_NIF_TERM reason;

if (enif_has_pending_exception(env, &reason))
return enif_raise_exception(env, reason);

return enif_make_badarg(env);
}

static ERL_NIF_TERM load_compress_dictionary_nif(
Expand All @@ -190,7 +204,7 @@ static ERL_NIF_TERM load_compress_dictionary_nif(
size_t res;

if (!ctx || !enif_inspect_iolist_as_binary(env, argv[1], &bin)) {
return enif_make_badarg(env);
return make_badarg(env);
}

if (ctx->dict) {
Expand All @@ -214,7 +228,7 @@ static ERL_NIF_TERM load_decompress_dictionary_nif(
size_t res;

if (!ctx || !enif_inspect_iolist_as_binary(env, argv[1], &bin)) {
return enif_make_badarg(env);
return make_badarg(env);
}

if (ctx->dict) {
Expand All @@ -239,7 +253,7 @@ static ERL_NIF_TERM ref_compress_dictionary_nif(
size_t res;

if (!ctx || !enif_get_resource(env, argv[1], compress_dict_type, (void**)&dict)) {
return enif_make_badarg(env);
return make_badarg(env);
}

res = ZSTD_CCtx_refCDict(ctx->handle.c, dict->c);
Expand All @@ -266,7 +280,7 @@ static ERL_NIF_TERM ref_decompress_dictionary_nif(
size_t res;

if (!ctx || !enif_get_resource(env, argv[1], decompress_dict_type, (void**)&dict)) {
return enif_make_badarg(env);
return make_badarg(env);
}

res = ZSTD_DCtx_refDDict(ctx->handle.d, dict->d);
Expand Down Expand Up @@ -334,7 +348,7 @@ static ERL_NIF_TERM set_compress_parameter_nif(
size_t res;

if (!ctx) {
return enif_make_badarg(env);
return make_badarg(env);
}

param = get_cparam(env, argv[1]);
Expand Down Expand Up @@ -420,7 +434,7 @@ static ERL_NIF_TERM get_compress_parameter_nif(
size_t res;

if (!ctx) {
return enif_make_badarg(env);
return make_badarg(env);
}

param = get_cparam(env, argv[1]);
Expand Down Expand Up @@ -474,7 +488,7 @@ static ERL_NIF_TERM set_pledged_src_size_nif(
size_t res;

if (!ctx || !enif_get_uint64(env, argv[1], &value)) {
return enif_make_badarg(env);
return make_badarg(env);
}

res = ZSTD_CCtx_setPledgedSrcSize(ctx->handle.c, value);
Expand Down Expand Up @@ -502,7 +516,7 @@ static ERL_NIF_TERM set_decompress_parameter_nif(
size_t res;

if (!ctx || !enif_get_int(env, argv[2], &value)) {
return enif_make_badarg(env);
return make_badarg(env);
}

param = get_dparam(env, argv[1]);
Expand Down Expand Up @@ -532,7 +546,7 @@ static ERL_NIF_TERM get_decompress_parameter_nif(
size_t res;

if (!ctx) {
return enif_make_badarg(env);
return make_badarg(env);
}

param = get_dparam(env, argv[1]);
Expand Down Expand Up @@ -664,7 +678,7 @@ static ERL_NIF_TERM compress_chunk_nif(ErlNifEnv *env,
return result;
}

return enif_raise_exception(env, am_badarg);
return make_badarg(env);
}

static size_t decompress_chunk_callback(
Expand Down Expand Up @@ -737,7 +751,7 @@ static ERL_NIF_TERM decompress_chunk_nif(ErlNifEnv *env,
return result;
}

return enif_make_badarg(env);
return make_badarg(env);
}

static ERL_NIF_TERM compress_reset_nif(ErlNifEnv *env,
Expand Down
2 changes: 1 addition & 1 deletion lib/stdlib/src/zstd.erl
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ For example:
> Data = ~"my data to be compressed".
> Compressed = zstd:compress(Data).
> zstd:decompress(Compressed).
~"my data to be compressed"
[~"my data to be compressed"]
```

If you are compressing or decompressing possibly large amounts of data,
Expand Down
34 changes: 34 additions & 0 deletions lib/stdlib/test/zstd_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,33 @@ bulk(_Config) ->
IOVCompressed = zstd:compress(IOV, #{ compressionLevel => -20 }),
?assertEqual(iob(IOV), iob(zstd:decompress(IOVCompressed))),

%% bulk with context
{ok, CCxt} = zstd:context(compress, #{ compressionLevel => 15 }),
CCtxCompressed = zstd:compress(Data, CCxt),
{ok, DCxt} = zstd:context(decompress),
?assertEqual(iob(Data), iob(zstd:decompress(CCtxCompressed, DCxt))),
zstd:close(CCxt),
zstd:close(DCxt),

P = self(),
spawn(fun() -> {ok, Ctx} = zstd:context(compress), P ! {ctx, Ctx} end),
OtherCCtx = receive {ctx, Ctx} -> Ctx end,

{'EXIT',{not_on_controlling_process, _}} =
catch zstd:compress(Data, OtherCCtx),
{'EXIT',{not_on_controlling_process, _}} =
catch zstd:chunk(OtherCCtx, Data),
{'EXIT',{not_on_controlling_process, _}} =
catch zstd:finish(OtherCCtx, Data),
{'EXIT',{not_on_controlling_process, _}} =
catch zstd:set_parameter(OtherCCtx, compressionLevel, 14),
{'EXIT',{not_on_controlling_process, _}} =
catch zstd:set_parameter(OtherCCtx, dictionary, ~"abc"),
{'EXIT',{not_on_controlling_process, _}} =
catch zstd:set_parameter(OtherCCtx, setPledgeSrcSize, 0),
{'EXIT',{not_on_controlling_process, _}} =
catch zstd:get_parameter(OtherCCtx, compressionLevel),

ok.

bulk_with_dict(Config) ->
Expand All @@ -131,6 +158,13 @@ bulk_with_dict(Config) ->
{'EXIT',{{zstd_error, ~"Dictionary mismatch"},_}} =
catch zstd:decompress(Compressed),

P = self(),
spawn(fun() -> {ok, Ctx} = zstd:context(compress), P ! {ctx, Ctx} end),
OtherCCtx = receive {ctx, Ctx} -> Ctx end,

{'EXIT',{not_on_controlling_process, _}} =
catch zstd:set_parameter(OtherCCtx, dictionary, CDict),

ok.

cstream(_Config) ->
Expand Down

0 comments on commit c1feba5

Please sign in to comment.