summaryrefslogtreecommitdiff
path: root/test/ruby/test_thread.rb
AgeCommit message (Collapse)Author
7 daysUse `assert_ruby_status` if no assertionNobuyoshi Nakada
2025-12-31Skip the hang-up test on WindowsNobuyoshi Nakada
2025-12-28Skip the hang-up test on mingwNobuyoshi Nakada
2025-10-06Remove unused variable warningÉtienne Barrié
$ make test/ruby/test_thread.rb RUBYOPT=-w >/dev/null test/ruby/test_thread.rb:1595: warning: assigned but unused variable - bug21127
2025-09-25Properly unlock locked mutexes on thread cleanup.Luke Gruber
Mutexes were being improperly unlocked on thread cleanup. This bug was introduced in 050a8954395. We must keep a reference from the mutex to the thread, because if the fiber is collected before the mutex is, then we cannot unlink it from the thread in `mutex_free`. If it's not unlinked from the the thread when it's freed, it causes bugs in `rb_thread_unlock_all_locking_mutexes`. We now mark the fiber when a mutex is locked, and the thread is marked as well. However, a fiber can still be freed in the same GC cycle as the mutex, so the reference to the thread is still needed. The reason we need to mark the fiber is that `mutex_owned_p()` has an ABA issue where if the fiber is collected while it's locked, a new fiber could be allocated at the same memory address and we could get false positives. Fixes [Bug #21342] Co-authored-by: John Hawthorn <john@hawthorn.email>
2025-04-24Fix a flaky test by making sure that a test thread stopsYusuke Endoh
``` 1) Failure: TestThread#test_join_argument_conversion [D:/a/ruby/ruby/src/test/ruby/test_thread.rb:249]: Expected nil (oid=4) to be the same as #<TestThread::Thread:0x000001e9e13bbc18 D:/a/ruby/ruby/src/test/ruby/test_thread.rb:245 run> (oid=3856). ``` https://github.com/ruby/ruby/actions/runs/14636019219/job/41067199813?pr=13169 Notes: Merged: https://github.com/ruby/ruby/pull/13170
2025-02-14[Bug #21127] Thread deadlock does not display backtraces (#12721)Masataka Pocke Kuwabara
Previously, Ruby displayed backtraces for each thread on deadlock. However, it has not been shown since Ruby 3.0. It should display the backtrace for debugging. Co-authored-by: Jeremy Evans <code@jeremyevans.net> Notes: Merged-By: pocke <p.ck.t22@gmail.com>
2025-02-13[Feature #21116] Extract RJIT as a third-party gemNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/12740
2024-06-04Remove dependency on fiddle from test/rubyHiroshi SHIBATA
Co-authored-by: "Nobuyoshi Nakada" <nobu@ruby-lang.org>
2023-10-12M:N thread scheduler for RactorsKoichi Sasada
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]
2023-09-15Fix Thread#native_thread_id being cached across fork (#8418)KJ Tsanaktsidis
The native thread ID can and does change on some operating systems (e.g. Linux) after forking, so it needs to be re-queried. [Bug #19873] Notes: Merged-By: nurse <naruse@airemix.jp>
2023-08-28Remove --disable-gems in assert_in_out_errPeter Zhu
assert_in_out_err adds --disable=gems so we don't need to add --disable-gems in the args list. Notes: Merged: https://github.com/ruby/ruby/pull/8303
2023-03-06s/MJIT/RJIT/Takashi Kokubun
Notes: Merged: https://github.com/ruby/ruby/pull/7462
2022-12-02Wait killed threadNobuyoshi Nakada
2022-11-09Make pending_interrupt?(Exception) workYusuke Endoh
A patch from katsu (Katsuhiro Ueno) [Bug #19110] Notes: Merged: https://github.com/ruby/ruby/pull/6689
2022-07-28Skip randomly failing tests with FreeBSD 12Hiroshi SHIBATA
2022-07-25Wait the test thread to sleepNobuyoshi Nakada
Revert "Synchronize the test thread sleep" This reverts commit 307835fe314fea6e946a8c9b25bb3912680ed7d1.
2022-07-25Synchronize the test thread sleepNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/6176
2022-07-07Thread#value: handle threads killed by a forkJean Boussier
[Bug #18902] When a thread is killed because we forked, the `value` if left to `Qundef`. Returning it woudl crash the VM. Notes: Merged: https://github.com/ruby/ruby/pull/6103
2022-07-05Synchronize the test thread not to die before assertionsNobuyoshi Nakada
2022-05-30Skip failing test with freebsdHiroshi SHIBATA
2022-04-21Uncomment code to raise LocalJumpError for yield across thread through enumJeremy Evans
Not sure if this is the correct fix. It does raise LocalJumpError in the yielding thread as you would expect, but the value yielded to the calling thread is still yielded without an exception. Fixes [Bug #18649] Notes: Merged: https://github.com/ruby/ruby/pull/5692
2022-03-01Fix race in TestThread#test_thread_status_in_trapBenoit Daloze
* If the sleep is not enough to run the rest of the logic the process would be exited early, e.g., before the signal handler can run.
2022-01-04Use omit instead of skip: test/ruby/**/*.rbHiroshi SHIBATA
2021-12-13Prepare for removing RubyVM::JIT (#5262)Takashi Kokubun
Notes: Merged-By: k0kubun <takashikkbn@gmail.com>
2021-10-03Remove extraneous conversion to float [Bug #18236]Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4927
2021-07-01Keep GC disabled until VM bootstrap has done [Bug #17583]Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4617
2021-06-29Prefer qualified names under ThreadNobuyoshi Nakada
2021-06-01Make `Thread#native_thread_id` not-implemented if unsupportedNobuyoshi Nakada
Raise `NotImplementedError` on unsupported platforms regardless the argument consistently.
2021-05-26Rescue NotImplementedError for a test of Thread#native_thread_idYusuke Endoh
http://rubyci.s3.amazonaws.com/solaris10-gcc/ruby-master/log/20210526T070003Z.fail.html.gz ``` 1) Error: TestThread#test_thread_native_thread_id: NotImplementedError: native_thread_id() function is unimplemented on this machine /export/home/users/chkbuild/cb-gcc/tmp/build/20210526T070003Z/ruby/test/ruby/test_thread.rb:1338:in `native_thread_id' /export/home/users/chkbuild/cb-gcc/tmp/build/20210526T070003Z/ruby/test/ruby/test_thread.rb:1338:in `test_thread_native_thread_id' ```
2021-05-26Add Thread#native_thread_id [Feature #17853]NARUSE, Yui
2021-01-13Rename RubyVM::MJIT to RubyVM::JITTakashi Kokubun
because the name "MJIT" is an internal code name, it's inconsistent with --jit while they are related to each other, and I want to discourage future JIT implementation-specific (e.g. MJIT-specific) APIs by this rename. [Feature #17490]
2020-12-13Wait testing/helper threads to terminateNobuyoshi Nakada
2020-12-04Guard all accesses to RubyVM::MJIT with defined?(RubyVM::MJIT) &&Benoit Daloze
* Otherwise those tests, etc cannot run on alternative Ruby implementations.
2020-10-28Add Thread.ignore_deadlock accessorJeremy Evans
Setting this to true disables the deadlock detector. It should only be used in cases where the deadlock could be broken via some external means, such as via a signal. Now that $SAFE is no longer used, replace the safe_level_ VM flag with ignore_deadlock for storing the setting. Fixes [Bug #13768] Notes: Merged: https://github.com/ruby/ruby/pull/3710 Merged-By: jeremyevans <code@jeremyevans.net>
2020-02-09Disable GC until VM objects get initialized [Bug #16616]Nobuyoshi Nakada
2019-12-22fix a thread test.Koichi Sasada
* Use Queue for synchronization. * Don't use `sleep 0.2` and use `th.join` because created thread can raise an exception after 0.2 seconds.
2019-12-13Improved the test for Thread#inspect [Feature #16412]Nobuyoshi Nakada
2019-11-29check interrupts at each frame pop timing.Koichi Sasada
Asynchronous events such as signal trap, finalization timing, thread switching and so on are managed by "interrupt_flag". Ruby's threads check this flag periodically and if a thread does not check this flag, above events doesn't happen. This checking is CHECK_INTS() (related) macro and it is placed at some places (laeve instruction and so on). However, at the end of C methods, C blocks (IMEMO_IFUNC) etc there are no checking and it can introduce uninterruptible thread. To modify this situation, we decide to place CHECK_INTS() at vm_pop_frame(). It increases interrupt checking points. [Bug #16366] This patch can introduce unexpected events...
2019-11-18Warn on access/modify of $SAFE, and remove effects of modifying $SAFEJeremy Evans
This removes the security features added by $SAFE = 1, and warns for access or modification of $SAFE from Ruby-level, as well as warning when calling all public C functions related to $SAFE. This modifies some internal functions that took a safe level argument to no longer take the argument. rb_require_safe now warns, rb_require_string has been added as a version that takes a VALUE and does not warn. One public C function that still takes a safe level argument and that this doesn't warn for is rb_eval_cmd. We may want to consider adding an alternative method that does not take a safe level argument, and warn for rb_eval_cmd. Notes: Merged: https://github.com/ruby/ruby/pull/2476
2019-08-30Fix keyword argument separation warnings in testJeremy Evans
Notes: Merged: https://github.com/ruby/ruby/pull/2395
2019-06-28Removed unused variablesNobuyoshi Nakada
2019-01-11Ensure to terminate the childnobu
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66789 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-23test/ruby/test_thread.rb (test_fork_while_parent_locked): rewrite to avoid OOMnormal
Instead of using a torture test, trigger the condition for the old segfault in [Bug #15383] exactly. [ruby-core:90676] [Bug #15430] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66508 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-22test/ruby/test_thread.rb (test_fork_while_parent_locked): reduce threadsnormal
Reduce thread counts unconditionally for some CI systems with low limits.. And Solaris apparently lacks RLIMIT_NPROC, so we can't detect resource limits and scale the test appropriately. [ruby-core:90670] [Bug #15430] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66494 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-21test/ruby/test_thread.rb: reduce thread count to avoid SIGKILLnormal
Perhaps this error report is down to resource limits on a VM: http://rubyci.s3.amazonaws.com/centos7/ruby-trunk/log/20181221T230003Z.fail.html.gz But rb_mutex_t.fork_gen is still redundant, I think. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66488 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-21test/ruby/test_thread.rb: add diagnosis code for [Bug #15430]normal
I can't find stderr in the test-all output of the CI machine, so maybe the assertion will show what's going on. http://rubyci.s3.amazonaws.com/centos7/ruby-trunk/log/20181221T170003Z.log.html.gz#test-all git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66487 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-18thread_sync.c (mutex_ptr): only reinitalize waitqueue at forknormal
Mutexes need to remain locked after forking. This fixes "[BUG] invalid keeping_mutexes: Attempt to unlock a mutex which is locked by another thread" and should fix test_fork_while_parent_locked failures in CI [ruby-core:90581] [Bug #15424] [ruby-core:90595] [Bug #15430] Fixes: r66230 ("handle mutexes held by parent threads in children") git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66438 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-05thread_sync.c (mutex_ptr): handle mutexes held by parent threads in childrennormal
Mutexes may be held by threads which only exist in the parent process, so their waitqueues may be populated with references to other dead threads. We must reset them at fork. I am a moron for introducing this bug :< [ruby-core:90312] [Bug #15383] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66230 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-11-23test/ruby/test_thread.rb: use safe navigation operator.kazu
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65934 b2dd03c8-39d4-4d8f-98ff-823fe69b080e