io-wait 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac9aac81de884ac5961c9415e4347be5f26ae3ef6e52854834c76a105e4f7388
4
- data.tar.gz: 118b4011fcaa3f94a48ff2d3be11db1b2049375f709426b177ab5a9bc4799d7f
3
+ metadata.gz: e443d24e34f86142b3d27ca1a774e3828b63f445b00f94bd79273bb5583e4699
4
+ data.tar.gz: 5766517962c90389a10199460414a7088b8316edaa7f0854c98ebbdfd65ec4ba
5
5
  SHA512:
6
- metadata.gz: 58cf2bc5cdc614eb7827a460decf662def72676011fbf9d4a853dfd71b66311dd10d81fcd100ac0a2d676d61009e6e3a4c80ac0f7c7d0d88f303a8a16f1510de
7
- data.tar.gz: 700343ef7233d37f9e27d22bfab091af07e681e996619c8953553152b7b7598bb1843d2d969b8d268cac752ead4641b13f32380d2b5c43e8d4808e4176b64c89
6
+ metadata.gz: 526b1f255ac3a9999f9965a5ee35b4c43d32d0493bfaf2cb32e2ad8e4978f57c579574649986f6dfd77a5a2a058f7c5b2f8eaf2b83d8f31a9deac5fc24ffd55f
7
+ data.tar.gz: 0424cf27d9a11aeb5dc142963073b9624e9102465cd5358d5f92b9e1cb258b2b60f224d0ef43c1d49d6156d04c0f6a8e26dcb6d339adcfab1400d7c53bd5b1b7
data/Rakefile CHANGED
@@ -3,14 +3,17 @@ require "rake/testtask"
3
3
 
4
4
  name = "io/wait"
5
5
 
6
+ require 'rake/extensiontask'
7
+ extask = Rake::ExtensionTask.new(name) do |x|
8
+ x.lib_dir << "/#{RUBY_VERSION}/#{x.platform}"
9
+ end
6
10
  Rake::TestTask.new(:test) do |t|
11
+ t.libs << extask.lib_dir
7
12
  t.libs << "test/lib"
8
13
  t.ruby_opts << "-rhelper"
9
14
  t.test_files = FileList["test/**/test_*.rb"]
10
15
  end
11
16
 
12
- require 'rake/extensiontask'
13
- Rake::ExtensionTask.new(name)
14
17
  task :test => :compile
15
18
 
16
19
  task :default => :test
data/ext/io/wait/depend CHANGED
@@ -2,7 +2,7 @@
2
2
  wait.o: $(RUBY_EXTCONF_H)
3
3
  wait.o: $(arch_hdrdir)/ruby/config.h
4
4
  wait.o: $(hdrdir)/ruby.h
5
- wait.o: $(hdrdir)/ruby/assert.h
5
+ # wait.o: $(hdrdir)/ruby/assert.h # not in 2.6
6
6
  wait.o: $(hdrdir)/ruby/backward.h
7
7
  wait.o: $(hdrdir)/ruby/defines.h
8
8
  wait.o: $(hdrdir)/ruby/encoding.h
@@ -2,6 +2,7 @@
2
2
  require 'mkmf'
3
3
  target = "io/wait"
4
4
 
5
+ have_func("rb_io_wait")
5
6
  unless macro_defined?("DOSISH", "#include <ruby.h>")
6
7
  have_header(ioctl_h = "sys/ioctl.h") or ioctl_h = nil
7
8
  fionread = %w[sys/ioctl.h sys/filio.h sys/socket.h].find do |h|
data/ext/io/wait/wait.c CHANGED
@@ -40,6 +40,37 @@
40
40
  #define FIONREAD_POSSIBLE_P(fd) ((void)(fd),Qtrue)
41
41
  #endif
42
42
 
