diff options
author | Alessandro Ghedini <alessandro@ghedini.me> | 2016-02-26 11:51:31 +0000 |
---|---|---|
committer | Rich Salz <rsalz@openssl.org> | 2016-03-08 11:10:34 -0500 |
commit | fb46be034816e5fe9f04fd39da960d34dbf2f52d (patch) | |
tree | 51984b1e45bcfd10f385cc380de679446bd6338c /crypto/bio/bio_lib.c | |
parent | c9aad4ff4f9f37a2d8685db4b1ce310452f41e89 (diff) |
Convert CRYPTO_LOCK_BIO to new multi-threading API
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto/bio/bio_lib.c')
-rw-r--r-- | crypto/bio/bio_lib.c | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c index ee8d622b20..522525b129 100644 --- a/crypto/bio/bio_lib.c +++ b/crypto/bio/bio_lib.c @@ -94,12 +94,22 @@ int BIO_set(BIO *bio, BIO_METHOD *method) bio->num_read = 0L; bio->num_write = 0L; CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data); - if (method->create != NULL) + + bio->lock = CRYPTO_THREAD_lock_new(); + if (bio->lock == NULL) { + CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data); + return 0; + } + + if (method->create != NULL) { if (!method->create(bio)) { CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data); - return (0); + CRYPTO_THREAD_lock_free(bio->lock); + return 0; } - return (1); + } + + return 1; } int BIO_free(BIO *a) @@ -107,23 +117,29 @@ int BIO_free(BIO *a) int i; if (a == NULL) - return (0); + return 0; + + if (CRYPTO_atomic_add(&a->references, -1, &i, a->lock) <= 0) + return 0; - i = CRYPTO_add(&a->references, -1, CRYPTO_LOCK_BIO); REF_PRINT_COUNT("BIO", a); if (i > 0) - return (1); + return 1; REF_ASSERT_ISNT(i < 0); if ((a->callback != NULL) && ((i = (int)a->callback(a, BIO_CB_FREE, NULL, 0, 0L, 1L)) <= 0)) - return (i); + return i; CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data); + CRYPTO_THREAD_lock_free(a->lock); + if ((a->method != NULL) && (a->method->destroy != NULL)) a->method->destroy(a); + OPENSSL_free(a); - return (1); + + return 1; } void BIO_vfree(BIO *a) @@ -131,6 +147,18 @@ void BIO_vfree(BIO *a) BIO_free(a); } +int BIO_up_ref(BIO *a) +{ + int i; + + if (CRYPTO_atomic_add(&a->references, 1, &i, a->lock) <= 0) + return 0; + + REF_PRINT_COUNT("BIO", a); + REF_ASSERT_ISNT(i < 2); + return ((i > 1) ? 1 : 0); +} + void BIO_clear_flags(BIO *b, int flags) { b->flags &= ~flags; |