
* Use the `ConditionVariable` primitive to fix rece between stopped receiver Thread and its wake signal. * Race was only observable via synthetical benchmarks and explicit sleeps between unlocking receiver mutex and Thread.stop * Simplifies code a lot as thread must not be passed around anymore
35 lines
577 B
Ruby
35 lines
577 B
Ruby
module Mutant
|
|
module Actor
|
|
# Actor root environment
|
|
class Env
|
|
include Concord.new(:thread_root)
|
|
|
|
# Spawn a new actor executing block
|
|
#
|
|
# @return [Actor::Sender]
|
|
#
|
|
# @api private
|
|
#
|
|
def spawn
|
|
mailbox = new_mailbox
|
|
|
|
thread_root.new do
|
|
yield mailbox
|
|
end
|
|
|
|
mailbox.sender
|
|
end
|
|
|
|
# Return new unbound mailbox
|
|
#
|
|
# @return [Mailbox]
|
|
#
|
|
# @api private
|
|
#
|
|
def new_mailbox
|
|
Mailbox.new
|
|
end
|
|
|
|
end # Env
|
|
end # Actor
|
|
end # Mutant
|