43
+ #ifndef HAVE_RB_IO_WAIT
44
+ static VALUE io_ready_p _((VALUE io));
45
+ static VALUE io_wait_readable _((int argc, VALUE *argv, VALUE io));
46
+ static VALUE io_wait_writable _((int argc, VALUE *argv, VALUE io));
47
+ void Init_wait _((void));
48
+
49
+ static struct timeval *
50
+ get_timeout(int argc, VALUE *argv, struct timeval *timerec)
51
+ {
52
+ VALUE timeout = Qnil;
53
+ rb_check_arity(argc, 0, 1);
54
+ if (!argc || NIL_P(timeout = argv[0])) {
55
+ return NULL;
56
+ }
57
+ else {
58
+ *timerec = rb_time_interval(timeout);
59
+ return timerec;
60
+ }
61
+ }
62
+
63
+ static int
64
+ wait_for_single_fd(rb_io_t *fptr, int events, struct timeval *tv)
65
+ {
66
+ int i = rb_wait_for_single_fd(fptr->fd, events, tv);
67
+ if (i < 0)
68
+ rb_sys_fail(0);
69
+ rb_io_check_closed(fptr);
70
+ return (i & events);
71
+ }
72
+ #endif
73
+
43
74
  /*
44
75
  * call-seq:
45
76
  * io.nread -> int
@@ -51,12 +82,13 @@
51
82
  static VALUE
52
83
  io_nread(VALUE io)
53
84
  {
54
- rb_io_t *fptr = NULL;
85
+ rb_io_t *fptr;
86
+ int len;
55
87
  ioctl_arg n;
56
88
 
57
89
  GetOpenFile(io, fptr);
58
90
  rb_io_check_readable(fptr);
59
- int len = rb_io_read_pending(fptr);
91
+ len = rb_io_read_pending(fptr);
60
92
  if (len > 0) return INT2FIX(len);
61
93
  if (!FIONREAD_POSSIBLE_P(fptr->fd)) return INT2FIX(0);
62
94
  if (ioctl(fptr->fd, FIONREAD, &n)) return INT2FIX(0);
@@ -64,6 +96,7 @@ io_nread(VALUE io)
64
96
  return INT2FIX(0);
65
97
  }
66
98
 
99
+ #ifdef HAVE_RB_IO_WAIT
67
100
  static VALUE
68
101
  io_wait_event(VALUE io, int event, VALUE timeout)
69
102
  {
@@ -82,6 +115,7 @@ io_wait_event(VALUE io, int event, VALUE timeout)
82
115
  return Qfalse;
83
116
  }
84
117
  }
118
+ #endif
85
119
 
86
120
  /*
87
121
  * call-seq:
@@ -94,12 +128,22 @@ static VALUE
94
128
  io_ready_p(VALUE io)
95
129
  {
96
130
  rb_io_t *fptr;
131
+ #ifndef HAVE_RB_IO_WAIT
132
+ struct timeval tv = {0, 0};
133
+ #endif
97
134
 
98
135
  GetOpenFile(io, fptr);
99
136
  rb_io_check_readable(fptr);
100
137
  if (rb_io_read_pending(fptr)) return Qtrue;
101
138
 
102
- return io_wait_event(io, RUBY_IO_READABLE, RB_INT2NUM(0));
139
+ #ifndef HAVE_RB_IO_WAIT
140
+ if (wait_for_single_fd(fptr, RB_WAITFD_IN, &tv))
141
+ return Qtrue;
142
+ #else
143
+ if (RTEST(io_wait_event(io, RUBY_IO_READABLE, RB_INT2NUM(0))))
144
+ return Qtrue;
145
+ #endif
146
+ return Qfalse;
103
147
  }
104
148
 
105
149
  /*
@@ -115,17 +159,31 @@ io_ready_p(VALUE io)
115
159
  static VALUE
116
160
  io_wait_readable(int argc, VALUE *argv, VALUE io)
117
161
  {
118
- rb_io_t *fptr = NULL;
162
+ rb_io_t *fptr;
163
+ #ifndef HAVE_RB_IO_WAIT
164
+ struct timeval timerec;
165
+ struct timeval *tv;
166
+ #endif
119
167
 
120
- RB_IO_POINTER(io, fptr);
168
+ GetOpenFile(io, fptr);
121
169
  rb_io_check_readable(fptr);
122
170
 
171
+ #ifndef HAVE_RB_IO_WAIT
172
+ tv = get_timeout(argc, argv, &timerec);
173
+ #endif
123
174
  if (rb_io_read_pending(fptr)) return Qtrue;
124
175
 
176
+ #ifndef HAVE_RB_IO_WAIT
177
+ if (wait_for_single_fd(fptr, RB_WAITFD_IN, tv)) {
178
+ return io;
179
+ }
180
+ return Qnil;
181
+ #else
125
182
  rb_check_arity(argc, 0, 1);
126
183
  VALUE timeout = (argc == 1 ? argv[0] : Qnil);
127
184
 
128
185
  return io_wait_event(io, RUBY_IO_READABLE, timeout);
186
+ #endif
129
187
  }
130
188
 
131
189
  /*
@@ -139,17 +197,30 @@ io_wait_readable(int argc, VALUE *argv, VALUE io)
139
197
  static VALUE
140
198
  io_wait_writable(int argc, VALUE *argv, VALUE io)
141
199
  {
142
- rb_io_t *fptr = NULL;
200
+ rb_io_t *fptr;
201
+ #ifndef HAVE_RB_IO_WAIT
202
+ struct timeval timerec;
203
+ struct timeval *tv;
204
+ #endif
143
205
 
144
- RB_IO_POINTER(io, fptr);
206
+ GetOpenFile(io, fptr);
145
207
  rb_io_check_writable(fptr);
146
208
 
209
+ #ifndef HAVE_RB_IO_WAIT
210
+ tv = get_timeout(argc, argv, &timerec);
211
+ if (wait_for_single_fd(fptr, RB_WAITFD_OUT, tv)) {
212
+ return io;
213
+ }
214
+ return Qnil;
215
+ #else
147
216
  rb_check_arity(argc, 0, 1);
148
217
  VALUE timeout = (argc == 1 ? argv[0] : Qnil);
149
218
 
150
219
  return io_wait_event(io, RUBY_IO_WRITABLE, timeout);
220
+ #endif
151
221
  }
152
222
 
223
+ #ifdef HAVE_RB_IO_WAIT
153
224
  /*
154
225
  * call-seq:
155
226
  * io.wait_priority -> true or false
@@ -173,6 +244,7 @@ io_wait_priority(int argc, VALUE *argv, VALUE io)
173
244
 
174
245
  return io_wait_event(io, RUBY_IO_PRIORITY, timeout);
175
246
  }
247
+ #endif
176
248
 
177
249
  static int
178
250
  wait_mode_sym(VALUE mode)
@@ -228,6 +300,31 @@ wait_mode_sym(VALUE mode)
228
300
  static VALUE
229
301
  io_wait(int argc, VALUE *argv, VALUE io)
230
302
  {
303
+ #ifndef HAVE_RB_IO_WAIT
304
+ rb_io_t *fptr;
305
+ struct timeval timerec;
306
+ struct timeval *tv = NULL;
307
+ int event = 0;
308
+ int i;
309
+
310
+ GetOpenFile(io, fptr);
311
+ for (i = 0; i < argc; ++i) {
312
+ if (SYMBOL_P(argv[i])) {
313
+ event |= wait_mode_sym(argv[i]);
314
+ }
315
+ else {
316
+ *(tv = &timerec) = rb_time_interval(argv[i]);
317
+ }
318
+ }
319
+ /* rb_time_interval() and might_mode() might convert the argument */
320
+ rb_io_check_closed(fptr);
321
+ if (!event) event = RB_WAITFD_IN;
322
+ if ((event & RB_WAITFD_IN) && rb_io_read_pending(fptr))
323
+ return Qtrue;
324
+ if (wait_for_single_fd(fptr, event, tv))
325
+ return io;
326
+ return Qnil;
327
+ #else
231
328
  VALUE timeout = Qundef;
