aboutsummaryrefslogtreecommitdiff
path: root/crypto/bio
diff options
context:
space:
mode:
authorAlessandro Ghedini <alessandro@ghedini.me>2016-02-26 11:51:31 +0000
committerRich Salz <rsalz@openssl.org>2016-03-08 11:10:34 -0500
commitfb46be034816e5fe9f04fd39da960d34dbf2f52d (patch)
tree51984b1e45bcfd10f385cc380de679446bd6338c /crypto/bio
parentc9aad4ff4f9f37a2d8685db4b1ce310452f41e89 (diff)
downloadopenssl-fb46be034816e5fe9f04fd39da960d34dbf2f52d.zip
openssl-fb46be034816e5fe9f04fd39da960d34dbf2f52d.tar.gz
openssl-fb46be034816e5fe9f04fd39da960d34dbf2f52d.tar.bz2
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')
-rw-r--r--crypto/bio/bio_lib.c44
1 files changed, 36 insertions, 8 deletions
diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c
index ee8d622..522525b1 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;