This commit is contained in:
Nobuyoshi Nakada 2021-04-12 22:56:15 +09:00
Родитель df7efdcb6b
Коммит 12f7ba5ed4
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 7CD2805BFA3770C6
2 изменённых файлов: 41 добавлений и 1 удалений

Просмотреть файл

@ -13453,6 +13453,7 @@ string.$(OBJEXT): $(top_srcdir)/internal/transcode.h
string.$(OBJEXT): $(top_srcdir)/internal/vm.h
string.$(OBJEXT): $(top_srcdir)/internal/warnings.h
string.$(OBJEXT): {$(VPATH)}assert.h
string.$(OBJEXT): {$(VPATH)}atomic.h
string.$(OBJEXT): {$(VPATH)}backward/2/assume.h
string.$(OBJEXT): {$(VPATH)}backward/2/attributes.h
string.$(OBJEXT): {$(VPATH)}backward/2/bool.h
@ -13626,6 +13627,7 @@ string.$(OBJEXT): {$(VPATH)}ruby_assert.h
string.$(OBJEXT): {$(VPATH)}st.h
string.$(OBJEXT): {$(VPATH)}string.c
string.$(OBJEXT): {$(VPATH)}subst.h
string.$(OBJEXT): {$(VPATH)}thread_native.h
string.$(OBJEXT): {$(VPATH)}util.h
string.$(OBJEXT): {$(VPATH)}vm_debug.h
string.$(OBJEXT): {$(VPATH)}vm_sync.h

Просмотреть файл

@ -9667,6 +9667,42 @@ rb_str_oct(VALUE str)
return rb_str_to_inum(str, -8, FALSE);
}
#ifndef HAVE_CRYPT_R
# include "ruby/thread_native.h"
# include "ruby/atomic.h"
static struct {
rb_atomic_t initialized;
rb_nativethread_lock_t lock;
} crypt_mutex;
static void
crypt_mutex_destroy(void)
{
RUBY_ASSERT_ALWAYS(crypt_mutex.initialized == 1);
rb_nativethread_lock_destroy(&crypt_mutex.lock);
crypt_mutex.initialized = 0;
}
static void
crypt_mutex_initialize(void)
{
rb_atomic_t i;
while ((i = RUBY_ATOMIC_CAS(crypt_mutex.initialized, 0, 2)) == 2);
switch (i) {
case 0:
rb_nativethread_lock_initialize(&crypt_mutex.lock);
atexit(crypt_mutex_destroy);
RUBY_ASSERT(crypt_mutex.initialized == 2);
RUBY_ATOMIC_CAS(crypt_mutex.initialized, 2, 1);
break;
case 1:
break;
default:
rb_bug("crypt_mutex.initialized: %d->%d", i, crypt_mutex.initialized);
}
}
#endif
/*
* call-seq:
@ -9737,7 +9773,7 @@ rb_str_crypt(VALUE str, VALUE salt)
# define CRYPT_END() ALLOCV_END(databuf)
#else
extern char *crypt(const char *, const char *);
# define CRYPT_END() (void)0
# define CRYPT_END() rb_nativethread_lock_unlock(&crypt_mutex.lock)
#endif
VALUE result;
const char *s, *saltp;
@ -9770,6 +9806,8 @@ rb_str_crypt(VALUE str, VALUE salt)
# endif
res = crypt_r(s, saltp, data);
#else
crypt_mutex_initialize();
rb_nativethread_lock_lock(&crypt_mutex.lock);
res = crypt(s, saltp);
#endif
if (!res) {