232
329
  rb_io_event_t events = 0;
233
330
 
@@ -264,6 +361,7 @@ io_wait(int argc, VALUE *argv, VALUE io)
264
361
  }
265
362
 
266
363
  return io_wait_event(io, events, timeout);
364
+ #endif
267
365
  }
268
366
 
269
367
  /*
@@ -284,5 +382,7 @@ Init_wait(void)
284
382
 
285
383
  rb_define_method(rb_cIO, "wait_readable", io_wait_readable, -1);
286
384
  rb_define_method(rb_cIO, "wait_writable", io_wait_writable, -1);
385
+ #ifdef HAVE_RB_IO_WAIT
287
386
  rb_define_method(rb_cIO, "wait_priority", io_wait_priority, -1);
387
+ #endif
288
388
  }
data/io-wait.gemspec CHANGED
@@ -1,4 +1,4 @@
1
- _VERSION = "0.2.0"
1
+ _VERSION = "0.2.1"
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "io-wait"
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.description = %q{Waits until IO is readable or writable without blocking.}
11
11
  spec.homepage = "https://github.com/ruby/io-wait"
12
12
  spec.licenses = ["Ruby", "BSD-2-Clause"]
13
- spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
13
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.6.0")
14
14
 
15
15
  spec.metadata["homepage_uri"] = spec.homepage
16
16
  spec.metadata["source_code_uri"] = spec.homepage
@@ -0,0 +1,6 @@
1
+ task :sync_tool do
2
+ require 'fileutils'
3
+ FileUtils.cp "../ruby/tool/lib/core_assertions.rb", "./test/lib"
4
+ FileUtils.cp "../ruby/tool/lib/envutil.rb", "./test/lib"
5
+ FileUtils.cp "../ruby/tool/lib/find_executable.rb", "./test/lib"
6
+ end
data/rakelib/version.rake CHANGED
@@ -12,7 +12,7 @@ class << (helper = Bundler::GemHelper.instance)
12
12
  end
13
13
 
14
14
  def commit_bump
15
- sh(%W[git -C #{__dir__} commit -m bump\ up\ to\ #{gemspec.version}
15
+ sh(%W[git commit -m bump\ up\ to\ #{gemspec.version}
16
16
  #{gemspec.loaded_from}])
17
17
  end
18
18
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: io-wait
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nobu Nakada
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-21 00:00:00.000000000 Z
11
+ date: 2021-11-19 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Waits until IO is readable or writable without blocking.
14
14
  email:
@@ -28,6 +28,7 @@ files:
28
28
  - io-wait.gemspec
29
29
  - rakelib/changelogs.rake
30
30
  - rakelib/epoch.rake
31
+ - rakelib/sync_tool.rake
31
32
  - rakelib/version.rake
32
33
  homepage: https://github.com/ruby/io-wait
33
34
  licenses:
@@ -44,7 +45,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
44
45
  requirements:
45
46
  - - ">="
46
47
  - !ruby/object:Gem::Version
47
- version: 3.0.0
48
+ version: 2.6.0
48
49
  required_rubygems_version: !ruby/object:Gem::Requirement
49
50
  requirements:
50
51
  - - ">="