Comments (6)
Thanks for the report.
That's very surprising, as Signal.trap("INT") {}
should mean sending SIGINT should do nothing.
But actually with a little debugging what happens is ConditionVariable#wait has a spurious wakeup on CRuby (.wait returns even though neither .broadcast nor .signal has been called) in that case, probably because CRuby does SIGVTALRM/interrupt logic anyway it seems, even with the trap overridden.
Although even though the trap is overridden, it still has to execute that empty block on the main thread, so that's probably why we get that internal interrupt.
That's maybe a CRuby issue, because for instance there is no such issue on TruffleRuby.
We can workaround in
to use
until
instead of unless
.In most cases there should always be a loop around a ConditionVariable#wait, but since promises have a single state change that shouldn't be necessary.
from concurrent-ruby.
I reviewed all usages of ConditionVariable#wait
in concurrent-ruby, they seem all fine.
In addition to #1016 there was also #1017 and #1018.
But as can be seen in #1017 sometimes it should not be a loop directly around the .wait
.
So given we need the code only in one place it feels like the class is not necessary.
BTW, there is already
from concurrent-ruby.
To reproduce:
# test.rb
require "concurrent-ruby"
Signal.trap("INT") {}
task = Concurrent::Promises.future do
i = 0
loop do
i = (i + 1) % 10
end
i
end
puts task.value!
puts "Unexpected behaviour?" if task.pending?
Run in console:
❯ ruby ./test.rb
^C
Unexpected behaviour?
from concurrent-ruby.
CRuby issue for this: https://bugs.ruby-lang.org/issues/20047
from concurrent-ruby.
Fix in #1016
from concurrent-ruby.
@eregon what are you thoughts about making a private/internal class like ReliableConditionVariable
that would wrap the loop/timeout fix for CRuby, or defer to the language recommendation? I wonder how many places this pattern should be duplicated... though hopefully a fix gets some traction in upstream CRuby too.
from concurrent-ruby.
Related Issues (20)
- why use wait_for_termination method will stuck the code HOT 2
- DaemonThreadFactory creating new Java thread factory each time it creates a new thread HOT 8
- Version 1.2.2 crashes with Segmentation fault HOT 3
- Fiber.new causes SEGV when using Ruby 3.3.0 on Rails 7.1.2 in M1 Mac Docker environment HOT 5
- Segfault in lock_local_var.rb on aarch64 HOT 3
- [REDIRECT] Segfault on Ruby 3.3.0 on linux-aarch64? See https://bugs.ruby-lang.org/issues/20085
- Add new CI job with RUBY_MN_THREADS=1 HOT 4
- Add API to prestart threads in threadpools HOT 4
- Don't know how to build task 'parallel_spec' HOT 2
- Segmentation fault related to concurrent-ruby HOT 4
- Segmentation fault with Ruby 3.3.0 running with Docker HOT 1
- Add keyword arguments to async HOT 1
- ThreadPoolExecutor#shutdown? inconsistency in JRuby and C Ruby HOT 4
- test failure due to "uninitialized constant Concurrent::CAtomicReference" HOT 7
- CAtomicFixnum should probably be a private constant HOT 1
- support re-raising exceptions when shutting down a timertask HOT 4
- v1.2.0 release notes do not mention that RubyThreadLocalVar class was removed HOT 8
- NameError: uninitialized constant Concurrent::RubyThreadLocalVar HOT 1
- The Concurrent::Map default_proc is passed a Concurrent::Hash instead of the Concurrent::Map HOT 8
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from concurrent-ruby.