diff options
author | Hans Nilsson <[email protected]> | 2019-06-04 12:27:06 +0200 |
---|---|---|
committer | Hans Nilsson <[email protected]> | 2019-06-14 13:33:07 +0200 |
commit | f8c479ce0b1baa91c8e9f7fa11cb1ed0d273ca25 (patch) | |
tree | de8fabfe4d21fc1ef5e778bf958dace6e6b72c2d /lib/crypto/c_src | |
parent | de310ac450cf452b57150ea3abd65b74942d94fd (diff) | |
download | otp-f8c479ce0b1baa91c8e9f7fa11cb1ed0d273ca25.tar.gz otp-f8c479ce0b1baa91c8e9f7fa11cb1ed0d273ca25.tar.bz2 otp-f8c479ce0b1baa91c8e9f7fa11cb1ed0d273ca25.zip |
crypto: Use dirty schedulers for mac_update
Diffstat (limited to 'lib/crypto/c_src')
-rw-r--r-- | lib/crypto/c_src/mac.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/lib/crypto/c_src/mac.c b/lib/crypto/c_src/mac.c index 0482f97028..0e7f9a5651 100644 --- a/lib/crypto/c_src/mac.c +++ b/lib/crypto/c_src/mac.c @@ -97,6 +97,8 @@ int hmac_low_level(ErlNifEnv* env, const EVP_MD *md, ErlNifBinary *ret_bin, int *ret_bin_alloc, ERL_NIF_TERM *return_term); #endif +ERL_NIF_TERM mac_update(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); + /******************************** Support functions for type array @@ -550,7 +552,7 @@ static void mac_context_dtor(ErlNifEnv* env, struct mac_context *obj) /******************************************************************* * - * Mac nif + * mac_init, mac_update, mac_final nifs * ******************************************************************/ @@ -731,6 +733,27 @@ ERL_NIF_TERM mac_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) ERL_NIF_TERM mac_update_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {/* (Ref, Text) */ + ErlNifBinary text; + + if (!enif_inspect_iolist_as_binary(env, argv[1], &text)) + return EXCP_BADARG(env, "Bad text"); + + if (text.size > INT_MAX) + return EXCP_BADARG(env, "Too long text"); + + /* Run long jobs on a dirty scheduler to not block the current emulator thread */ + if (text.size > MAX_BYTES_TO_NIF) { + return enif_schedule_nif(env, "mac_update", + ERL_NIF_DIRTY_JOB_CPU_BOUND, + mac_update, argc, argv); + } + + return mac_update(env, argc, argv); +} + + +ERL_NIF_TERM mac_update(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +{/* (Ref, Text) */ #ifdef HAS_EVP_PKEY_CTX struct mac_context *obj = NULL; ErlNifBinary text; |