diff options
author | Alessandro Ghedini <alessandro@ghedini.me> | 2016-02-29 16:57:11 +0000 |
---|---|---|
committer | Rich Salz <rsalz@openssl.org> | 2016-03-08 11:10:34 -0500 |
commit | 9b398ef297dd1b74527dd0afee9f59cd3f5bc33d (patch) | |
tree | 5ec1a81880da831db9dfe73be72e29c64ddc79a5 /crypto/ec/ec_mult.c | |
parent | 03273d61e742b02485831ce739e4a6c9b197e3f3 (diff) |
Convert CRYPTO_LOCK_EC_* to new multi-threading API
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto/ec/ec_mult.c')
-rw-r--r-- | crypto/ec/ec_mult.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/crypto/ec/ec_mult.c b/crypto/ec/ec_mult.c index 70c9791f8b..3c283e5ed6 100644 --- a/crypto/ec/ec_mult.c +++ b/crypto/ec/ec_mult.c @@ -63,6 +63,7 @@ #include <string.h> #include <openssl/err.h> +#include "internal/cryptlib.h" #include "internal/bn_int.h" #include "ec_lcl.h" @@ -85,6 +86,7 @@ struct ec_pre_comp_st { * objects followed by a NULL */ size_t num; /* numblocks * 2^(w-1) */ int references; + CRYPTO_RWLOCK *lock; }; static EC_PRE_COMP *ec_pre_comp_new(const EC_GROUP *group) @@ -99,25 +101,41 @@ static EC_PRE_COMP *ec_pre_comp_new(const EC_GROUP *group) ECerr(EC_F_EC_PRE_COMP_NEW, ERR_R_MALLOC_FAILURE); return ret; } + ret->group = group; ret->blocksize = 8; /* default */ ret->w = 4; /* default */ ret->references = 1; + + ret->lock = CRYPTO_THREAD_lock_new(); + if (ret->lock == NULL) { + ECerr(EC_F_EC_PRE_COMP_NEW, ERR_R_MALLOC_FAILURE); + OPENSSL_free(ret); + return NULL; + } return ret; } EC_PRE_COMP *EC_ec_pre_comp_dup(EC_PRE_COMP *pre) { + int i; if (pre != NULL) - CRYPTO_add(&pre->references, 1, CRYPTO_LOCK_EC_PRE_COMP); + CRYPTO_atomic_add(&pre->references, 1, &i, pre->lock); return pre; } void EC_ec_pre_comp_free(EC_PRE_COMP *pre) { - if (pre == NULL - || CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP) > 0) + int i; + + if (pre == NULL) + return; + + CRYPTO_atomic_add(&pre->references, -1, &i, pre->lock); + REF_PRINT_COUNT("EC_ec", pre); + if (i > 0) return; + REF_ASSERT_ISNT(i < 0); if (pre->points != NULL) { EC_POINT **pts; @@ -126,6 +144,7 @@ void EC_ec_pre_comp_free(EC_PRE_COMP *pre) EC_POINT_free(*pts); OPENSSL_free(pre->points); } + CRYPTO_THREAD_lock_free(pre->lock); OPENSSL_free(pre); } |