/usr/lib/ruby/vendor_ruby/concurrent/actor.rb is in ruby-concurrent 1.0.0-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | require 'concurrent/configuration'
require 'concurrent/executor/serialized_execution'
require 'concurrent/synchronization'
require 'concurrent/edge/future'
module Concurrent
# TODO https://github.com/celluloid/celluloid/wiki/Supervision-Groups ?
# TODO Remote actors using DRb
# TODO un/become
# TODO supervision tree, pause children on error in parent, pause may need higher priority
# TODO more effective executor
# {include:file:doc/actor/main.md}
# @api Actor
# @!macro edge_warning
module Actor
require 'concurrent/actor/type_check'
require 'concurrent/actor/errors'
require 'concurrent/actor/public_delegations'
require 'concurrent/actor/internal_delegations'
require 'concurrent/actor/envelope'
require 'concurrent/actor/reference'
require 'concurrent/actor/core'
require 'concurrent/actor/behaviour'
require 'concurrent/actor/context'
require 'concurrent/actor/default_dead_letter_handler'
require 'concurrent/actor/root'
require 'concurrent/actor/utils'
# @return [Reference, nil] current executing actor if any
def self.current
Thread.current[:__current_actor__]
end
@root = Concurrent.delay do
Core.new(parent: nil, name: '/', class: Root, initialized: future = Concurrent.future).reference.tap do
future.wait!
end
end
# A root actor, a default parent of all actors spawned outside an actor
def self.root
@root.value!
end
# Spawns a new actor. {Concurrent::Actor::AbstractContext.spawn} allows to omit class parameter.
# To see the list of avaliable options see {Core#initialize}
# @see Concurrent::Actor::AbstractContext.spawn
# @see Core#initialize
# @example by class and name
# Actor.spawn(AdHoc, :ping1) { -> message { message } }
#
# @example by option hash
# inc2 = Actor.spawn(class: AdHoc,
# name: 'increment by 2',
# args: [2],
# executor: Concurrent.global_io_executor) do |increment_by|
# lambda { |number| number + increment_by }
# end
# inc2.ask!(2) # => 4
#
# @param block for context_class instantiation
# @param args see {.to_spawn_options}
# @return [Reference] never the actual actor
def self.spawn(*args, &block)
if Actor.current
Core.new(to_spawn_options(*args).merge(parent: Actor.current), &block).reference
else
root.ask([:spawn, to_spawn_options(*args), block]).value!
end
end
# as {.spawn} but it'll block until actor is initialized or it'll raise exception on error
def self.spawn!(*args, &block)
spawn(to_spawn_options(*args).merge(initialized: future = Concurrent.future), &block).tap { future.wait! }
end
# @overload to_spawn_options(context_class, name, *args)
# @param [AbstractContext] context_class to be spawned
# @param [String, Symbol] name of the instance, it's used to generate the
# {Core#path} of the actor
# @param args for context_class instantiation
# @overload to_spawn_options(opts)
# see {Core#initialize} opts
def self.to_spawn_options(*args)
if args.size == 1 && args.first.is_a?(::Hash)
args.first
else
{ class: args[0],
name: args[1],
args: args[2..-1] }
end
end
end
end
|