aboutsummaryrefslogtreecommitdiffstats
path: root/lib/crypto
diff options
context:
space:
mode:
authorHans Nilsson <[email protected]>2019-06-04 12:27:06 +0200
committerHans Nilsson <[email protected]>2019-06-14 13:33:07 +0200
commitf8c479ce0b1baa91c8e9f7fa11cb1ed0d273ca25 (patch)
treede8fabfe4d21fc1ef5e778bf958dace6e6b72c2d /lib/crypto
parentde310ac450cf452b57150ea3abd65b74942d94fd (diff)
downloadotp-f8c479ce0b1baa91c8e9f7fa11cb1ed0d273ca25.tar.gz
otp-f8c479ce0b1baa91c8e9f7fa11cb1ed0d273ca25.tar.bz2
otp-f8c479ce0b1baa91c8e9f7fa11cb1ed0d273ca25.zip
crypto: Use dirty schedulers for mac_update
Diffstat (limited to 'lib/crypto')
-rw-r--r--lib/crypto/c_src/mac.c25
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;