Make Ractor stdio belonging to the Ractor [Bug #17672]
Defer making ractor stdio until ractor started.
Before ractor started, created objects belong to the caller ractor
instead of the created ractor.
---
bootstraptest/test_ractor.rb | 12 ++++++++++++
ractor.c | 9 ---------
thread.c | 9 +++++++++
3 files changed, 21 insertions(+), 9 deletions(-)
dtoa.c: make compilable independently
Except for `-Dxmalloc=malloc -Dxfree=free`.
---
missing/dtoa.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
dtoa.c: constified
clang seems to locate never modified local data in the const
segment implicitly.
---
missing/dtoa.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
dtoa.c: make thread-safe by using atomic CAS
---
common.mk | 2 ++
missing/dtoa.c | 75 ++++++++++++++++++++++++++++++++++++++++++----------------
util.c | 1 +
3 files changed, 57 insertions(+), 21 deletions(-)
Fixed race in dtoa [Bug #17612]
Fixed the race condition when replacing `freelist` entry with its
chained next element. At acquiring an entry, hold the entry once
with the special value, then release by replacing it with the next
element again after acquired. If another thread is holding the
same entry at that time, spinning until the entry gets released.
Co-Authored-By: Koichi Sasada <ko1@atdot.net>
---
bootstraptest/test_ractor.rb | 11 +++++++++++
missing/dtoa.c | 13 ++++++++++---
2 files changed, 21 insertions(+), 3 deletions(-)
Ractor.allocate should not be allowed
Ractor.allocate and Ractor#dup should not be allowed like Thread.
[Bug #17642]
---
bootstraptest/test_ractor.rb | 18 ++++++++++++++++++
ractor.c | 2 ++
2 files changed, 20 insertions(+)
sync check_rvalue_consistency_force()
check_rvalue_consistency_force() uses is_pointer_to_heap() and
it should be synchronized with other ractors.
[Bug #17636]
---
gc.c | 149 ++++++++++++++++++++++++++++++++++---------------------------------
1 file changed, 76 insertions(+), 73 deletions(-)
remove unused decl
---
internal/vm.h | 6 ------
vm_args.c | 2 --
2 files changed, 8 deletions(-)
Check stack overflow in recursive glob_helper [Bug #17162]
---
dir.c | 2 ++
internal/vm.h | 1 +
vm_eval.c | 10 ++++++++++
3 files changed, 13 insertions(+)
global call-cache cache table for rb_funcall*
rb_funcall* (rb_funcall(), rb_funcallv(), ...) functions invokes
Ruby's method with given receiver. Ruby 2.7 introduced inline method
cache with static memory area. However, Ruby 3.0 reimplemented the
method cache data structures and the inline cache was removed.
Without inline cache, rb_funcall* searched methods everytime.
Most of cases per-Class Method Cache (pCMC) will be helped but
pCMC requires VM-wide locking and it hurts performance on
multi-Ractor execution, especially all Ractors calls methods
with rb_funcall*.
This patch introduced Global Call-Cache Cache Table (gccct) for
rb_funcall*. Call-Cache was introduced from Ruby 3.0 to manage
method cache entry atomically and gccct enables method-caching
without VM-wide locking. This table solves the performance issue
on multi-ractor execution.
[Bug #17497]
Ruby-level method invocation does not use gccct because it has
inline-method-cache and the table size is limited. Basically
rb_funcall* is not used frequently, so 1023 entries can be enough.
We will revisit the table size if it is not enough.
---
debug_counter.h | 3 +
vm.c | 12 +++
vm_callinfo.h | 12 ---
vm_core.h | 5 +
vm_eval.c | 288 ++++++++++++++++++++++++++++++++++++++++++--------------
vm_insnhelper.c | 11 ++-
vm_method.c | 14 ++-
7 files changed, 255 insertions(+), 90 deletions(-)
opt_equality_by_mid for rb_equal_opt
This patch improves the performance of sequential and parallel
execution of rb_equal() (and rb_eql()).
[Bug #17497]
rb_equal_opt (and rb_eql_opt) does not have own cd and it waste
a time to initialize cd. This patch introduces opt_equality_by_mid()
to check equality without cd.
Furthermore, current master uses "static" cd on rb_equal_opt
(and rb_eql_opt) and it hurts CPU caches on multi-thread execution.
Now they are gone so there are no bottleneck on parallel execution.
---
vm_insnhelper.c | 99 ++++++++++++++++++++++++++++++++++++---------------------
1 file changed, 63 insertions(+), 36 deletions(-)
This test was triggering require of `rubygems/core_ext/tcpsocket_init`
which overrides TCPSocket.initialize globally. Requires don't get
reset between test runs and it was making other test unreliable.
Fixes timeout of test on ruby master
fdfe5c9691
Assign TAG_NONE to ruby_tag_type instead of 0
---
eval.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Also `eclass` loop can raise in `rb_obj_is_kind_of`
---
eval.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Copy va_list of exception classes
The list is reused when an exception raised again after retrying
in the rescue procedure.
---
eval.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
sync GC rest if needed
marking requires a barrier (stop all Ractors) and gc_enter() does it.
However, it doesn't check rest event which can start marking.
[Bug #17599]
---
gc.c | 3 +++
1 file changed, 3 insertions(+)
clear RVALUE on NEWOBJ event.
NEWOBJ event is called without clearing RVALUE values (v1, v2, v3).
This patch clear them before NEWOBJ tracepoint internal hook.
[Bug #17599]
---
gc.c | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)
Fix backtrace to not skip frames with iseq without pc
Previously, frames with iseq but no pc were skipped (even before
the refactoring in 3b24b7914c).
Because the entire backtrace was procesed before the refactoring,
this was handled by using later frames instead. However, after
the refactoring, we need to handle those frames or they get
lost.
Keep two iteration counters when iterating, one for the desired
backtrace size (so we generate the desired number of frames), and
one for the actual backtrace size (so we don't process off the end
of the stack). When skipping over an iseq frame with no pc,
decrement the counter for the desired backtrace, so it will
continue to process the expected number of backtrace frames.
Fixes [Bug #17581]
---
test/ruby/test_backtrace.rb | 12 ++++++++++++
vm_backtrace.c | 16 +++++++++-------
2 files changed, 21 insertions(+), 7 deletions(-)
* [ruby/irb] Suppress error when File::ALT_SEPARATOR is nil
96accf3b95
* [ruby/irb] Suppress colorize on Windows tests
5be9354cf9
* [ruby/irb] The command "irb_info" should show RUBY_PLATFORM
39d1cd874f
* [ruby/irb] Fix inverse separator condition
33f933196f
* [ruby/reline] Return 1 when char width not found
This fixesruby/reline#261.
3cf1213014
* [ruby/reline] Avoid tripping over nil prompt
d4d9d3e3d4
* [ruby/reline] Move script files for yamatanooroti tests
03031b885d
* [ruby/reline] Add a test for suppressing crash when dynamic prompt returns empty
ref. https://github.com/ruby/reline/pull/262b98bc3c329
* [ruby/reline] We still need support new and legacy behavior.
Revert "Support for change in Windows-specific behavior at eol"
This reverts commit cad4de6ee841b43f3f0e441626f9415c3eda0f82.
646587fc2c
* [ruby/reline] check ENABLE_VIRTUAL_TERMINAL_PROCESSING flag and switch eof processing
3535676689
* [ruby/reline] Use UTF-8 only for width calc, rest uses original encoding
I confirmed that libvterm supports only which are UTF-8, US ASCII, UK, and
DEC graphics by reading source code, so can't test this patch by
yamatanoorogi gem through vterm gem for now.
This fixesruby/irb#190.
44596c0cc7
* [ruby/reline] fix Reline::Windows.getconsolemode buffer
use double quotes to properly convert the \000 escape sequence.
236dfe5683
* [ruby/irb] Version 1.3.4
ab9852ccc5
* [ruby/reline] Version 0.2.4
462f971bd3
Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
Co-authored-by: Eamonn Webster <eamonn.webster@gmail.com>
Co-authored-by: Yoshinao Muramatu <ysno@ac.auone-net.jp>
Co-authored-by: cremno <cremno@mail.ru>
only main thread can modify vm->ubf_async_safe
vm->ubf_async_safe is VM global resource and only main thread
can manipulate it.
[Bug #17482]
---
thread.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
unblock thread is only for main ractor.
other ractors should not have a unblock thread.
This patch fixes 6f727853ce.
---
thread.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
* [ruby/irb] Stub a screen size for tests
6663057083
* [ruby/irb] Support GitHub Actions
8e9e6c4037
* [ruby/irb] Stub a screen size for test_context
http://ci.rvm.jp/logfiles/brlog.trunk-random1.20210119-074232ea87592d4a
* [ruby/irb] Use a real screen size for pp by default
9b9300dec2
* [ruby/irb] Rescue Errno::EINVAL on IRB pp
20210119T070008Z.log.html.gz
is caused by:
/export/home/chkbuild/chkbuild-gcc/tmp/build/20210119T150010Z/ruby/lib/reline/ansi.rb:157:in `winsize': Invalid argument - <STDIN> (Errno::EINVAL)
from /export/home/chkbuild/chkbuild-gcc/tmp/build/20210119T150010Z/ruby/lib/reline/ansi.rb:157:in `get_screen_size'
from /export/home/chkbuild/chkbuild-gcc/tmp/build/20210119T150010Z/ruby/lib/reline.rb:168:in `get_screen_size'
from /export/home/chkbuild/chkbuild-gcc/tmp/build/20210119T150010Z/ruby/lib/forwardable.rb:238:in `get_screen_size'
from /export/home/chkbuild/chkbuild-gcc/tmp/build/20210119T150010Z/ruby/lib/irb/color_printer.rb:7:in `pp'
from -e:1:in `<main>'
1719514598
* [ruby/irb] Split test files for IRB::Color and IRB::ColorPrinter
d95e8daab3
* [ruby/irb] Undefine unused constants
eea9c16804
* [ruby/irb] Remove pp-specific stub from TestColor
because it was for TestColorPrinter
7569206fd4
* [ruby/irb] Delete a doodle-level memo comment...
fc3e1d9e0c
* [ruby/irb] Indent correctly with keyword "for" and "in"
47c83ea724
* [ruby/irb] Indent correctly with method calling with receiver
e7c68e74a0
* [ruby/irb] add `IRB::FileInputMethod.open` to ensure closing associated File
* tweak some methods not to raise exception after `#close`
* use it in `IRB::IrbLoader#{source_file,load_file}
ec2947acbd
* [ruby/irb] use `RubyLex::TerminateLineInput` appropriately [Bug #17564]
* using the appropriciate exception instead of `break` so that the session
can be continue after the `irb_source` and `irb_load` commands
* suppress extra new line due to one more `#prompt` call
bdefaa7cfd
* [ruby/irb] specify the `VERBOSE` to `false` and fix tests to fit
502c590925
* In test, need to pass a context to IRB::WorkSpace.new explicitly
* Fix absolute path predicate on Windows
A path starts with '/' is not an absolute path on Windows, because
of drive letter or UNC.
* [ruby/irb] follow up the actual line number
7aed8fe3b1
* [ruby/irb] Add info.rb to gemspec
adbba19adf
* [ruby/irb] Allow "measure" command to take block
20f1ca23e9
* [ruby/irb] Enable to reassign a new block with "measure" command
b444573aa2
* [ruby/reline] Cache pasting state in processing a key
Because it's too slow.
The rendering time in IRB has been reduced as follows:
start = Time.now
def each_top_level_statement
initialize_input
catch(:TERM_INPUT) do
loop do
begin
prompt
unless l = lex
throw :TERM_INPUT if @line == ''
else
@line_no += l.count("\n")
next if l == "\n"
@line.concat l
if @code_block_open or @ltype or @continue or @indent > 0
next
end
end
if @line != "\n"
@line.force_encoding(@io.encoding)
yield @line, @exp_line_no
end
break if @io.eof?
@line = ''
@exp_line_no = @line_no
@indent = 0
rescue TerminateLineInput
initialize_input
prompt
end
end
end
end
puts "Duration: #{Time.now - start} seconds"
0.22sec -> 0.14sec
b8b3dd52c0
* [ruby/reline] Initialize uninitialized variables in tests
25af4bb64b
* [ruby/reline] Remove an unused variable
123ea51166
* [ruby/reline] Scroll down when ^C is pressed
6877a7e3f5
* [ruby/reline] Show all lines higher than the screen when finished
On Unix-like OSes, logs prior to the screen are not editable. When the code
is higher than the screen, the code is only shown on the screen until input
is finished, but when it is finished, all lines are outputted.
8cd9132a39
* [ruby/reline] Handle past logs correctly when the code is higher than the screen
f197139b4a
* [ruby/reline] Update cursor info by inserting newline even if not in pasting
92d314f514
* [ruby/reline] Move cursor just after the last line when finished
ba06e4c480
* [ruby/reline] The vi_histedit supports multiline
This closesruby/reline#253.
f131f86d71
* [ruby/reline] Autowrap correctly when inserting chars in the middle of a line
ebaf37255f
* [ruby/reline] Terminate correctly in the middle of lines higher than the screen
e1d9240ada
* [ruby/irb] Version 1.3.3
4c87035b7c
* [ruby/reline] Version 0.2.3
b26c7d60c8
Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com>
Co-authored-by: Nobuhiro IMAI <nov@yo.rim.or.jp>
Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
Co-authored-by: ima1zumi <mariimaizumi5@gmail.com>
Removed YYUSE [Bug #17582]
Although it was used just to suppress an "unsed argument" warning
in the same manner as other bison-provided functions, it has been
dropped since Bision 3.7.5. And we always suppress that
warnings.
---
parse.y | 1 -
1 file changed, 1 deletion(-)
Mark pattern labels as unremoveable
Peephole optimization doesn't play well with find pattern at
least. The only case when a pattern matching could have
unreachable patterns is when we have lasgn/dasgn node, which
shouldn't happen in real-life.
Fixes https://bugs.ruby-lang.org/issues/17534
---
compile.c | 2 +-
test/ruby/test_pattern_matching.rb | 10 ++++++++++
2 files changed, 11 insertions(+), 1 deletion(-)
Warn the defined location as deprecation as well as the main message
[Bug #17575]
---
test/ruby/test_defined.rb | 17 +++++++++++++++++
vm_method.c | 3 ++-
2 files changed, 19 insertions(+), 1 deletion(-)