polyphony 1.5 → 1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +14 -0
- data/TODO.md +0 -4
- data/ext/polyphony/backend_io_uring.c +34 -1
- data/ext/polyphony/backend_io_uring_context.c +24 -18
- data/ext/polyphony/backend_io_uring_context.h +4 -2
- data/ext/polyphony/backend_libev.c +4 -7
- data/ext/polyphony/event.c +21 -0
- data/ext/polyphony/extconf.rb +20 -18
- data/ext/polyphony/fiber.c +0 -2
- data/ext/polyphony/polyphony.c +2 -0
- data/ext/polyphony/polyphony.h +5 -0
- data/ext/polyphony/ring_buffer.c +1 -0
- data/ext/polyphony/runqueue_ring_buffer.c +1 -0
- data/ext/polyphony/thread.c +63 -0
- data/lib/polyphony/adapters/open3.rb +190 -0
- data/lib/polyphony/core/sync.rb +83 -13
- data/lib/polyphony/core/timer.rb +7 -25
- data/lib/polyphony/extensions/exception.rb +15 -0
- data/lib/polyphony/extensions/fiber.rb +14 -13
- data/lib/polyphony/extensions/io.rb +56 -14
- data/lib/polyphony/extensions/kernel.rb +1 -1
- data/lib/polyphony/extensions/object.rb +1 -13
- data/lib/polyphony/extensions/process.rb +76 -1
- data/lib/polyphony/extensions/thread.rb +19 -27
- data/lib/polyphony/version.rb +1 -1
- data/lib/polyphony.rb +11 -5
- data/test/helper.rb +46 -4
- data/test/open3/envutil.rb +380 -0
- data/test/open3/find_executable.rb +24 -0
- data/test/stress.rb +11 -7
- data/test/test_backend.rb +7 -2
- data/test/test_event.rb +10 -3
- data/test/test_ext.rb +2 -1
- data/test/test_fiber.rb +16 -4
- data/test/test_global_api.rb +13 -12
- data/test/test_io.rb +39 -0
- data/test/test_kernel.rb +2 -2
- data/test/test_monitor.rb +356 -0
- data/test/test_open3.rb +338 -0
- data/test/test_signal.rb +5 -1
- data/test/test_socket.rb +6 -3
- data/test/test_sync.rb +46 -0
- data/test/test_thread.rb +10 -1
- data/test/test_thread_pool.rb +5 -0
- data/test/test_throttler.rb +1 -1
- data/test/test_timer.rb +8 -2
- data/test/test_trace.rb +2 -0
- data/vendor/liburing/.github/workflows/build.yml +8 -0
- data/vendor/liburing/.gitignore +1 -0
- data/vendor/liburing/CHANGELOG +8 -0
- data/vendor/liburing/configure +17 -25
- data/vendor/liburing/debian/liburing-dev.manpages +2 -0
- data/vendor/liburing/debian/rules +2 -1
- data/vendor/liburing/examples/Makefile +2 -1
- data/vendor/liburing/examples/io_uring-udp.c +11 -3
- data/vendor/liburing/examples/rsrc-update-bench.c +100 -0
- data/vendor/liburing/liburing.spec +1 -1
- data/vendor/liburing/make-debs.sh +4 -2
- data/vendor/liburing/src/Makefile +5 -5
- data/vendor/liburing/src/arch/aarch64/lib.h +1 -1
- data/vendor/liburing/src/include/liburing/io_uring.h +41 -16
- data/vendor/liburing/src/include/liburing.h +86 -11
- data/vendor/liburing/src/int_flags.h +1 -0
- data/vendor/liburing/src/liburing-ffi.map +12 -0
- data/vendor/liburing/src/liburing.map +8 -0
- data/vendor/liburing/src/register.c +7 -2
- data/vendor/liburing/src/setup.c +373 -81
- data/vendor/liburing/test/232c93d07b74.c +3 -3
- data/vendor/liburing/test/Makefile +10 -3
- data/vendor/liburing/test/accept.c +2 -1
- data/vendor/liburing/test/buf-ring.c +35 -75
- data/vendor/liburing/test/connect-rep.c +204 -0
- data/vendor/liburing/test/coredump.c +59 -0
- data/vendor/liburing/test/fallocate.c +9 -0
- data/vendor/liburing/test/fd-pass.c +34 -3
- data/vendor/liburing/test/file-verify.c +27 -6
- data/vendor/liburing/test/helpers.c +3 -1
- data/vendor/liburing/test/io_uring_register.c +25 -28
- data/vendor/liburing/test/io_uring_setup.c +1 -1
- data/vendor/liburing/test/poll-cancel-all.c +29 -5
- data/vendor/liburing/test/poll-race-mshot.c +6 -22
- data/vendor/liburing/test/read-write.c +53 -0
- data/vendor/liburing/test/recv-msgall.c +21 -23
- data/vendor/liburing/test/reg-fd-only.c +55 -0
- data/vendor/liburing/test/reg-hint.c +56 -0
- data/vendor/liburing/test/regbuf-merge.c +91 -0
- data/vendor/liburing/test/ringbuf-read.c +2 -10
- data/vendor/liburing/test/send_recvmsg.c +5 -16
- data/vendor/liburing/test/shutdown.c +2 -1
- data/vendor/liburing/test/socket-io-cmd.c +215 -0
- data/vendor/liburing/test/socket-rw-eagain.c +2 -1
- data/vendor/liburing/test/socket-rw-offset.c +2 -1
- data/vendor/liburing/test/socket-rw.c +2 -1
- data/vendor/liburing/test/timeout.c +276 -0
- data/vendor/liburing/test/xattr.c +38 -25
- metadata +14 -3
- data/vendor/liburing/test/timeout-overflow.c +0 -204
data/test/test_open3.rb
ADDED
@@ -0,0 +1,338 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'helper'
|
4
|
+
|
5
|
+
# Adapted from: https://github.com/ruby/open3/blob/master/test/test_open3.rb
|
6
|
+
|
7
|
+
require_relative 'open3/envutil'
|
8
|
+
|
9
|
+
class TestOpen3 < MiniTest::Test
|
10
|
+
RUBY = EnvUtil.rubybin
|
11
|
+
|
12
|
+
def test_exit_status
|
13
|
+
Open3.popen3(RUBY, '-e', 'exit true') {|i,o,e,t|
|
14
|
+
assert_equal(true, t.value.success?)
|
15
|
+
}
|
16
|
+
Open3.popen3(RUBY, '-e', 'exit false') {|i,o,e,t|
|
17
|
+
assert_equal(false, t.value.success?)
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_stdin
|
22
|
+
Open3.popen3(RUBY, '-e', 'exit STDIN.gets.chomp == "t"') {|i,o,e,t|
|
23
|
+
i.puts 't'
|
24
|
+
assert_equal(true, t.value.success?)
|
25
|
+
}
|
26
|
+
Open3.popen3(RUBY, '-e', 'exit STDIN.gets.chomp == "t"') {|i,o,e,t|
|
27
|
+
i.puts 'f'
|
28
|
+
assert_equal(false, t.value.success?)
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_stdout
|
33
|
+
Open3.popen3(RUBY, '-e', 'STDOUT.print "foo"') {|i,o,e,t|
|
34
|
+
assert_equal("foo", o.read)
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_stderr
|
39
|
+
Open3.popen3(RUBY, '-e', 'STDERR.print "bar"') {|i,o,e,t|
|
40
|
+
assert_equal("bar", e.read)
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_block
|
45
|
+
r = Open3.popen3(RUBY, '-e', 'STDOUT.print STDIN.read') {|i,o,e,t|
|
46
|
+
i.print "baz"
|
47
|
+
i.close
|
48
|
+
assert_equal("baz", o.read)
|
49
|
+
"qux"
|
50
|
+
}
|
51
|
+
assert_equal("qux", r)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_noblock
|
55
|
+
i,o,e,t = Open3.popen3(RUBY, '-e', 'STDOUT.print STDIN.read')
|
56
|
+
i.print "baz"
|
57
|
+
i.close
|
58
|
+
assert_equal("baz", o.read)
|
59
|
+
ensure
|
60
|
+
i.close
|
61
|
+
o.close
|
62
|
+
e.close
|
63
|
+
t.join
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_commandline
|
67
|
+
commandline = "echo quux\n"
|
68
|
+
Open3.popen3(commandline) {|i,o,e,t|
|
69
|
+
assert_equal("quux\n", o.read)
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_pid
|
74
|
+
Open3.popen3(RUBY, '-e', 'print $$') {|i,o,e,t|
|
75
|
+
pid = o.read.to_i
|
76
|
+
# assert_equal(pid, t[:pid])
|
77
|
+
assert_equal(pid, t.pid)
|
78
|
+
}
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_env
|
82
|
+
Open3.popen3({'A' => 'B', 'C' => 'D'}, RUBY, '-e' 'p ENV["A"]') do |i, out, err, thr|
|
83
|
+
output = out.read
|
84
|
+
assert_equal("\"B\"\n", output)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_numeric_file_descriptor2
|
89
|
+
with_pipe {|r, w|
|
90
|
+
Open3.popen2(RUBY, '-e', 'STDERR.puts "foo"', 2 => w) {|i,o,t|
|
91
|
+
assert_equal("foo\n", r.gets)
|
92
|
+
}
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_numeric_file_descriptor3
|
97
|
+
omit "passing FDs bigger than 2 is not supported on Windows" if /mswin|mingw/ =~ RbConfig::CONFIG['host_os']
|
98
|
+
with_pipe {|r, w|
|
99
|
+
Open3.popen3(RUBY, '-e', 'IO.open(3).puts "foo"', 3 => w) {|i,o,e,t|
|
100
|
+
assert_equal("foo\n", r.gets, "[GH-808] [ruby-core:67347] [Bug #10699]")
|
101
|
+
}
|
102
|
+
}
|
103
|
+
end
|
104
|
+
|
105
|
+
def with_pipe
|
106
|
+
r, w = IO.pipe
|
107
|
+
yield r, w
|
108
|
+
ensure
|
109
|
+
r.close
|
110
|
+
w.close
|
111
|
+
end
|
112
|
+
|
113
|
+
def with_reopen(io, arg)
|
114
|
+
old = io.dup
|
115
|
+
io.reopen(arg)
|
116
|
+
yield old
|
117
|
+
ensure
|
118
|
+
io.reopen(old)
|
119
|
+
old.close
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_popen2
|
123
|
+
with_pipe {|r, w|
|
124
|
+
with_reopen(STDERR, w) {|old|
|
125
|
+
w.close
|
126
|
+
Open3.popen2(RUBY, '-e', 's=STDIN.read; STDOUT.print s+"o"; STDERR.print s+"e"') {|i,o,t|
|
127
|
+
assert_kind_of(Fiber, t)
|
128
|
+
i.print "z"
|
129
|
+
i.close
|
130
|
+
STDERR.reopen(old)
|
131
|
+
assert_equal("zo", o.read)
|
132
|
+
assert_equal("ze", r.read)
|
133
|
+
}
|
134
|
+
}
|
135
|
+
}
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_popen2e
|
139
|
+
with_pipe {|r, w|
|
140
|
+
with_reopen(STDERR, w) {|old|
|
141
|
+
w.close
|
142
|
+
Open3.popen2e(RUBY, '-e', 's=STDIN.read; STDOUT.print s+"o"; STDOUT.flush; STDERR.print s+"e"') {|i,o,t|
|
143
|
+
assert_kind_of(Fiber, t)
|
144
|
+
i.print "y"
|
145
|
+
i.close
|
146
|
+
STDERR.reopen(old)
|
147
|
+
assert_equal("yoye", o.read)
|
148
|
+
assert_equal("", r.read)
|
149
|
+
}
|
150
|
+
}
|
151
|
+
}
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_popen2e_noblock
|
155
|
+
i, o, t = Open3.popen2e(RUBY, '-e', 'STDOUT.print STDIN.read')
|
156
|
+
i.print "baz"
|
157
|
+
i.close
|
158
|
+
assert_equal("baz", o.read)
|
159
|
+
ensure
|
160
|
+
i.close
|
161
|
+
o.close
|
162
|
+
t.join
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_capture3
|
166
|
+
o, e, s = Open3.capture3(RUBY, '-e', 'i=STDIN.read; print i+"o"; STDOUT.flush; STDERR.print i+"e"', :stdin_data=>"i")
|
167
|
+
assert_equal("io", o)
|
168
|
+
assert_equal("ie", e)
|
169
|
+
assert(s.success?)
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_capture3_stdin_data_io
|
173
|
+
IO.pipe {|r, w|
|
174
|
+
w.write "i"
|
175
|
+
w.close
|
176
|
+
o, e, s = Open3.capture3(RUBY, '-e', 'i=STDIN.read; print i+"o"; STDOUT.flush; STDERR.print i+"e"', :stdin_data=>r)
|
177
|
+
assert_equal("io", o)
|
178
|
+
assert_equal("ie", e)
|
179
|
+
assert(s.success?)
|
180
|
+
}
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_capture3_flip
|
184
|
+
o, e, s = Open3.capture3(RUBY, '-e', 'STDOUT.sync=true; 1000.times { print "o"*1000; STDERR.print "e"*1000 }')
|
185
|
+
assert_equal("o"*1000000, o)
|
186
|
+
assert_equal("e"*1000000, e)
|
187
|
+
assert(s.success?)
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_capture2
|
191
|
+
o, s = Open3.capture2(RUBY, '-e', 'i=STDIN.read; print i+"o"', :stdin_data=>"i")
|
192
|
+
assert_equal("io", o)
|
193
|
+
assert(s.success?)
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_capture2_stdin_data_io
|
197
|
+
IO.pipe {|r, w|
|
198
|
+
w.write "i"
|
199
|
+
w.close
|
200
|
+
o, s = Open3.capture2(RUBY, '-e', 'i=STDIN.read; print i+"o"', :stdin_data=>r)
|
201
|
+
assert_equal("io", o)
|
202
|
+
assert(s.success?)
|
203
|
+
}
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_capture2e
|
207
|
+
oe, s = Open3.capture2e(RUBY, '-e', 'i=STDIN.read; print i+"o"; STDOUT.flush; STDERR.print i+"e"', :stdin_data=>"i")
|
208
|
+
assert_equal("ioie", oe)
|
209
|
+
assert(s.success?)
|
210
|
+
end
|
211
|
+
|
212
|
+
def test_capture2e_stdin_data_io
|
213
|
+
IO.pipe {|r, w|
|
214
|
+
w.write "i"
|
215
|
+
w.close
|
216
|
+
oe, s = Open3.capture2e(RUBY, '-e', 'i=STDIN.read; print i+"o"; STDOUT.flush; STDERR.print i+"e"', :stdin_data=>r)
|
217
|
+
assert_equal("ioie", oe)
|
218
|
+
assert(s.success?)
|
219
|
+
}
|
220
|
+
end
|
221
|
+
|
222
|
+
def test_capture3_stdin_data
|
223
|
+
o, e, s = Open3.capture3(RUBY, '-e', '', :stdin_data=>"z"*(1024*1024))
|
224
|
+
assert_equal("", o)
|
225
|
+
assert_equal("", e)
|
226
|
+
assert(s.success?)
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_capture2_stdin_data
|
230
|
+
o, s = Open3.capture2(RUBY, '-e', '', :stdin_data=>"z"*(1024*1024))
|
231
|
+
assert_equal("", o)
|
232
|
+
assert(s.success?)
|
233
|
+
end
|
234
|
+
|
235
|
+
def test_capture2e_stdin_data
|
236
|
+
oe, s = Open3.capture2e(RUBY, '-e', '', :stdin_data=>"z"*(1024*1024))
|
237
|
+
assert_equal("", oe)
|
238
|
+
assert(s.success?)
|
239
|
+
end
|
240
|
+
|
241
|
+
def test_pipeline_rw
|
242
|
+
Open3.pipeline_rw([RUBY, '-e', 'print STDIN.read + "1"'],
|
243
|
+
[RUBY, '-e', 'print STDIN.read + "2"']) {|i,o,ts|
|
244
|
+
assert_kind_of(IO, i)
|
245
|
+
assert_kind_of(IO, o)
|
246
|
+
assert_kind_of(Array, ts)
|
247
|
+
assert_equal(2, ts.length)
|
248
|
+
ts.each {|t| assert_kind_of(Fiber, t) }
|
249
|
+
i.print "0"
|
250
|
+
i.close
|
251
|
+
assert_equal("012", o.read)
|
252
|
+
ts.each {|t|
|
253
|
+
assert(t.value.success?)
|
254
|
+
}
|
255
|
+
}
|
256
|
+
end
|
257
|
+
|
258
|
+
def test_pipeline_r
|
259
|
+
Open3.pipeline_r([RUBY, '-e', 'print "1"'],
|
260
|
+
[RUBY, '-e', 'print STDIN.read + "2"']) {|o,ts|
|
261
|
+
assert_kind_of(IO, o)
|
262
|
+
assert_kind_of(Array, ts)
|
263
|
+
assert_equal(2, ts.length)
|
264
|
+
ts.each {|t| assert_kind_of(Fiber, t) }
|
265
|
+
assert_equal("12", o.read)
|
266
|
+
ts.each {|t|
|
267
|
+
assert(t.value.success?)
|
268
|
+
}
|
269
|
+
}
|
270
|
+
end
|
271
|
+
|
272
|
+
def test_pipeline_w
|
273
|
+
command = [RUBY, '-e', 's=STDIN.read; print s[1..-1]; exit s[0] == ?t']
|
274
|
+
str = 'ttftff'
|
275
|
+
Open3.pipeline_w(*[command]*str.length) {|i,ts|
|
276
|
+
assert_kind_of(IO, i)
|
277
|
+
assert_kind_of(Array, ts)
|
278
|
+
assert_equal(str.length, ts.length)
|
279
|
+
ts.each {|t| assert_kind_of(Fiber, t) }
|
280
|
+
i.print str
|
281
|
+
i.close
|
282
|
+
ts.each_with_index {|t, ii|
|
283
|
+
assert_equal(str[ii] == ?t, t.value.success?)
|
284
|
+
}
|
285
|
+
}
|
286
|
+
end
|
287
|
+
|
288
|
+
def test_pipeline_start
|
289
|
+
command = [RUBY, '-e', 's=STDIN.read; print s[1..-1]; exit s[0] == ?t']
|
290
|
+
str = 'ttftff'
|
291
|
+
Open3.pipeline_start([RUBY, '-e', 'print ARGV[0]', str],
|
292
|
+
*([command]*str.length)) {|ts|
|
293
|
+
assert_kind_of(Array, ts)
|
294
|
+
assert_equal(str.length+1, ts.length)
|
295
|
+
ts.each {|t| assert_kind_of(Fiber, t) }
|
296
|
+
ts.each_with_index {|t, i|
|
297
|
+
if i == 0
|
298
|
+
assert(t.value.success?)
|
299
|
+
else
|
300
|
+
assert_equal(str[i-1] == ?t, t.value.success?)
|
301
|
+
end
|
302
|
+
}
|
303
|
+
}
|
304
|
+
end
|
305
|
+
|
306
|
+
def test_pipeline_start_noblock
|
307
|
+
ts = Open3.pipeline_start([RUBY, '-e', ''])
|
308
|
+
assert_kind_of(Array, ts)
|
309
|
+
assert_equal(1, ts.length)
|
310
|
+
ts.each {|t| assert_kind_of(Fiber, t) }
|
311
|
+
t = ts[0]
|
312
|
+
assert(t.value.success?)
|
313
|
+
end
|
314
|
+
|
315
|
+
def test_pipeline
|
316
|
+
command = [RUBY, '-e', 's=STDIN.read; print s[1..-1]; exit s[0] == ?t']
|
317
|
+
str = 'ttftff'
|
318
|
+
ss = Open3.pipeline([RUBY, '-e', 'print ARGV[0]', str],
|
319
|
+
*([command]*str.length))
|
320
|
+
assert_kind_of(Array, ss)
|
321
|
+
assert_equal(str.length+1, ss.length)
|
322
|
+
ss.each {|s| assert_kind_of(Process::Status, s) }
|
323
|
+
ss.each_with_index {|s, i|
|
324
|
+
if i == 0
|
325
|
+
assert(s.success?)
|
326
|
+
else
|
327
|
+
assert_equal(str[i-1] == ?t, s.success?)
|
328
|
+
end
|
329
|
+
}
|
330
|
+
end
|
331
|
+
|
332
|
+
def test_integer_and_symbol_key
|
333
|
+
command = [RUBY, '-e', 'puts "test_integer_and_symbol_key"']
|
334
|
+
out, status = Open3.capture2(*command, :chdir => '.', 2 => IO::NULL)
|
335
|
+
assert_equal("test_integer_and_symbol_key\n", out)
|
336
|
+
assert_predicate(status, :success?)
|
337
|
+
end
|
338
|
+
end
|
data/test/test_signal.rb
CHANGED
@@ -4,10 +4,14 @@ require_relative 'helper'
|
|
4
4
|
|
5
5
|
class SignalTrapTest < Minitest::Test
|
6
6
|
def test_signal_handler_trace
|
7
|
+
skip # tracing system to be overhauled
|
8
|
+
|
7
9
|
if Thread.current.backend.kind != :io_uring
|
8
10
|
skip "Skipping signal handler trace because Backend_close on libev behaves differently"
|
9
11
|
end
|
10
12
|
|
13
|
+
skip
|
14
|
+
|
11
15
|
i1, o1 = IO.pipe
|
12
16
|
i2, o2 = IO.pipe
|
13
17
|
pid = Process.pid
|
@@ -86,10 +90,10 @@ class SignalTrapTest < Minitest::Test
|
|
86
90
|
def test_signal_exception_handling
|
87
91
|
i, o = IO.pipe
|
88
92
|
pid = Polyphony.fork do
|
89
|
-
i.close
|
90
93
|
sleep 5
|
91
94
|
rescue ::Interrupt => e
|
92
95
|
o.puts "3-interrupt"
|
96
|
+
o.flush
|
93
97
|
ensure
|
94
98
|
o.close
|
95
99
|
end
|
data/test/test_socket.rb
CHANGED
@@ -41,9 +41,12 @@ class TCPSocketTest < MiniTest::Test
|
|
41
41
|
client = TCPSocket.open('ipinfo.io', 80)
|
42
42
|
client.write("GET / HTTP/1.0\r\nHost: ipinfo.io\r\n\r\n")
|
43
43
|
result = nil
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
3.times do
|
45
|
+
move_on_after(3) {
|
46
|
+
result = client.read
|
47
|
+
}
|
48
|
+
break if result
|
49
|
+
end
|
47
50
|
assert result =~ /HTTP\/1.0 200 OK/
|
48
51
|
end
|
49
52
|
|
data/test/test_sync.rb
CHANGED
@@ -155,3 +155,49 @@ class MutexTest < MiniTest::Test
|
|
155
155
|
assert_equal true, r
|
156
156
|
end
|
157
157
|
end
|
158
|
+
|
159
|
+
class MonitorTest < MiniTest::Test
|
160
|
+
def test_monitor
|
161
|
+
m = Monitor.new
|
162
|
+
|
163
|
+
assert_kind_of Polyphony::Monitor, m
|
164
|
+
end
|
165
|
+
|
166
|
+
def safe_check_owner(m)
|
167
|
+
m.mon_check_owner
|
168
|
+
true
|
169
|
+
rescue ThreadError
|
170
|
+
false
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_monitor_mon_check_owner
|
174
|
+
m = Monitor.new
|
175
|
+
|
176
|
+
assert_equal false, safe_check_owner(m)
|
177
|
+
|
178
|
+
m.enter
|
179
|
+
assert_equal true, safe_check_owner(m)
|
180
|
+
|
181
|
+
spin do
|
182
|
+
assert_equal false, safe_check_owner(m)
|
183
|
+
end.join
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_monitor_reentrancy
|
187
|
+
m = Monitor.new
|
188
|
+
|
189
|
+
assert_equal false, safe_check_owner(m)
|
190
|
+
|
191
|
+
m.enter
|
192
|
+
assert_equal true, safe_check_owner(m)
|
193
|
+
|
194
|
+
m.enter
|
195
|
+
assert_equal true, safe_check_owner(m)
|
196
|
+
|
197
|
+
m.exit
|
198
|
+
assert_equal true, safe_check_owner(m)
|
199
|
+
|
200
|
+
m.exit
|
201
|
+
assert_equal false, safe_check_owner(m)
|
202
|
+
end
|
203
|
+
end
|
data/test/test_thread.rb
CHANGED
@@ -60,7 +60,7 @@ class ThreadTest < MiniTest::Test
|
|
60
60
|
def test_thread_await_alias_method
|
61
61
|
buffer = []
|
62
62
|
spin { (1..3).each { |i| snooze; buffer << i } }
|
63
|
-
t = Thread.new { sleep 0.
|
63
|
+
t = Thread.new { sleep 0.1; buffer << 4; :foo }
|
64
64
|
r = t.await
|
65
65
|
t = nil
|
66
66
|
|
@@ -241,4 +241,13 @@ class ThreadTest < MiniTest::Test
|
|
241
241
|
t.join
|
242
242
|
assert_equal [1, 2, 3], buf
|
243
243
|
end
|
244
|
+
|
245
|
+
def test_value
|
246
|
+
t = Thread.new { sleep 0.01; :foo }
|
247
|
+
assert_equal :foo, t.value
|
248
|
+
|
249
|
+
t = Thread.new { sleep 0.01; raise 'foo' }
|
250
|
+
assert_raises { t.value }
|
251
|
+
assert !t.alive?
|
252
|
+
end
|
244
253
|
end
|
data/test/test_thread_pool.rb
CHANGED
data/test/test_throttler.rb
CHANGED
@@ -30,7 +30,7 @@ class ThrottlerTest < MiniTest::Test
|
|
30
30
|
f = spin { loop { t.process { buffer << 1 } } }
|
31
31
|
sleep 0.02
|
32
32
|
f.stop
|
33
|
-
assert_in_range
|
33
|
+
assert_in_range 1..4, buffer.size if IS_LINUX
|
34
34
|
end
|
35
35
|
|
36
36
|
def test_throttler_with_invalid_argument
|
data/test/test_timer.rb
CHANGED
@@ -4,11 +4,13 @@ require_relative 'helper'
|
|
4
4
|
|
5
5
|
class TimerMoveOnAfterTest < MiniTest::Test
|
6
6
|
def setup
|
7
|
+
super
|
7
8
|
@timer = Polyphony::Timer.new(resolution: 0.01)
|
8
9
|
end
|
9
10
|
|
10
11
|
def teardown
|
11
12
|
@timer.stop
|
13
|
+
super
|
12
14
|
end
|
13
15
|
|
14
16
|
def test_timer_move_on_after
|
@@ -56,11 +58,13 @@ end
|
|
56
58
|
|
57
59
|
class TimerCancelAfterTest < MiniTest::Test
|
58
60
|
def setup
|
61
|
+
super
|
59
62
|
@timer = Polyphony::Timer.new(resolution: 0.01)
|
60
63
|
end
|
61
64
|
|
62
65
|
def teardown
|
63
66
|
@timer.stop
|
67
|
+
super
|
64
68
|
end
|
65
69
|
|
66
70
|
def test_timer_cancel_after
|
@@ -134,21 +138,23 @@ end
|
|
134
138
|
|
135
139
|
class TimerMiscTest < MiniTest::Test
|
136
140
|
def setup
|
141
|
+
super
|
137
142
|
@timer = Polyphony::Timer.new(resolution: 0.001)
|
138
143
|
sleep 0
|
139
144
|
end
|
140
145
|
|
141
146
|
def teardown
|
142
147
|
@timer.stop
|
148
|
+
super
|
143
149
|
end
|
144
150
|
|
145
151
|
def test_timer_after
|
146
152
|
buffer = []
|
147
|
-
f = @timer.after(0.
|
153
|
+
f = @timer.after(0.1) { buffer << 2 }
|
148
154
|
assert_kind_of Fiber, f
|
149
155
|
snooze
|
150
156
|
assert_equal [], buffer
|
151
|
-
sleep 0.
|
157
|
+
sleep 0.2
|
152
158
|
assert_equal [2], buffer
|
153
159
|
end
|
154
160
|
|
data/test/test_trace.rb
CHANGED
@@ -85,6 +85,13 @@ jobs:
|
|
85
85
|
cc: mips-linux-gnu-gcc
|
86
86
|
cxx: mips-linux-gnu-g++
|
87
87
|
|
88
|
+
# hppa
|
89
|
+
- arch: hppa
|
90
|
+
cc_pkg: gcc-hppa-linux-gnu
|
91
|
+
cxx_pkg: g++-hppa-linux-gnu
|
92
|
+
cc: hppa-linux-gnu-gcc
|
93
|
+
cxx: hppa-linux-gnu-g++
|
94
|
+
|
88
95
|
env:
|
89
96
|
FLAGS: -g -O3 -Wall -Wextra -Werror -Wno-sign-compare ${{matrix.extra_flags}}
|
90
97
|
|
@@ -99,6 +106,7 @@ jobs:
|
|
99
106
|
run: |
|
100
107
|
if [[ "${{matrix.cc_pkg}}" == "clang" ]]; then \
|
101
108
|
wget https://apt.llvm.org/llvm.sh -O /tmp/llvm.sh; \
|
109
|
+
sudo apt-get purge --auto-remove llvm python3-lldb-14 llvm-14 -y; \
|
102
110
|
sudo bash /tmp/llvm.sh 17; \
|
103
111
|
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-17 400; \
|
104
112
|
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-17 400; \
|
data/vendor/liburing/.gitignore
CHANGED
data/vendor/liburing/CHANGELOG
CHANGED
@@ -8,6 +8,14 @@ liburing-2.4 release
|
|
8
8
|
- CONFIG_NOLIBC is always enabled on x86-64, x86, and aarch64.
|
9
9
|
- Add support for IORING_REGISTER_USE_REGISTERED_RING and use if available.
|
10
10
|
- Add io_uring_close_ring_fd() function.
|
11
|
+
- Add io_uring_prep_msg_ring_fd_alloc function.
|
12
|
+
- Add io_uring_free_buf_ring() and io_uring_setup_buf_ring() functions.
|
13
|
+
- Ensure that io_uring_prep_accept_direct(), io_uring_prep_openat_direct(),
|
14
|
+
io_uring_prep_openat2_direct(), io_uring_prep_msg_ring_fd(), and
|
15
|
+
io_uring_prep_socket_direct() factor in being called with
|
16
|
+
IORING_FILE_INDEX_ALLOC for allocating a direct descriptor.
|
17
|
+
- Add io_uring_prep_sendto() function.
|
18
|
+
- Add io_uring_prep_cmd_sock() function.
|
11
19
|
|
12
20
|
liburing-2.3 release
|
13
21
|
|
data/vendor/liburing/configure
CHANGED
@@ -5,22 +5,6 @@ set -e
|
|
5
5
|
cc=${CC:-gcc}
|
6
6
|
cxx=${CXX:-g++}
|
7
7
|
|
8
|
-
#
|
9
|
-
# TODO(ammarfaizi2): Remove this notice and `--nolibc` option.
|
10
|
-
#
|
11
|
-
nolibc_deprecated() {
|
12
|
-
echo "";
|
13
|
-
echo "=================================================================";
|
14
|
-
echo "";
|
15
|
-
echo " --nolibc option is deprecated and has no effect.";
|
16
|
-
echo " It will be removed in a future liburing release.";
|
17
|
-
echo "";
|
18
|
-
echo " liburing on x86-64, x86 (32-bit) and aarch64 always use CONFIG_NOLIBC.";
|
19
|
-
echo "";
|
20
|
-
echo "=================================================================";
|
21
|
-
echo "";
|
22
|
-
}
|
23
|
-
|
24
8
|
for opt do
|
25
9
|
optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)' || true)
|
26
10
|
case "$opt" in
|
@@ -42,7 +26,7 @@ for opt do
|
|
42
26
|
;;
|
43
27
|
--cxx=*) cxx="$optarg"
|
44
28
|
;;
|
45
|
-
--
|
29
|
+
--use-libc) use_libc=yes
|
46
30
|
;;
|
47
31
|
*)
|
48
32
|
echo "ERROR: unknown option $opt"
|
@@ -91,7 +75,7 @@ Options: [defaults in brackets after descriptions]
|
|
91
75
|
--datadir=PATH install shared data in PATH [$datadir]
|
92
76
|
--cc=CMD use CMD as the C compiler
|
93
77
|
--cxx=CMD use CMD as the C++ compiler
|
94
|
-
--
|
78
|
+
--use-libc use libc for liburing (useful for hardening)
|
95
79
|
EOF
|
96
80
|
exit 0
|
97
81
|
fi
|
@@ -401,10 +385,13 @@ fi
|
|
401
385
|
print_config "NVMe uring command support" "$nvme_uring_cmd"
|
402
386
|
|
403
387
|
#############################################################################
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
388
|
+
liburing_nolibc="no"
|
389
|
+
if test "$use_libc" != "yes"; then
|
390
|
+
|
391
|
+
#
|
392
|
+
# Currently, CONFIG_NOLIBC only supports x86-64, x86 (32-bit) and aarch64.
|
393
|
+
#
|
394
|
+
cat > $TMPC << EOF
|
408
395
|
int main(void){
|
409
396
|
#if defined(__x86_64__) || defined(__i386__) || defined(__aarch64__)
|
410
397
|
return 0;
|
@@ -413,10 +400,13 @@ int main(void){
|
|
413
400
|
#endif
|
414
401
|
}
|
415
402
|
EOF
|
416
|
-
|
417
|
-
|
403
|
+
|
404
|
+
if compile_prog "" "" "nolibc"; then
|
405
|
+
liburing_nolibc="yes"
|
406
|
+
fi
|
418
407
|
fi
|
419
|
-
|
408
|
+
|
409
|
+
print_config "nolibc" "$liburing_nolibc";
|
420
410
|
#############################################################################
|
421
411
|
|
422
412
|
####################################################
|
@@ -478,6 +468,8 @@ echo "CXX=$cxx" >> $config_host_mak
|
|
478
468
|
print_config "CXX" "$cxx"
|
479
469
|
|
480
470
|
# generate io_uring_version.h
|
471
|
+
# Reset MAKEFLAGS
|
472
|
+
MAKEFLAGS=
|
481
473
|
MAKE_PRINT_VARS="include Makefile.common\nprint-%: ; @echo \$(\$*)\n"
|
482
474
|
VERSION_MAJOR=$(env echo -e "$MAKE_PRINT_VARS" | make -s --no-print-directory -f - print-VERSION_MAJOR)
|
483
475
|
VERSION_MINOR=$(env echo -e "$MAKE_PRINT_VARS" | make -s --no-print-directory -f - print-VERSION_MINOR)
|
@@ -5,12 +5,13 @@
|
|
5
5
|
|
6
6
|
DEB_BUILD_MAINT_OPTIONS = hardening=+bindnow
|
7
7
|
DEB_CFLAGS_MAINT_PREPEND = -Wall
|
8
|
+
DEB_BUILD_OPTIONS += nocheck
|
8
9
|
|
9
10
|
include /usr/share/dpkg/default.mk
|
10
11
|
include /usr/share/dpkg/buildtools.mk
|
11
12
|
|
12
13
|
%:
|
13
|
-
dh $@
|
14
|
+
dh $@ --parallel
|
14
15
|
|
15
16
|
override_dh_auto_configure:
|
16
17
|
./configure \
|