io-nonblock 0.1.0 → 0.2.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 +4 -4
- data/ext/io/nonblock/nonblock.c +56 -11
- metadata +6 -12
- data/.gitignore +0 -11
- data/.travis.yml +0 -6
- data/Gemfile +0 -4
- data/Rakefile +0 -12
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/io-nonblock.gemspec +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 147c4c19a532bb8ea1192a306c5c50ab2e95c0c9184048e2918af930733f7332
|
4
|
+
data.tar.gz: 1db9af6d8cf78b3779113e95e44b28376bd6788b0be957e7a917084bd2c5706d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91ecd0eca31b2a6f16e83e5257e0fb43015b7c46b1961c97c9d5639f90dd18460777cd60f80b0ab0e9755dfa5415a1acb028e22394d3db443959d1576b130b69
|
7
|
+
data.tar.gz: e6a1e5387e7aa86578fe09bc67b26265ab26dd36d442a087bded4c5212bd421348aa1c3e062ee73596e689272a25c1eb44f1738c90738bb0bc17fa807f9d3cd7
|
data/ext/io/nonblock/nonblock.c
CHANGED
@@ -19,14 +19,14 @@
|
|
19
19
|
|
20
20
|
#ifdef F_GETFL
|
21
21
|
static int
|
22
|
-
|
22
|
+
get_fcntl_flags(int fd)
|
23
23
|
{
|
24
24
|
int f = fcntl(fd, F_GETFL);
|
25
25
|
if (f == -1) rb_sys_fail(0);
|
26
26
|
return f;
|
27
27
|
}
|
28
28
|
#else
|
29
|
-
#define
|
29
|
+
#define get_fcntl_flags(fd) ((void)(fd), 0)
|
30
30
|
#endif
|
31
31
|
|
32
32
|
#ifdef F_GETFL
|
@@ -41,7 +41,7 @@ rb_io_nonblock_p(VALUE io)
|
|
41
41
|
{
|
42
42
|
rb_io_t *fptr;
|
43
43
|
GetOpenFile(io, fptr);
|
44
|
-
if (
|
44
|
+
if (get_fcntl_flags(fptr->fd) & O_NONBLOCK)
|
45
45
|
return Qtrue;
|
46
46
|
return Qfalse;
|
47
47
|
}
|
@@ -50,6 +50,13 @@ rb_io_nonblock_p(VALUE io)
|
|
50
50
|
#endif
|
51
51
|
|
52
52
|
#ifdef F_SETFL
|
53
|
+
static void
|
54
|
+
set_fcntl_flags(int fd, int f)
|
55
|
+
{
|
56
|
+
if (fcntl(fd, F_SETFL, f) == -1)
|
57
|
+
rb_sys_fail(0);
|
58
|
+
}
|
59
|
+
|
53
60
|
static int
|
54
61
|
io_nonblock_set(int fd, int f, int nb)
|
55
62
|
{
|
@@ -63,8 +70,7 @@ io_nonblock_set(int fd, int f, int nb)
|
|
63
70
|
return 0;
|
64
71
|
f &= ~O_NONBLOCK;
|
65
72
|
}
|
66
|
-
|
67
|
-
rb_sys_fail(0);
|
73
|
+
set_fcntl_flags(fd, f);
|
68
74
|
return 1;
|
69
75
|
}
|
70
76
|
|
@@ -74,6 +80,46 @@ io_nonblock_set(int fd, int f, int nb)
|
|
74
80
|
*
|
75
81
|
* Enables non-blocking mode on a stream when set to
|
76
82
|
* +true+, and blocking mode when set to +false+.
|
83
|
+
*
|
84
|
+
* This method set or clear O_NONBLOCK flag for the file descriptor
|
85
|
+
* in <em>ios</em>.
|
86
|
+
*
|
87
|
+
* The behavior of most IO methods is not affected by this flag
|
88
|
+
* because they retry system calls to complete their task
|
89
|
+
* after EAGAIN and partial read/write.
|
90
|
+
* (An exception is IO#syswrite which doesn't retry.)
|
91
|
+
*
|
92
|
+
* This method can be used to clear non-blocking mode of standard I/O.
|
93
|
+
* Since nonblocking methods (read_nonblock, etc.) set non-blocking mode but
|
94
|
+
* they doesn't clear it, this method is usable as follows.
|
95
|
+
*
|
96
|
+
* END { STDOUT.nonblock = false }
|
97
|
+
* STDOUT.write_nonblock("foo")
|
98
|
+
*
|
99
|
+
* Since the flag is shared across processes and
|
100
|
+
* many non-Ruby commands doesn't expect standard I/O with non-blocking mode,
|
101
|
+
* it would be safe to clear the flag before Ruby program exits.
|
102
|
+
*
|
103
|
+
* For example following Ruby program leaves STDIN/STDOUT/STDER non-blocking mode.
|
104
|
+
* (STDIN, STDOUT and STDERR are connected to a terminal.
|
105
|
+
* So making one of them nonblocking-mode effects other two.)
|
106
|
+
* Thus cat command try to read from standard input and
|
107
|
+
* it causes "Resource temporarily unavailable" error (EAGAIN).
|
108
|
+
*
|
109
|
+
* % ruby -e '
|
110
|
+
* STDOUT.write_nonblock("foo\n")'; cat
|
111
|
+
* foo
|
112
|
+
* cat: -: Resource temporarily unavailable
|
113
|
+
*
|
114
|
+
* Clearing the flag makes the behavior of cat command normal.
|
115
|
+
* (cat command waits input from standard input.)
|
116
|
+
*
|
117
|
+
* % ruby -rio/nonblock -e '
|
118
|
+
* END { STDOUT.nonblock = false }
|
119
|
+
* STDOUT.write_nonblock("foo")
|
120
|
+
* '; cat
|
121
|
+
* foo
|
122
|
+
*
|
77
123
|
*/
|
78
124
|
static VALUE
|
79
125
|
rb_io_nonblock_set(VALUE io, VALUE nb)
|
@@ -83,7 +129,7 @@ rb_io_nonblock_set(VALUE io, VALUE nb)
|
|
83
129
|
if (RTEST(nb))
|
84
130
|
rb_io_set_nonblock(fptr);
|
85
131
|
else
|
86
|
-
io_nonblock_set(fptr->fd,
|
132
|
+
io_nonblock_set(fptr->fd, get_fcntl_flags(fptr->fd), RTEST(nb));
|
87
133
|
return io;
|
88
134
|
}
|
89
135
|
|
@@ -91,15 +137,14 @@ static VALUE
|
|
91
137
|
io_nonblock_restore(VALUE arg)
|
92
138
|
{
|
93
139
|
int *restore = (int *)arg;
|
94
|
-
|
95
|
-
rb_sys_fail(0);
|
140
|
+
set_fcntl_flags(restore[0], restore[1]);
|
96
141
|
return Qnil;
|
97
142
|
}
|
98
143
|
|
99
144
|
/*
|
100
145
|
* call-seq:
|
101
|
-
* io.nonblock {|io| } ->
|
102
|
-
* io.nonblock(boolean) {|io| } ->
|
146
|
+
* io.nonblock {|io| } -> object
|
147
|
+
* io.nonblock(boolean) {|io| } -> object
|
103
148
|
*
|
104
149
|
* Yields +self+ in non-blocking mode.
|
105
150
|
*
|
@@ -119,7 +164,7 @@ rb_io_nonblock_block(int argc, VALUE *argv, VALUE io)
|
|
119
164
|
rb_scan_args(argc, argv, "01", &v);
|
120
165
|
nb = RTEST(v);
|
121
166
|
}
|
122
|
-
f =
|
167
|
+
f = get_fcntl_flags(fptr->fd);
|
123
168
|
restore[0] = fptr->fd;
|
124
169
|
restore[1] = f;
|
125
170
|
if (!io_nonblock_set(fptr->fd, f, nb))
|
metadata
CHANGED
@@ -1,34 +1,28 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: io-nonblock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nobu Nakada
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Enables non-blocking mode with IO class
|
14
14
|
email:
|
15
15
|
- nobu@ruby-lang.org
|
16
16
|
executables: []
|
17
|
-
extensions:
|
17
|
+
extensions:
|
18
|
+
- ext/io/nonblock/extconf.rb
|
18
19
|
extra_rdoc_files: []
|
19
20
|
files:
|
20
|
-
- ".gitignore"
|
21
|
-
- ".travis.yml"
|
22
21
|
- COPYING
|
23
|
-
- Gemfile
|
24
22
|
- README.md
|
25
|
-
- Rakefile
|
26
|
-
- bin/console
|
27
|
-
- bin/setup
|
28
23
|
- ext/io/nonblock/depend
|
29
24
|
- ext/io/nonblock/extconf.rb
|
30
25
|
- ext/io/nonblock/nonblock.c
|
31
|
-
- io-nonblock.gemspec
|
32
26
|
homepage: https://github.com/ruby/io-nonblock
|
33
27
|
licenses:
|
34
28
|
- Ruby
|
@@ -51,7 +45,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
51
45
|
- !ruby/object:Gem::Version
|
52
46
|
version: '0'
|
53
47
|
requirements: []
|
54
|
-
rubygems_version: 3.
|
48
|
+
rubygems_version: 3.4.0.dev
|
55
49
|
signing_key:
|
56
50
|
specification_version: 4
|
57
51
|
summary: Enables non-blocking mode with IO class
|
data/.gitignore
DELETED
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/Rakefile
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
require "bundler/gem_tasks"
|
2
|
-
require "rake/testtask"
|
3
|
-
|
4
|
-
Rake::TestTask.new(:test) do |t|
|
5
|
-
t.libs << "test"
|
6
|
-
t.libs << "lib"
|
7
|
-
t.test_files = FileList["test/**/test_*.rb"]
|
8
|
-
end
|
9
|
-
|
10
|
-
require 'rake/extensiontask'
|
11
|
-
Rake::ExtensionTask.new("io/nonblock")
|
12
|
-
task :default => :test
|
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "io/nonblock"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|
data/bin/setup
DELETED
data/io-nonblock.gemspec
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
Gem::Specification.new do |spec|
|
2
|
-
spec.name = "io-nonblock"
|
3
|
-
spec.version = "0.1.0"
|
4
|
-
spec.authors = ["Nobu Nakada"]
|
5
|
-
spec.email = ["nobu@ruby-lang.org"]
|
6
|
-
|
7
|
-
spec.summary = %q{Enables non-blocking mode with IO class}
|
8
|
-
spec.description = %q{Enables non-blocking mode with IO class}
|
9
|
-
spec.homepage = "https://github.com/ruby/io-nonblock"
|
10
|
-
spec.licenses = ["Ruby", "BSD-2-Clause"]
|
11
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
12
|
-
|
13
|
-
spec.metadata["homepage_uri"] = spec.homepage
|
14
|
-
spec.metadata["source_code_uri"] = spec.homepage
|
15
|
-
|
16
|
-
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
17
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
-
end
|
19
|
-
spec.bindir = "exe"
|
20
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
-
spec.require_paths = ["lib"]
|
22
|
-
end
|