[macruby-changes] [3401] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Mon Feb 1 17:35:38 PST 2010
Revision: 3401
http://trac.macosforge.org/projects/ruby/changeset/3401
Author: ernest.prabhakar at gmail.com
Date: 2010-02-01 17:35:36 -0800 (Mon, 01 Feb 2010)
Log Message:
-----------
Rewrote Actor on top of SimpleDelegator
Modified Paths:
--------------
MacRuby/trunk/lib/dispatch/actor.rb
MacRuby/trunk/spec/macruby/library/dispatch/actor_spec.rb
Modified: MacRuby/trunk/lib/dispatch/actor.rb
===================================================================
--- MacRuby/trunk/lib/dispatch/actor.rb 2010-02-02 01:35:32 UTC (rev 3400)
+++ MacRuby/trunk/lib/dispatch/actor.rb 2010-02-02 01:35:36 UTC (rev 3401)
@@ -1,57 +1,57 @@
+require 'delegate'
+
module Dispatch
- # Create an Actor that serializes or asynchronizes access to an object
+ # Create an Actor that serializes or asynchronizes access to a delegate.
# Forwards method invocations to the passed object via a private serial queue,
- # and optinally calls back asynchronously (if given a block or group).
- # Note that this will NOT work for methods that themselves expect a block
- class Actor
+ # and optionally calls back asynchronously (if given a block or group).
+ #
+ # Note that this will NOT work for methods that themselves expect a block.
+ # For those, use e.g., the Enumerable p_* methods insteads.
+ #
+ class Actor < SimpleDelegator
- CRITICAL = /__(.+)__|method_missing|object_id/
- instance_methods.each do |method|
- undef_method(method) unless method =~ CRITICAL
- end
-
- # Create an Actor to wrap the given +actee+,
+ # Create an Actor to wrap the given +delegate+,
# optionally specifying the default +callback+ queue
- def initialize(actee, callback=nil)
- @actee = actee
- @callback_default = callback || Dispatch::Queue.concurrent
- @q = Dispatch::Queue.new("dispatch.actor.#{actee}.#{object_id}")
+ def initialize(delegate, callback=nil)
+ super(delegate)
+ @default_callback = callback || Dispatch::Queue.concurrent
+ @q = Dispatch::Queue.new("dispatch.actor.#{delegate}.#{object_id}")
__reset!__
end
def __reset!__
- @callback = @callback_default
+ @callback = @default_callback
@group = nil
end
# Specify the +callback+ queue for the next async request
- def _on(callback)
+ def _on_(callback)
@callback = callback
end
# Specify the +group+ for the next async request
- def _with(group)
+ def _with_(group)
@group = group
end
# Wait until the internal private queue has completed execution
- # then returns the +actee+ delegate object
- def _done
+ # then returns the +delegate+ object
+ def _done_
@q.sync { }
- @actee
+ __getobj__
end
def method_missing(symbol, *args, &block)
if block_given? or not @group.nil?
callback = @callback
@q.async(@group) do
- retval = @actee.__send__(symbol, *args)
+ retval = __getobj__.__send__(symbol, *args)
callback.async { block.call(retval) } if not callback.nil?
end
return __reset!__
else
@retval = nil
- @q.sync { @retval = @actee.__send__(symbol, *args) }
+ @q.sync { @retval = __getobj__.__send__(symbol, *args) }
return @retval
end
end
Modified: MacRuby/trunk/spec/macruby/library/dispatch/actor_spec.rb
===================================================================
--- MacRuby/trunk/spec/macruby/library/dispatch/actor_spec.rb 2010-02-02 01:35:32 UTC (rev 3400)
+++ MacRuby/trunk/spec/macruby/library/dispatch/actor_spec.rb 2010-02-02 01:35:36 UTC (rev 3401)
@@ -2,22 +2,31 @@
require 'dispatch'
if MACOSX_VERSION >= 10.6
+
+ class Actee
+ def initialize(s); @s = s; end
+ def current_queue; Dispatch::Queue.current; end
+ def to_s; @s; end
+ end
+
describe "Dispatch::Actor" do
before :each do
- @actee = "me"
+ @actee = Actee.new("my actee")
@actor = Dispatch::Actor.new(@actee)
end
it "should return an Actor when called with an actee" do
- true.should == true
+ @actor.should be_kind_of(Dispatch::Actor)
+ @actor.should be_kind_of(SimpleDelegator)
end
- it "should undef most of its inherited methods" do
- true.should == true
+ it "should return the actee when called with __getobj__" do
+ @actee.should be_kind_of(Actee)
+ @actor.__getobj__.should be_kind_of(Actee)
end
- it "should NOT undef missing_method or object-id" do
- true.should == true
+ it "should invoke actee for most inherited methods" do
+ @actor.to_s.should == @actee.to_s
end
it "should invoke actee methods on a private serial queue" do
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100201/91b87cfc/attachment.html>
More information about the macruby-changes
mailing list