Revision: 3467 http://trac.macosforge.org/projects/ruby/changeset/3467 Author: ernest.prabhakar@gmail.com Date: 2010-02-09 15:24:49 -0800 (Tue, 09 Feb 2010) Log Message: ----------- Dispatch::Future now a subclass of Group Modified Paths: -------------- MacRuby/trunk/lib/dispatch/dispatch.rb MacRuby/trunk/lib/dispatch/future.rb MacRuby/trunk/spec/macruby/library/dispatch/dispatch_spec.rb MacRuby/trunk/spec/macruby/library/dispatch/future_spec.rb Modified: MacRuby/trunk/lib/dispatch/dispatch.rb =================================================================== --- MacRuby/trunk/lib/dispatch/dispatch.rb 2010-02-09 23:24:24 UTC (rev 3466) +++ MacRuby/trunk/lib/dispatch/dispatch.rb 2010-02-09 23:24:49 UTC (rev 3467) @@ -43,7 +43,7 @@ # Run the +&block+ asynchronously on a concurrent queue of the given # (optional) +priority+ as part of a Future, which is returned for use with - # +join+ or +value+ + # +join+ or +value+ -- or as a Group, of which it is a subclass def fork(priority=nil, &block) Dispatch::Future.new(priority) &block Modified: MacRuby/trunk/lib/dispatch/future.rb =================================================================== --- MacRuby/trunk/lib/dispatch/future.rb 2010-02-09 23:24:24 UTC (rev 3466) +++ MacRuby/trunk/lib/dispatch/future.rb 2010-02-09 23:24:49 UTC (rev 3467) @@ -4,7 +4,7 @@ # Subclass of Dispatch::Group used to implement lazy Futures # By returning a value and duck-typing Thread +join+ and +value+ - class Future < Group + class Future < Dispatch::Group # Create a future that asynchronously dispatches the block # to a concurrent queue of the specified (optional) +priority+ def initialize(priority=nil, &block) @@ -14,7 +14,7 @@ end # Waits for the computation to finish - alias :wait, :join + alias_method :join, :wait # Joins, then returns the value # If a block is passed, invoke that asynchronously with the final value @@ -30,4 +30,14 @@ end end + # Run the +&block+ asynchronously on a concurrent queue of the given + # (optional) +priority+ as part of a Future, which is returned for use with + # +join+ or +value+ -- or as a Group, of which it is a subclass + + def fork(priority=nil, &block) + Dispatch::Future.new(priority) &block + end + + module_function :fork + end Modified: MacRuby/trunk/spec/macruby/library/dispatch/dispatch_spec.rb =================================================================== --- MacRuby/trunk/spec/macruby/library/dispatch/dispatch_spec.rb 2010-02-09 23:24:24 UTC (rev 3466) +++ MacRuby/trunk/spec/macruby/library/dispatch/dispatch_spec.rb 2010-02-09 23:24:49 UTC (rev 3467) @@ -3,10 +3,10 @@ if MACOSX_VERSION >= 10.6 - $global = 0 + $dispatch_gval = 0 class Actee def initialize(s="default"); @s = s; end - def delay_set(n); sleep 0.01; $global = n; end + def delay_set(n); sleep 0.01; $dispatch_gval = n; end def to_s; @s; end end @@ -33,30 +33,30 @@ describe :sync do it "should execute the block Synchronously" do - $global = 0 + $dispatch_gval = 0 Dispatch.sync { @actee.delay_set(42) } - $global.should == 42 + $dispatch_gval.should == 42 end end describe :async do it "should execute the block Asynchronously" do - $global = 0 + $dispatch_gval = 0 Dispatch.async(:default) { @actee.delay_set(42) } - $global.should == 0 - while $global == 0 do; end - $global.should == 42 + $dispatch_gval.should == 0 + while $dispatch_gval == 0 do; end + $dispatch_gval.should == 42 end end describe :group do it "should execute the block with the specified group" do - $global = 0 + $dispatch_gval = 0 g = Dispatch::Group.new Dispatch.group(g) { @actee.delay_set(42) } - $global.should == 0 + $dispatch_gval.should == 0 g.wait - $global.should == 42 + $dispatch_gval.should == 42 end end @@ -75,32 +75,23 @@ end describe :fork do - it "should return an Group for tracking execution of the passed block" do - $global = 0 + it "should return a Future for tracking execution of the passed block" do + $dispatch_gval = 0 g = Dispatch.fork { @actee.delay_set(42) } - $global.should == 0 - g.should be_kind_of Dispatch::Group - g.wait - $global.should == 42 + $dispatch_gval.should == 0 + g.should be_kind_of Dispatch::Future + #g.join + $dispatch_gval.should == 42 end - - it "should :join Synchronously to that group" do - $global = 0 + + it "should return a Group for tracking execution of the passed block" do + $dispatch_gval = 0 g = Dispatch.fork { @actee.delay_set(42) } - $global.should == 0 - g.join - $global.should == 42 + $dispatch_gval.should == 0 + g.should be_kind_of Dispatch::Group + #g.wait + $dispatch_gval.should == 42 end - - it "should :join Asynchronously if passed another block" do - $global = 0 - g = Dispatch.fork { @actee.delay_set(42) } - $global.should == 0 - g.join { } - $global.should == 0 - while $global == 0 do; end - $global.should == 42 - end end end Modified: MacRuby/trunk/spec/macruby/library/dispatch/future_spec.rb =================================================================== --- MacRuby/trunk/spec/macruby/library/dispatch/future_spec.rb 2010-02-09 23:24:24 UTC (rev 3466) +++ MacRuby/trunk/spec/macruby/library/dispatch/future_spec.rb 2010-02-09 23:24:49 UTC (rev 3467) @@ -5,28 +5,40 @@ describe "Dispatch::Future" do before :each do - @future = Dispatch::Future.new { Math.sqrt(2**10) } + @result = 0 + @future = Dispatch::Future.new { sleep 0.01; @result = Math.sqrt(2**10) } end describe :new do - it "should return an Future for tracking execution of the passed block" do + it "should return a Future for tracking execution of the passed block" do @future.should be_kind_of Dispatch::Future - future = Dispatch.future { Math.sqrt(2**10) } - future.should be_kind_of Dispatch::Future end + + it "should return an instance of Dispatch::Group" do + @future.should be_kind_of Dispatch::Group + end end - - describe :call do - it "should wait Synchronously to return value" do - @future.call.should == 2**5 + + describe :join do + it "should wait until execution is complete" + @result.should == 0 + @future.join + @result.should == 2**5 end + end - it "should invoke passed block Asynchronously with returned value " do - $global = 0 - @future.call {|v| $global = v} - while $global == 0 do; end - $global.should == 2**5 + describe :value do + it "should return value when called Synchronously" do + @future.value.should == 2**5 end + + it "should invoke passed block Asynchronously with return value" do + @fval = 0 + @future.value {|v| @fval = v} + while @fval == 0 do; end + @fval.should == 2**5 + end end + end end \ No newline at end of file
participants (1)
-
source_changes@macosforge.org