etc 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5f5196e40206894d4fc74d486106863f351e131e89fa6017807542361a09c617
4
- data.tar.gz: 131ade148fb05d021a9956ee282722012abbc0607f87bfa15bd06a0374264a4a
3
+ metadata.gz: 4c60b51f5cf5237e306c210a1912bd9feb1c7a75bc7bd5d87b2b2ba2c6e82c01
4
+ data.tar.gz: fc93add02caa73345c5b0ed48209a1307275189447ab95f1078df8f5ee362dc8
5
5
  SHA512:
6
- metadata.gz: 210712686ace4800e20dbc1c4f97ead9a352f6d65dc794bb0033f55da286ec730bef1269f5b9479b4f600a87a55a31470f7596b83ddc705aeb5f194618646e37
7
- data.tar.gz: aa0cba8840eb405a1b80339d82c44b2c582e97b2cab1db8d7ad05f315ac1a78325c421698b94a53283302702f5ea2a669221bfbf84f0be88bf880fc863ade405
6
+ metadata.gz: 1cb34202dcb7a18d708b07967d2db958b27e0cc51c675746530adbf4af07b24b9393b3e0ecb91d4133e2a179c2023fd0c8503d9faa992b5a398c92b2b9699f3f
7
+ data.tar.gz: 834167d66f21aac210b0ffe83093b1252245be3b1e11b15dd2879d409f353c6537a67b48107f56ba516873e2a0976d5f64a9e15e2bb8c8560ef71f019c70aaee
data/ext/etc/etc.c CHANGED
@@ -52,7 +52,7 @@ char *getenv();
52
52
  #endif
53
53
  char *getlogin();
54
54
 
55
- #define RUBY_ETC_VERSION "1.2.0"
55
+ #define RUBY_ETC_VERSION "1.3.0"
56
56
 
57
57
  #ifdef HAVE_RB_DEPRECATE_CONSTANT
58
58
  void rb_deprecate_constant(VALUE mod, const char *name);
@@ -62,22 +62,21 @@ void rb_deprecate_constant(VALUE mod, const char *name);
62
62
 
63
63
  #include "constdefs.h"
64
64
 
65
- #ifdef HAVE_RB_EXT_RACTOR_SAFE
66
- #include "ruby/thread_native.h"
65
+ #ifdef HAVE_RUBY_ATOMIC_H
66
+ # include "ruby/atomic.h"
67
67
  #else
