Skip to content

Commit

Permalink
Initialize mutex for crypt(3) statically
Browse files Browse the repository at this point in the history
Assuming that all platforms, where only `crypt` is available but
not `crypt_r`, are POSIX-base.
  • Loading branch information
nobu committed Mar 16, 2022
1 parent f91ea23 commit 4d93b62
Showing 1 changed file with 1 addition and 24 deletions.
25 changes: 1 addition & 24 deletions string.c
Expand Up @@ -10158,35 +10158,12 @@ rb_str_oct(VALUE str)
# 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;
}
} crypt_mutex = {PTHREAD_MUTEX_INITIALIZER};

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

Expand Down

0 comments on commit 4d93b62

Please sign in to comment.