summaryrefslogtreecommitdiff
path: root/ext/etc
diff options
context:
space:
mode:
Diffstat (limited to 'ext/etc')
-rw-r--r--ext/etc/etc.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/ext/etc/etc.c b/ext/etc/etc.c
index cbff6653a7..4c18b630f7 100644
--- a/ext/etc/etc.c
+++ b/ext/etc/etc.c
@@ -62,6 +62,19 @@ void rb_deprecate_constant(VALUE mod, const char *name);
#include "constdefs.h"
+typedef int rb_nativethread_lock_t;
+static int rb_native_mutex_trylock(int *mutex) {
+ if (*mutex) {
+ return 1;
+ }
+ *mutex = 1;
+ return 0;
+}
+static void rb_native_mutex_unlock(int *mutex) {
+ *mutex = 0;
+}
+#define rb_native_mutex_initialize rb_native_mutex_unlock
+
/* call-seq:
* getlogin -> String
*
@@ -240,12 +253,12 @@ etc_getpwnam(VALUE obj, VALUE nam)
}
#ifdef HAVE_GETPWENT
-static int passwd_blocking = 0;
+static rb_nativethread_lock_t passwd_blocking;
static VALUE
passwd_ensure(VALUE _)
{
endpwent();
- passwd_blocking = (int)Qfalse;
+ rb_native_mutex_unlock(&passwd_blocking);
return Qnil;
}
@@ -264,10 +277,9 @@ passwd_iterate(VALUE _)
static void
each_passwd(void)
{
- if (passwd_blocking) {
+ if (rb_native_mutex_trylock(&passwd_blocking)) {
rb_raise(rb_eRuntimeError, "parallel passwd iteration");
}
- passwd_blocking = (int)Qtrue;
rb_ensure(passwd_iterate, 0, passwd_ensure, 0);
}
#endif
@@ -483,12 +495,12 @@ etc_getgrnam(VALUE obj, VALUE nam)
}
#ifdef HAVE_GETGRENT
-static int group_blocking = 0;
+static rb_nativethread_lock_t group_blocking;
static VALUE
group_ensure(VALUE _)
{
endgrent();
- group_blocking = (int)Qfalse;
+ rb_native_mutex_unlock(&group_blocking);
return Qnil;
}
@@ -508,10 +520,9 @@ group_iterate(VALUE _)
static void
each_group(void)
{
- if (group_blocking) {
+ if (rb_native_mutex_trylock(&group_blocking)) {
rb_raise(rb_eRuntimeError, "parallel group iteration");
}
- group_blocking = (int)Qtrue;
rb_ensure(group_iterate, 0, group_ensure, 0);
}
#endif
@@ -1180,8 +1191,11 @@ Init_etc(void)
rb_deprecate_constant(rb_cStruct, "Passwd");
rb_extend_object(sPasswd, rb_mEnumerable);
rb_define_singleton_method(sPasswd, "each", etc_each_passwd, 0);
-
+#ifdef HAVE_GETPWENT
+ rb_native_mutex_initialize(&passwd_blocking);
+#endif
#ifdef HAVE_GETGRENT
+ rb_native_mutex_initialize(&group_blocking);
sGroup = rb_struct_define_under(mEtc, "Group", "name",
#ifdef HAVE_STRUCT_GROUP_GR_PASSWD
"passwd",