[#115884] Windows Ruby 3.2.2: Non-English character added to Windows Registry String Value — Jay Mav via ruby-core <ruby-core@...>
Hello,
3 messages
2023/12/24
[ruby-core:115943] [Ruby master Bug#20081] Transfered Fiber doesn't return to Fiber that started it
From:
"rmosolgo (Robert Mosolgo) via ruby-core" <ruby-core@...>
Date:
2023-12-27 22:20:46 UTC
List:
ruby-core #115943
Issue #20081 has been updated by rmosolgo (Robert Mosolgo).
Thanks for taking a look! I was going from the example in the docs (https://docs.ruby-lang.org/en/master/Fiber.html#method-i-transfer), where the return value of `.transfer` is used by the caller.
And `.transfer` _does_ return to the caller, as long as the caller is the main Fiber, for example, this prints out a sequence of messages:
```ruby
parent = Fiber.current
worker = Fiber.new do |initial_arg|
puts initial_arg # => 2. Begin Worker
puts parent.transfer("3. Resume Parent") # => 4. Resume Worker
"5. Exit Worker"
end
puts "1. Start"
puts worker.transfer("2. Begin Worker")
# => "3. Resume Parent"
puts worker.transfer("4. Resume Worker")
# => "5. Exit Worker"
puts "6. Exit Script"
```
But it behaves differently when inside a surrounding, non-main Fiber:
```ruby
manager = Fiber.new do |manager_init|
puts manager_init # => 1. Start
parent = Fiber.current
worker = Fiber.new do |initial_arg|
puts initial_arg # => 2. Begin Worker
puts parent.transfer("3. Resume Parent")
"5. Exit Worker"
end
puts worker.transfer("2. Begin Worker")
# => "3. Resume Parent"
puts worker.transfer("4. Resume Worker")
# => "5. Exit Worker"
"6. Exit Script" # This isn't printed
end
puts manager.transfer("1. Start")
# 1. Start
# 2. Begin Worker
# 3. Resume Parent
# 4. Resume Worker
# 5. Exit Worker
#
# ... (6 doesn't print here)
```
Maybe the first example is a special case, since it's the main Fiber. I'd be happy to add a comment about that to the Fiber docs if that'd be helpful!
----------------------------------------
Bug #20081: Transfered Fiber doesn't return to Fiber that started it
https://bugs.ruby-lang.org/issues/20081#change-105896
* Author: rmosolgo (Robert Mosolgo)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-darwin22]
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN
----------------------------------------
Hi! I'm trying to figure out how to make sure that Fibers started with `.transfer` end up _terminated_, not just suspended. (If they're suspended, Rails thinks they're still alive, and they continue to hold onto database connections, see: https://github.com/rmosolgo/graphql-ruby/issues/4739#issuecomment-1866930914.)
So, I'm looking for way to make sure that any Fiber I start with `.transfer` will be properly terminated. But what I noticed is that when a transfer-based Fiber terminates, it gives control back to the top-most Fiber, not the Fiber which transfered to it. Is this intended? Here's a script to replicate the issue:
```ruby
manager = Fiber.new do
parent = Fiber.current
worker = Fiber.new do
puts "2. Begin Worker"
parent.transfer
puts "4. End Worker"
end
puts "1. Transfer 1"
worker.transfer
puts "3. Transfer 2"
worker.transfer
puts "5. Finished manager"
end
manager.transfer
puts "6. Finished script"
```
I expect the steps to print in order:
```
1. Transfer 1
2. Begin Worker
3. Transfer 2
4. End Worker
5. Finished manager
6. Finished script
```
But instead, `5. ...` is skipped:
```
1. Transfer 1
2. Begin Worker
3. Transfer 2
4. End Worker
6. Finished script
```
I think that's because my `worker` fiber terminates and passes control back to the top-level Fiber.
Should it have passed control back to the `manager`? Or is there another way to make sure `worker` is terminated, and `manager` gets control?
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/