bio->libctx = libctx;
bio->method = method;
bio->shutdown = 1;
- bio->references = 1;
- if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data))
+ if (!CRYPTO_NEW_REF(&bio->references, 1))
goto err;
- bio->lock = CRYPTO_THREAD_lock_new();
- if (bio->lock == NULL) {
- ERR_raise(ERR_LIB_BIO, ERR_R_CRYPTO_LIB);
- CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data);
+ if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data))
goto err;
- }
if (method->create != NULL && !method->create(bio)) {
ERR_raise(ERR_LIB_BIO, ERR_R_INIT_FAIL);
CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data);
- CRYPTO_THREAD_lock_free(bio->lock);
+ CRYPTO_FREE_REF(&bio->references);
goto err;
}
if (method->create == NULL)
return bio;
err:
+ CRYPTO_FREE_REF(&bio->references);
OPENSSL_free(bio);
return NULL;
}
if (a == NULL)
return 0;
- if (CRYPTO_DOWN_REF(&a->references, &ret, a->lock) <= 0)
+ if (CRYPTO_DOWN_REF(&a->references, &ret) <= 0)
return 0;
REF_PRINT_COUNT("BIO", a);
CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data);
- CRYPTO_THREAD_lock_free(a->lock);
+ CRYPTO_FREE_REF(&a->references);
OPENSSL_free(a);
{
int i;
- if (CRYPTO_UP_REF(&a->references, &i, a->lock) <= 0)
+ if (CRYPTO_UP_REF(&a->references, &i) <= 0)
return 0;
REF_PRINT_COUNT("BIO", a);
while (bio != NULL) {
b = bio;
- ref = b->references;
+ CRYPTO_GET_REF(&b->references, &ref);
bio = bio->next_bio;
BIO_free(b);
/* Since ref count > 1, don't free anyone else. */
CRYPTO_THREAD_lock_free(bio_lookup_lock);
bio_lookup_lock = NULL;
#endif
- CRYPTO_THREAD_lock_free(bio_type_lock);
- bio_type_lock = NULL;
+ CRYPTO_FREE_REF(&bio_type_count);
}
/* Internal variant of the below BIO_wait() not calling ERR_raise(...) */
#include "bio_local.h"
#include "internal/thread_once.h"
-CRYPTO_RWLOCK *bio_type_lock = NULL;
+CRYPTO_REF_COUNT bio_type_count;
static CRYPTO_ONCE bio_type_init = CRYPTO_ONCE_STATIC_INIT;
DEFINE_RUN_ONCE_STATIC(do_bio_type_init)
{
- bio_type_lock = CRYPTO_THREAD_lock_new();
- return bio_type_lock != NULL;
+ return CRYPTO_NEW_REF(&bio_type_count, BIO_TYPE_START);
}
int BIO_get_new_index(void)
{
- static CRYPTO_REF_COUNT bio_count = BIO_TYPE_START;
int newval;
if (!RUN_ONCE(&bio_type_init, do_bio_type_init)) {
ERR_raise(ERR_LIB_BIO, ERR_R_CRYPTO_LIB);
return -1;
}
- if (!CRYPTO_UP_REF(&bio_count, &newval, bio_type_lock))
+ if (!CRYPTO_UP_REF(&bio_type_count, &newval))
return -1;
return newval;
}
*/
struct ossl_core_bio_st {
CRYPTO_REF_COUNT ref_cnt;
- CRYPTO_RWLOCK *ref_lock;
BIO *bio;
};
{
OSSL_CORE_BIO *cb = OPENSSL_malloc(sizeof(*cb));
- if (cb == NULL || (cb->ref_lock = CRYPTO_THREAD_lock_new()) == NULL) {
+ if (cb == NULL || !CRYPTO_NEW_REF(&cb->ref_cnt, 1)) {
OPENSSL_free(cb);
return NULL;
}
- cb->ref_cnt = 1;
return cb;
}
{
int ref = 0;
- return CRYPTO_UP_REF(&cb->ref_cnt, &ref, cb->ref_lock);
+ return CRYPTO_UP_REF(&cb->ref_cnt, &ref);
}
int ossl_core_bio_free(OSSL_CORE_BIO *cb)
int ref = 0, res = 1;
if (cb != NULL) {
- CRYPTO_DOWN_REF(&cb->ref_cnt, &ref, cb->ref_lock);
+ CRYPTO_DOWN_REF(&cb->ref_cnt, &ref);
if (ref <= 0) {
res = BIO_free(cb->bio);
- CRYPTO_THREAD_lock_free(cb->ref_lock);
+ CRYPTO_FREE_REF(&cb->ref_cnt);
OPENSSL_free(cb);
}
}