diff options
author | Benoit Daloze <[email protected]> | 2020-10-03 14:05:15 +0200 |
---|---|---|
committer | Benoit Daloze <[email protected]> | 2020-10-10 12:48:09 +0200 |
commit | bfc1c7205d9592b5b5be3b351fbf7b9ca8c537b6 (patch) | |
tree | 900787ffb208d56d3e120714b8d235d6f6d6ca16 /ractor.rb | |
parent | 9eccf0711fedb7be90b2e4995845eaafacb0c6dd (diff) |
Add Ractor#receive and Ractor.receive and use it in all places
* Keep Ractor#recv/Ractor.recv as an alias for now.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3626
Diffstat (limited to 'ractor.rb')
-rw-r--r-- | ractor.rb | 44 |
1 files changed, 24 insertions, 20 deletions
@@ -1,7 +1,7 @@ class Ractor # Create a new Ractor with args and a block. # args are passed via incoming channel. - # A block (Proc) will be isolated (can't acccess to outer variables) + # A block (Proc) will be isolated (can't access to outer variables) # # A ractor has default two channels: # an incoming channel and an outgoing channel. @@ -15,22 +15,22 @@ class Ractor # and other # # r = Ractor.new do - # Ractor.recv # recv via r's mailbox => 1 - # Ractor.recv # recv via r's mailbox => 2 + # Ractor.receive # receive via r's mailbox => 1 + # Ractor.receive # receive via r's mailbox => 2 # Ractor.yield 3 # yield a message (3) and wait for taking by another ractor. # 'ok' # the return value will be yielded. # # and r's incoming/outgoing ports are closed automatically. # end # r.send 1 # send a message (1) into r's mailbox. # r << 2 # << is an alias of `send`. - # p r.take # take a message from r's outgoing port #=> 3 - # p r.take # => 'ok' + # p r.take # take a message from r's outgoing port => 3 + # p r.take # => 'ok' # p r.take # raise Ractor::ClosedError # # other options: # name: Ractor's name # - def self.new *args, name: nil, &block + def self.new(*args, name: nil, &block) b = block # TODO: builtin bug raise ArgumentError, "must be called with a block" unless block loc = caller_locations(1, 1).first @@ -59,18 +59,18 @@ class Ractor # # r, obj = Ractor.select(r1, r2, Ractor.current) # #=> wait for taking from r1 or r2 - # # or recv from incoming queue - # # If recv is succeed, then obj is received value - # # and r is :recv (Ractor.current) + # # or receive from incoming queue + # # If receive is succeed, then obj is received value + # # and r is :receive (Ractor.current) # # r, obj = Ractor.select(r1, r2, Ractor.current, yield_value: obj) # #=> wait for taking from r1 or r2 - # # or recv from incoming queue + # # or receive from incoming queue # # or yield (Ractor.yield) obj # # If yield is succeed, then obj is nil # # and r is :yield # - def self.select *ractors, yield_value: yield_unspecified = true, move: false + def self.select(*ractors, yield_value: yield_unspecified = true, move: false) __builtin_cstmt! %q{ const VALUE *rs = RARRAY_CONST_PTR_TRANSIENT(ractors); VALUE rv; @@ -82,34 +82,40 @@ class Ractor end # Receive an incoming message from Ractor's incoming queue. - def self.recv + def self.receive __builtin_cexpr! %q{ - ractor_recv(ec, rb_ec_ractor_ptr(ec)) + ractor_receive(ec, rb_ec_ractor_ptr(ec)) } end - private def recv + class << self + alias recv receive + end + + private def receive __builtin_cexpr! %q{ // TODO: check current actor - ractor_recv(ec, RACTOR_PTR(self)) + ractor_receive(ec, RACTOR_PTR(self)) } end + alias recv receive # Send a message to a Ractor's incoming queue. # # # Example: # r = Ractor.new do - # p Ractor.recv #=> 'ok' + # p Ractor.receive #=> 'ok' # end # r.send 'ok' # send to r's incoming queue. - def send obj, move: false + def send(obj, move: false) __builtin_cexpr! %q{ ractor_send(ec, RACTOR_PTR(self), obj, move) } end + alias << send # yield a message to the ractor's outgoing port. - def self.yield obj, move: false + def self.yield(obj, move: false) __builtin_cexpr! %q{ ractor_yield(ec, rb_ec_ractor_ptr(ec), obj, move) } @@ -126,8 +132,6 @@ class Ractor } end - alias << send - def inspect loc = __builtin_cexpr! %q{ RACTOR_PTR(self)->loc } name = __builtin_cexpr! %q{ RACTOR_PTR(self)->name } |