mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00

This patch introduce M:N thread scheduler for Ractor system. In general, M:N thread scheduler employs N native threads (OS threads) to manage M user-level threads (Ruby threads in this case). On the Ruby interpreter, 1 native thread is provided for 1 Ractor and all Ruby threads are managed by the native thread. From Ruby 1.9, the interpreter uses 1:1 thread scheduler which means 1 Ruby thread has 1 native thread. M:N scheduler change this strategy. Because of compatibility issue (and stableness issue of the implementation) main Ractor doesn't use M:N scheduler on default. On the other words, threads on the main Ractor will be managed with 1:1 thread scheduler. There are additional settings by environment variables: `RUBY_MN_THREADS=1` enables M:N thread scheduler on the main ractor. Note that non-main ractors use the M:N scheduler without this configuration. With this configuration, single ractor applications run threads on M:1 thread scheduler (green threads, user-level threads). `RUBY_MAX_CPU=n` specifies maximum number of native threads for M:N scheduler (default: 8). This patch will be reverted soon if non-easy issues are found. [Bug #19842]
18 lines
770 B
Ruby
18 lines
770 B
Ruby
# frozen_string_literal: false
|
|
exclude(/_stack_size$/, 'often too expensive')
|
|
if /freebsd13/ =~ RUBY_PLATFORM
|
|
# http://rubyci.s3.amazonaws.com/freebsd13/ruby-master/log/20220216T143001Z.fail.html.gz
|
|
#
|
|
# 1) Error:
|
|
# TestThread#test_signal_at_join:
|
|
# Timeout::Error: execution of assert_separately expired timeout (120 sec)
|
|
# pid 30743 killed by SIGABRT (signal 6) (core dumped)
|
|
# |
|
|
#
|
|
# /usr/home/chkbuild/chkbuild/tmp/build/20220216T143001Z/ruby/test/ruby/test_thread.rb:1390:in `test_signal_at_join'
|
|
exclude(:test_signal_at_join, 'gets stuck somewhere')
|
|
end
|
|
if /mswin/ =~ RUBY_PLATFORM && ENV.key?('GITHUB_ACTIONS')
|
|
# to avoid "`failed to allocate memory (NoMemoryError)" error
|
|
exclude(:test_thread_interrupt_for_killed_thread, 'TODO')
|
|
end
|