aboutsummaryrefslogtreecommitdiffstats
path: root/thread_sync.c
Commit message (Collapse)AuthorAgeFilesLines
* [DOC] Fixed indent [ci skip]Nobuyoshi Nakada2021-01-141-1/+1
|
* Proposed method for dealing with stack locals which have non-local lifetime.Samuel Williams2020-12-051-44/+51
|
* strip trailing spaces and adjusted indents [ci skip]Nobuyoshi Nakada2020-11-121-1/+1
|
* Tidy up book keeping for `thread->keeping_mutexes`.Samuel Williams2020-11-081-18/+35
| | | | | | When a scheduler is present, it's entirely possible for `th->keeping_mutexes` to be updated while enumerating the waitq. Therefore it must be fetched only during the removal operation.
* Don't try to resume blocked fiber on dead thread.Samuel Williams2020-11-081-5/+5
|
* Rename to `Fiber#set_scheduler`.Samuel Williams2020-11-071-3/+3
|
* Make `Thread#join` non-blocking.Samuel Williams2020-09-211-1/+1
|
* Remove from waiter in Mutex#lock with ensure when calling rb_scheduler_block()Benoit Daloze2020-09-201-6/+13
| | | | | * Previously this could lead to an invalid waiter entry and then trying to wake up that waiter would result in various issues in rb_mutex_unlock_th().
* Fix copy/paste error from 5bb5e706f1d310a467075630145d2cc277045765Benoit Daloze2020-09-181-1/+1
|
* Only interrupt when there is no scheduler in sync_wakeup()Benoit Daloze2020-09-181-2/+4
| | | | | | | | * When there is a scheduler, the Fiber that would be blocked has already been rescheduled and there is no point to interrupt something else. That blocked Fiber will be rescheduled as the next call to the scheduler (e.g., IO, sleep, other blocking sync). * See discussion on https://github.com/ruby/ruby/commit/d01954632d
* Cleanup commented codeBenoit Daloze2020-09-171-4/+0
| | | | * Mutex operations no longer disable the Fiber scheduler.
* Add missing goto found;Benoit Daloze2020-09-171-0/+1
| | | | | * To still remove the lock from the Thread's list of acquired locks. * Also to not wake up other waiters and preserve blocking behavior.
* Fix Mutex#unlock with a scheduler and thread contentionBenoit Daloze2020-09-171-13/+13
| | | | * It would hit "[BUG] unexpected THREAD_STOPPED" before.
* Call scheduler.block instead of scheduler.kernel_sleep for blocking ↵Benoit Daloze2020-09-171-5/+5
| | | | | | | Queue/SizedQueue operations * scheduler.unblock was already already called before but with no corresponding scheduler.block * add test that Queue#pop makes the scheduler wait until it gets an element.
* Rename scheduler.{mutex_lock,mutex_unlock} to {block,unblock}Benoit Daloze2020-09-171-3/+3
| | | | * Move #kernel_sleep next to #block as it is similar
* Add support for Queue & SizedQueue.Samuel Williams2020-09-141-31/+39
|
* Add support for ConditionVariable.Samuel Williams2020-09-141-31/+44
|
* Improve handling of urgent notification pipe.Samuel Williams2020-09-141-45/+41
|
* Make Mutex per-Fiber instead of per-ThreadBenoit Daloze2020-09-141-37/+69
| | | | | | | | | * Enables Mutex to be used as synchronization between multiple Fibers of the same Thread. * With a Fiber scheduler we can yield to another Fiber on contended Mutex#lock instead of blocking the entire thread. * This also makes the behavior of Mutex consistent across CRuby, JRuby and TruffleRuby. * [Feature #16792]
* Introduce Ractor mechanism for parallel executionKoichi Sasada2020-09-031-5/+6
| | | | | | | | | | | | | | | | This commit introduces Ractor mechanism to run Ruby program in parallel. See doc/ractor.md for more details about Ractor. See ticket [Feature #17100] to see the implementation details and discussions. [Feature #17100] This commit does not complete the implementation. You can find many bugs on using Ractor. Also the specification will be changed so that this feature is experimental. You will see a warning when you make the first Ractor with `Ractor.new`. I hope this feature can help programmers from thread-safety issues.
* rb_szqueue_push: do not goto into a branch卜部昌平2020-06-291-2/+1
| | | | | I'm not necessarily against every goto in general, but jumping into a branch is definitely a bad idea. Better refactor.
* Thread scheduler for light weight concurrency.Samuel Williams2020-05-141-1/+6
|
* Added more NORETURN declarationsNobuyoshi Nakada2020-05-111-0/+1
|
* more on NULL versus functions.卜部昌平2020-02-071-1/+1
| | | | | | Function pointers are not void*. See also ce4ea956d24eab5089a143bba38126f2b11b55b6 8427fca49bd85205f5a8766292dd893f003c0e48
* add assertion for mutex_lock.Koichi Sasada2019-10-281-5/+16
| | | | | After do_mutex_lock(mutex), the mutex should be owned by the current thread. Adding an assertion for this assumption.
* Adjusted spaces [ci skip]Nobuyoshi Nakada2019-09-271-1/+2
|
* fix arity of rb_mutex_synchronize_m卜部昌平2019-08-291-1/+1
| | | | | This is just a trivial mistake introduced in 6c56dae4b23c5c50e351758538141ca26b9aba40.
* rb_ensure now free from ANYARGS卜部昌平2019-08-271-1/+2
| | | | | | After 5e86b005c0f2ef30df2f9906c7e2f3abefe286a2, I now think ANYARGS is dangerous and should be extinct. This commit deletes ANYARGS from rb_ensure, which also revealed many arity / type mismatches.
* do_mutex_lock: release mutex before checking for interrupts (fixes issue 15360)Neeraj Bhunwal2019-06-111-1/+5
|
* Use UNALIGNED_MEMBER_PTRNobuyoshi Nakada2019-05-311-1/+1
| | | | | | | | | | | * internal.h (UNALIGNED_MEMBER_ACCESS, UNALIGNED_MEMBER_PTR): moved from eval_intern.h. * compile.c iseq.c, vm.c: use UNALIGNED_MEMBER_PTR for `entries` in `struct iseq_catch_table`. * vm_eval.c, vm_insnhelper.c: use UNALIGNED_MEMBER_PTR for `body` in `rb_method_definition_t`.
* thread_sync.c (rb_mutex_t): eliminate fork_gennormal2018-12-221-40/+1
| | | | | | | | | | | | | | | | | | The true bug fork_gen was hiding was rb_mutex_abandon_locking_mutex failing to unconditionally clear the waitq of mutexes it was waiting on. So we fix rb_mutex_abandon_locking_mutex, instead, and eliminate rb_mutex_cleanup_keeping_mutexes. This commit was tested heavily on a single-core Pentium-M which was my most reliable reproducer of the "crash.rb" script from [Bug #15383] [Bug #14578] [Bug #15383] Note: [Bug #15430] turned out to be an entirely different problem: RLIMIT_NPROC limit was hit on the CI VMs. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66489 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread_sync.c (rb_mutex_cleanup_keeping_mutexes): update fork_gennormal2018-12-211-0/+16
| | | | | | | | | | | ... when clearing waitq. Otherwise, we risk redundantly clearing valid waiters in future calls to `mutex_ptr`. Note: I am not sure if this fixes [Bug #15430], and even if it did, fork_gen is a belt-and-suspenders redundancy for [Bug #15383] which wastes one word for every Mutex object. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66477 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread_sync.c (rb_mutex_abandon_keeping_mutexes): remove unnecessary checknormal2018-12-211-3/+1
| | | | | | | | rb_mutex_abandon_all functions fine when passed a NULL value, so let the compiler deal with the complexity of the branch instead of the person reading the code. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66476 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread_sync.c (mutex_ptr): only reinitalize waitqueue at forknormal2018-12-181-2/+0
| | | | | | | | | | | | | | | 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
* Prefer rb_check_arity when 0 or 1 argumentsnobu2018-12-061-1/+1
| | | | | | | Especially over checking argc then calling rb_scan_args just to raise an ArgumentError. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66238 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread_sync.c (mutex_ptr): handle mutexes held by parent threads in childrennormal2018-12-051-0/+11
| | | | | | | | | | | | 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
* Add some missing documentation to Queue#{close|deq} [ci skip]marcandre2018-09-161-1/+3
| | | | | | | | Patch by Lars Kanis. [Fix GH-1949] * Describe the impact of Queue#close to Queue#deq . git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64756 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread_sync.c: common wakeup_{one,all} implementationnormal2018-08-261-16/+11
| | | | | | | | | | | | | | | This let us avoid looping in rb_szqueue_max_set, saves us some lines of code and reduces binary size slightly (numbers from 32-bit x86): text data bss dec hex filename before: 91272 392 156 91820 166ac thread.o after: 91200 392 156 91748 16664 thread.o Inspiration from this taken from the FUTEX_WAKE op of the Linux futex(2) syscall. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64542 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread.c: use rb_hrtime_t scalar for high-resolution time operationsnormal2018-08-251-8/+10
| | | | | | | | | | | | | | | | | | | | | Relying on "struct timespec" was too annoying API-wise and used more stack space. "double" was a bit wacky w.r.t rounding in the past, so now we'll switch to using a 64-bit type. Unsigned 64-bit integer is able to give us over nearly 585 years of range with nanoseconds. This range is good enough for the Linux kernel internal time representation, so it ought to be good enough for us. This reduces the stack usage of functions while GVL is held (and thus subject to marking) on x86-64 Linux (with ppoll): rb_wait_for_single_fd 120 => 104 do_select 120 => 88 [ruby-core:88582] [Misc #15014] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64533 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread*.c: replace GetMutexPtr with mutex_ptrnormal2018-08-211-23/+22
| | | | | | | Following ko1's lead in r59192, this gets rid of non-obvious assignments which happen inside macros. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64490 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread*.c: avoid unnecessary initialization for list_for_each_safenormal2018-08-201-3/+3
| | | | | | | According to r52446, it is only necessary for the current item (@i), not the `@nxt` parameter for list_for_each_safe. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64486 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread_sync.c (rb_condvar_initialize): remove extra semicolonnormal2018-08-191-1/+1
| | | | | | Oops :x git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64477 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread_sync.c (rb_mutex_sleep): disable interrupt checking in ensurenormal2018-08-191-16/+31
| | | | | | | | | | | | | | | | This is needed to reliably fix ConditionVariable#wait on Thread#kill [Bug #14999] because there is still a chance an interrupt could fire and prevent lock acquisition after an ensure statement. Arguably, rb_mutex_lock itself should be uninterruptible, but that already prevents bootstraptest/test_thread.rb from completing and probably breaks existing use cases. For reference, POSIX expressly forbids EINTR from pthread_mutex_lock. [ruby-core:88556] [Bug #14999] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64476 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread_sync.rb (rb_condvar_wait): golf out unnecessary variablesnormal2018-08-191-4/+1
| | | | | | | GCC is smart enough to optimize these away, but my attention span is too short :{ git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64474 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Revert "thread_sync.c (rb_mutex_sleep): skip interrupt check before sleep"normal2018-08-191-3/+2
| | | | | | This reverts commit 2e420b8b99db4a5b81e2deda1ca386d59ad6bcba (r64464) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread_sync.c (rb_mutex_sleep): skip interrupt check before sleepnormal2018-08-181-2/+3
| | | | | | | | We do not want to risk switching threads before going to sleep because it can cause unexpected wakeups and put us in an unexpected state when used with ConditionVariable. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64464 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Revert r64441eregon2018-08-181-48/+26
| | | | | | | | | | * This reverts commit 647fc1227a4146ecbfeb0d59358abc8d99cd8ae6: "thread_sync.c (rb_mutex_synchronize): only unlock if we own the mutex" * Let's try to preserve the semantics of always being locked inside Mutex#synchronize, even if an exception interrupts ConditionVariable#wait. * As discussed on [Bug #14999]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64448 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread_sync.c (rb_mutex_synchronize): only unlock if we own the mutexnormal2018-08-181-26/+48
| | | | | | | | | | | | | | | | | If an exception is raised inside Mutex#sleep (via ConditionVariable#wait), we cannot guarantee we can own the mutex in the ensure callback. However, who owns the mutex at that point does not matter. What matters is the Mutex is usable after an exception occurs. * thread_sync.c (rb_mutex_synchronize): only unlock if we own the mutex * spec/ruby/library/conditionvariable/wait_spec.rb: only test lock usability after thread kill. Who owns the lock at any particular moment is an implementation detail which we cannot easily guarantee. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64441 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Revert "thread_sync.c (do_sleep): avoid thread-switch/interrupt check"normal2018-08-181-6/+0
| | | | | | | | This reverts commit d7ddbff2954ba22b71bdfeba4b94e1c4fb91efb0 (r64436) Seems worthless at preventing CI failures git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64440 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* thread_sync.c (do_sleep): avoid thread-switch/interrupt checknormal2018-08-181-0/+6
| | | | | | | | | | | | | | | | Calling rb_mutex_sleep directly should avoid thread-switching/interrupt checking which can lead to occasional failures. Unfortunately, this means overriding Mutex#sleep is no longer supported. Will let this commit run for a bit see if CI failures from ConditionVariable specs continue... cf. https://rubyci.org/logs/rubyci.s3.amazonaws.com/ubuntu/ruby-trunk/log/20180817T213003Z.fail.html.gz [ruby-core:88524] [Bug #14999] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64436 b2dd03c8-39d4-4d8f-98ff-823fe69b080e