1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test
normal 708bfd2115 thread_pthread: remove timer-thread by restructuring GVL
To reduce resource use and reduce CI failure; remove
timer-thread.  Single-threaded Ruby processes (including forked
children) will never see extra thread overhead.  This prevents
glibc and jemalloc from going into multi-threaded mode and
initializing locks or causing fragmentation via arena explosion.

The GVL is implements its own wait-queue as a ccan/list to
permit controlling wakeup order.  Timeslice under contention is
handled by a designated timer thread (similar to choosing a
"patrol_thread" for current deadlock checking).

There is only one self-pipe, now, as wakeups for timeslice are
done independently using condition variables.  This reduces FD
pressure slightly.

Signal handling is handled directly by a Ruby Thread (instead
of timer-thread) by exposing signal self-pipe to callers of
rb_thread_fd_select, native_sleep, rb_wait_for_single_fd, etc...
Acquiring, using, and releasing the self-pipe is exposed via 4
new internal functions:

1) rb_sigwait_fd_get - exclusively acquire timer_thread_pipe.normal[0]

2) rb_sigwait_fd_sleep - sleep and wait for signal (and no other FDs)

3) rb_sigwait_fd_put - release acquired result from rb_sigwait_fd_get

4) rb_sigwait_fd_migrate - migrate signal handling to another thread
                           after calling rb_sigwait_fd_put.

rb_sigwait_fd_migrate is necessary for waitpid callers because
only one thread can wait on self-pipe at a time, otherwise a
deadlock will occur if threads fight over the self-pipe.

TRAP_INTERRUPT_MASK is now set for the main thread directly in
signal handler via rb_thread_wakeup_timer_thread.

Originally, I wanted to use POSIX timers
(timer_create/timer_settime) for this.  Unfortunately, this
proved unfeasible as Mutex#sleep resumes on spurious wakeups and
test/thread/test_cv.rb::test_condvar_timed_wait failed.  Using
pthread_sigmask to mask out SIGVTALRM fixed that test,  but
test/fiddle/test_function.rb::test_nogvl_poll proved there'd be
some unavoidable (and frequent) incompatibilities from that
approach.

Finally, this allows us to drop thread_destruct_lock and
interrupt current ec directly.

We don't need to rely on vm->thread_destruct_lock or a coherent
vm->running_thread on any platform.  Separate timer-thread for
time slice and signal handling is relegated to thread_win32.c,
now.

[ruby-core:88088] [Misc #14937]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64107 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-07-29 20:47:33 +00:00
..
-ext- test/-ext-/gvl/test_last_thread.rb: skip under MJIT 2018-07-20 22:30:39 +00:00
base64
benchmark
bigdecimal
cgi Revert "ext/cgi/escape: preserve String subclass in result" 2018-05-03 01:24:09 +00:00
coverage
csv Merge csv-1.0.2 from upstream. 2018-05-09 04:39:16 +00:00
date test/date/test_date_base.rb: removed 2018-04-17 08:18:56 +00:00
dbm
digest
drb
dtrace test/dtrace/helper.rb: support systemtap in dtrace tests 2018-06-05 21:19:50 +00:00
erb
etc
excludes
fiddle test_function.rb: fix messages 2018-07-28 13:06:43 +00:00
fileutils Retry to merge fileutils-1.1.0. 2018-05-15 05:53:18 +00:00
gdbm Use assert(false) for the path that is expected unreachable 2018-04-17 08:18:57 +00:00
io test/io/console/test_io_console.rb: fix for systems where PTY is not defined 2018-06-06 01:12:23 +00:00
irb irb.rb: update _ 2018-05-12 09:13:45 +00:00
json
lib test_jit.rb: test unload_units 2018-07-27 05:52:01 +00:00
logger
matrix
minitest use https:// instead of http:// 2018-07-28 10:00:27 +00:00
misc
mkmf
monitor
net increase body size 2018-06-25 12:11:31 +00:00
nkf
objspace
open-uri
openssl openssl: merge changes in v2.1.1 2018-05-12 07:33:53 +00:00
optparse optparse: Suppress warnings 2018-05-06 09:53:33 +00:00
ostruct
pathname
psych Merge Pysch 3.0.3.pre1. 2018-04-28 01:47:58 +00:00
rdoc Merge rdoc-6.0.4 from upstream. 2018-05-08 02:07:53 +00:00
readline
resolv
rexml rexml: disable XPath 1.0 compatible "#{ELEMENT_NAME}" processing by default 2018-04-28 01:36:18 +00:00
rinda
ripper
rss rss: Add option Hash support to RSS::Parser.parse 2018-05-12 09:06:00 +00:00
ruby thread_pthread: remove timer-thread by restructuring GVL 2018-07-29 20:47:33 +00:00
rubygems Skip more rubygems tests when openssl is missing 2018-07-04 12:45:46 +00:00
scanf
sdbm
shell Promote Shell library to default gems. 2018-07-20 02:24:59 +00:00
socket test/socket/test_socket.rb (test_timestamp): retry send 2018-07-07 05:34:03 +00:00
stringio
strscan
syslog
testunit Use &. instead of modifier if 2018-06-10 03:10:13 +00:00
thread test/thread/test_cv.rb: test CV usability inside forked child 2018-04-30 23:53:55 +00:00
uri http_proxy setting should respect both parent domain and subdomain 2018-05-17 07:40:01 +00:00
webrick Add missing escape 2018-07-26 12:47:01 +00:00
win32ole
yaml
zlib test/zlib/test_zlib.rb (test_path): enable the accidentally-disabled assertion 2018-04-17 06:38:08 +00:00
colors
runner.rb
test_abbrev.rb
test_cmath.rb
test_delegate.rb
test_extlibs.rb
test_find.rb
test_forwardable.rb
test_ipaddr.rb
test_mutex_m.rb
test_observer.rb
test_open3.rb Remove needless closed? 2018-06-17 15:42:35 +00:00
test_pp.rb
test_prettyprint.rb
test_prime.rb test/test_prime.rb: add testcases of prime library 2018-06-24 09:31:06 +00:00
test_pstore.rb
test_pty.rb Remove needless lines 2018-06-12 14:36:32 +00:00
test_rbconfig.rb
test_securerandom.rb
test_set.rb
test_shellwords.rb
test_singleton.rb
test_syslog.rb
test_tempfile.rb Failed to unlink before close on mswin 2018-07-11 13:00:56 +00:00
test_time.rb time.rb: yday support 2018-07-24 07:47:01 +00:00
test_timeout.rb
test_tmpdir.rb test/test_{tempfile,tmpdir}: get rid of leftover files 2018-07-11 08:33:37 +00:00
test_tracer.rb
test_tsort.rb
test_unicode_normalize.rb fix range check for Hangul jamo trailers in Unicode normalization 2018-07-28 09:44:33 +00:00
test_weakref.rb
test_win32api.rb