Bug #13935 » ruby_2_3-0005-ossl.c-make-legacy-locking-callbacks-reentrant.patch
ext/openssl/ossl.c | ||
---|---|---|
#include "ruby/thread_native.h"
|
||
struct CRYPTO_dynlock_value {
|
||
rb_nativethread_lock_t lock;
|
||
rb_nativethread_id_t owner;
|
||
size_t count;
|
||
};
|
||
static void
|
||
ossl_lock_init(struct CRYPTO_dynlock_value *l)
|
||
{
|
||
rb_nativethread_lock_initialize(&l->lock);
|
||
l->count = 0;
|
||
}
|
||
static void
|
||
ossl_lock_unlock(int mode, struct CRYPTO_dynlock_value *l)
|
||
{
|
||
if (mode & CRYPTO_LOCK) {
|
||
/* TODO: rb_nativethread_id_t is not necessarily compared with ==. */
|
||
rb_nativethread_id_t tid = rb_nativethread_self();
|
||
if (l->count && l->owner == tid) {
|
||
l->count++;
|
||
return;
|
||
}
|
||
rb_nativethread_lock_lock(&l->lock);
|
||
l->owner = tid;
|
||
l->count = 1;
|
||
} else {
|
||
rb_nativethread_lock_unlock(&l->lock);
|
||
if (!--l->count)
|
||
rb_nativethread_lock_unlock(&l->lock);
|
||
}
|
||
}
|
||