68
- /* Implement rb_native_mutex_x using an int */
69
- typedef int rb_nativethread_lock_t;
70
- static int rb_native_mutex_trylock(int *mutex) {
71
- if (*mutex) {
72
- return 1;
73
- }
74
- *mutex = 1;
75
- return 0;
76
- }
77
- static void rb_native_mutex_unlock(int *mutex) {
78
- *mutex = 0;
68
+ typedef int rb_atomic_t;
69
+ # define RUBY_ATOMIC_CAS(var, oldval, newval) \
70
+ ((var) == (oldval) ? ((var) = (newval), (oldval)) : (var))
71
+ # define RUBY_ATOMIC_EXCHANGE(var, newval) \
72
+ atomic_exchange(&var, newval)
73
+ static inline rb_atomic_t
74
+ atomic_exchange(volatile rb_atomic_t *var, rb_atomic_t newval)
75
+ {
76
+ rb_atomic_t oldval = *var;
77
+ *var = newval;
78
+ return oldval;
79
79
  }
80
- #define rb_native_mutex_initialize rb_native_mutex_unlock
81
80
  #endif
82
81
 
83
82
  /* call-seq:
@@ -258,12 +257,14 @@ etc_getpwnam(VALUE obj, VALUE nam)
258
257
  }
259
258
 
260
259
  #ifdef HAVE_GETPWENT
261
- static rb_nativethread_lock_t passwd_blocking;
260
+ static rb_atomic_t passwd_blocking;
262
261
  static VALUE
263
262
  passwd_ensure(VALUE _)
264
263
  {
265
264
  endpwent();
266
- rb_native_mutex_unlock(&passwd_blocking);
265
+ if (RUBY_ATOMIC_EXCHANGE(passwd_blocking, 0) != 1) {
266
+ rb_raise(rb_eRuntimeError, "unexpected passwd_blocking");
267
+ }
267
268
  return Qnil;
268
269
  }
269
270
 
@@ -282,7 +283,7 @@ passwd_iterate(VALUE _)
282
283
  static void
283
284
  each_passwd(void)
284
285
  {
285
- if (rb_native_mutex_trylock(&passwd_blocking)) {
286
+ if (RUBY_ATOMIC_CAS(passwd_blocking, 0, 1)) {
286
287
  rb_raise(rb_eRuntimeError, "parallel passwd iteration");
287
288
  }
288
289
  rb_ensure(passwd_iterate, 0, passwd_ensure, 0);
@@ -500,12 +501,14 @@ etc_getgrnam(VALUE obj, VALUE nam)
500
501
  }
501
502
 
502
503
  #ifdef HAVE_GETGRENT
503
- static rb_nativethread_lock_t group_blocking;
504
+ static rb_atomic_t group_blocking;
504
505
  static VALUE
505
506
  group_ensure(VALUE _)
506
507
  {
507
508
  endgrent();
508
- rb_native_mutex_unlock(&group_blocking);
509
+ if (RUBY_ATOMIC_EXCHANGE(group_blocking, 0) != 1) {
510
+ rb_raise(rb_eRuntimeError, "unexpected group_blocking");
511
+ }
509
512
  return Qnil;
510
513
  }
511
514
 
@@ -525,7 +528,7 @@ group_iterate(VALUE _)
525
528
  static void
526
529
  each_group(void)
527
530
  {
528
- if (rb_native_mutex_trylock(&group_blocking)) {
531
+ if (RUBY_ATOMIC_CAS(group_blocking, 0, 1)) {
529
532
  rb_raise(rb_eRuntimeError, "parallel group iteration");
530
533
  }
531
534
  rb_ensure(group_iterate, 0, group_ensure, 0);
@@ -954,11 +957,13 @@ io_pathconf(VALUE io, VALUE arg)
954
957
  static int
955
958
  etc_nprocessors_affin(void)
956
959
  {
957
- cpu_set_t *cpuset;
960
+ cpu_set_t *cpuset, cpuset_buff[1024 / sizeof(cpu_set_t)];
958
961
  size_t size;
959
962
  int ret;
960
963
  int n;
961
964
 
965
+ CPU_ZERO_S(sizeof(cpuset_buff), cpuset_buff);
966
+
962
967
  /*
963
968
  * XXX:
964
969
  * man page says CPU_ALLOC takes number of cpus. But it is not accurate
@@ -977,13 +982,12 @@ etc_nprocessors_affin(void)
977
982
  */
978
983
  for (n=64; n <= 16384; n *= 2) {
979
984
  size = CPU_ALLOC_SIZE(n);
980
- if (size >= 1024) {
985
+ if (size >= sizeof(cpuset_buff)) {
981
986
  cpuset = xcalloc(1, size);
982
987
  if (!cpuset)
983
988
  return -1;
984
989
  } else {
985
- cpuset = alloca(size);
986
- CPU_ZERO_S(size, cpuset);
990
+ cpuset = cpuset_buff;
987
991
  }
988
992
 
989
993
  ret = sched_getaffinity(0, size, cpuset);
@@ -992,10 +996,10 @@ etc_nprocessors_affin(void)
992
996
  ret = CPU_COUNT_S(size, cpuset);
993
997
  }
994
998
 
995
- if (size >= 1024) {
999
+ if (size >= sizeof(cpuset_buff)) {
996
1000
  xfree(cpuset);
997
1001
  }
998
- if (ret > 0) {
1002
+ if (ret > 0 || errno != EINVAL) {
999
1003
  return ret;
1000
1004
  }
1001
1005
  }
@@ -1199,11 +1203,7 @@ Init_etc(void)
1199
1203
  rb_deprecate_constant(rb_cStruct, "Passwd");
1200
1204
  rb_extend_object(sPasswd, rb_mEnumerable);
1201
1205
  rb_define_singleton_method(sPasswd, "each", etc_each_passwd, 0);
1202
- #ifdef HAVE_GETPWENT
1203
- rb_native_mutex_initialize(&passwd_blocking);
1204
- #endif
1205
1206
  #ifdef HAVE_GETGRENT
1206
- rb_native_mutex_initialize(&group_blocking);
1207
1207
  sGroup = rb_struct_define_under(mEtc, "Group", "name",
1208
1208
  #ifdef HAVE_STRUCT_GROUP_GR_PASSWD
1209
1209
  "passwd",
data/ext/etc/extconf.rb CHANGED
@@ -47,10 +47,7 @@ if !File.exist?("#{srcdir}/depend")
47
47
  %x[#{RbConfig.ruby} #{srcdir}/mkconstants.rb -o #{srcdir}/constdefs.h]
48
48
  end
49
49
 
50
- decl = [
51
- "void rb_deprecate_constant(VALUE, const char *);",
52
- ]
53
- have_func('rb_deprecate_constant(Qnil, "None")', [decl])
50
+ have_func('rb_deprecate_constant(Qnil, "None")')
54
51
 
55
52
  $distcleanfiles << "constdefs.h"
56
53
 
data/test/etc/test_etc.rb CHANGED
@@ -171,6 +171,7 @@ class TestEtc < Test::Unit::TestCase
171
171
 
172
172
  def test_ractor
173
173
  return unless Etc.passwd # => skip test if no platform support
174
+ Etc.endpwent
174
175
 
175
176
  assert_ractor(<<~RUBY, require: 'etc')
176
177
  ractor = Ractor.new do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: etc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yukihiro Matsumoto
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-23 00:00:00.000000000 Z
11
+ date: 2021-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -101,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
101
  - !ruby/object:Gem::Version
102
102
  version: '0'
103
103
  requirements: []
104
- rubygems_version: 3.2.2
104
+ rubygems_version: 3.3.0.dev
105
105
  signing_key:
106
106
  specification_version: 4
107
107
  summary: Provides access to information typically stored in UNIX /etc directory.