summaryrefslogtreecommitdiff
path: root/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/lib/em/spawnable.rb
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/lib/em/spawnable.rb')
-rw-r--r--vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/lib/em/spawnable.rb84
1 files changed, 84 insertions, 0 deletions
diff --git a/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/lib/em/spawnable.rb b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/lib/em/spawnable.rb
new file mode 100644
index 0000000..35c087d
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/lib/em/spawnable.rb
@@ -0,0 +1,84 @@
+#--
+#
+# Author:: Francis Cianfrocca (gmail: blackhedd)
+# Homepage:: http://rubyeventmachine.com
+# Date:: 25 Aug 2007
+#
+# See EventMachine and EventMachine::Connection for documentation and
+# usage examples.
+#
+#----------------------------------------------------------------------------
+#
+# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
+# Gmail: blackhedd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of either: 1) the GNU General Public License
+# as published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version; or 2) Ruby's License.
+#
+# See the file COPYING for complete licensing information.
+#
+#---------------------------------------------------------------------------
+#
+#
+
+module EventMachine
+ # Support for Erlang-style processes.
+ #
+ class SpawnedProcess
+ # Send a message to the spawned process
+ def notify *x
+ me = self
+ EM.next_tick {
+ # A notification executes in the context of this
+ # SpawnedProcess object. That makes self and notify
+ # work as one would expect.
+ #
+ y = me.call(*x)
+ if y and y.respond_to?(:pull_out_yield_block)
+ a,b = y.pull_out_yield_block
+ set_receiver a
+ self.notify if b
+ end
+ }
+ end
+ alias_method :resume, :notify
+ alias_method :run, :notify # for formulations like (EM.spawn {xxx}).run
+
+ def set_receiver blk
+ (class << self ; self ; end).class_eval do
+ remove_method :call if method_defined? :call
+ define_method :call, blk
+ end
+ end
+
+ end
+
+ # @private
+ class YieldBlockFromSpawnedProcess
+ def initialize block, notify
+ @block = [block,notify]
+ end
+ def pull_out_yield_block
+ @block
+ end
+ end
+
+ # Spawn an erlang-style process
+ def self.spawn &block
+ s = SpawnedProcess.new
+ s.set_receiver block
+ s
+ end
+
+ # @private
+ def self.yield &block
+ return YieldBlockFromSpawnedProcess.new( block, false )
+ end
+
+ # @private
+ def self.yield_and_notify &block
+ return YieldBlockFromSpawnedProcess.new( block, true )
+ end
+end