[macruby-changes] [3364] MacRuby/trunk/lib/dispatch
source_changes at macosforge.org
source_changes at macosforge.org
Fri Jan 29 15:40:05 PST 2010
Revision: 3364
http://trac.macosforge.org/projects/ruby/changeset/3364
Author: ernest.prabhakar at gmail.com
Date: 2010-01-29 15:40:04 -0800 (Fri, 29 Jan 2010)
Log Message:
-----------
Redid Dispatch actor and enumerable
Modified Paths:
--------------
MacRuby/trunk/lib/dispatch/actor.rb
MacRuby/trunk/lib/dispatch/dispatch.rb
MacRuby/trunk/lib/dispatch/enumerable.rb
Modified: MacRuby/trunk/lib/dispatch/actor.rb
===================================================================
--- MacRuby/trunk/lib/dispatch/actor.rb 2010-01-29 23:40:02 UTC (rev 3363)
+++ MacRuby/trunk/lib/dispatch/actor.rb 2010-01-29 23:40:04 UTC (rev 3364)
@@ -4,6 +4,10 @@
# 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
+
+ instance_methods.each |method|
+ undef_method(method) unless method =~ /__(.+)__|method_missing/
+ end
# Create an Actor to wrap the given +actee+,
# optionally specifying the default +callback+ queue
@@ -11,10 +15,10 @@
@actee = actee
@callback_default = callback || Dispatch::Queue.concurrent
@q = Dispatch::Queue.new("dispatch.actor.#{actee}.#{object_id}")
- __reset!
+ __reset!__
end
- def __reset!
+ def __reset!__
@callback = @callback_default
@group = nil
end
@@ -28,6 +32,13 @@
def _with(group)
@group = group
end
+
+ # Wait until the internal private queue has completed execution
+ # then returns the +actee+ delegate object
+ def _done
+ @q.sync { }
+ @actee
+ end
def method_missing(symbol, *args, &block)
if block_given? || not group.nil?
@@ -36,7 +47,7 @@
retval = @actee.__send__(symbol, *args)
callback.async { block.call(retval) } if not callback.nil?
end
- return __reset!
+ return __reset!__
else
@retval = nil
@q.sync { @retval = @actee.__send__(symbol, *args) }
Modified: MacRuby/trunk/lib/dispatch/dispatch.rb
===================================================================
--- MacRuby/trunk/lib/dispatch/dispatch.rb 2010-01-29 23:40:02 UTC (rev 3363)
+++ MacRuby/trunk/lib/dispatch/dispatch.rb 2010-01-29 23:40:04 UTC (rev 3364)
@@ -2,6 +2,13 @@
# directly from the top-level Dispatch module
module Dispatch
+ # Returns a new serial queue with a unique label based on
+ # the ancestor chain and ID of +obj+
+ def queue_for(obj)
+ label = obj.class.ancestors.reverse.join(".").downcase
+ Dispatch::Queue.new("#{label}.%x" % obj.object_id)
+ end
+
# Run the +&block+ asynchronously on a concurrent queue
# of the given (optional) +priority+
def async(priority=nil, &block)
Modified: MacRuby/trunk/lib/dispatch/enumerable.rb
===================================================================
--- MacRuby/trunk/lib/dispatch/enumerable.rb 2010-01-29 23:40:02 UTC (rev 3363)
+++ MacRuby/trunk/lib/dispatch/enumerable.rb 2010-01-29 23:40:04 UTC (rev 3364)
@@ -20,11 +20,14 @@
grp.wait
end
- # Parallel +inject+ (only works if commutative)
- def p_inject(initial=0, &block)
+ # Parallel +inject+
+ # Requires initial value since 'first' no longer special.
+ # Only works if result doesn't depend on the order elements are processed.
+ def p_inject(initial, &block)
@result = Dispatch.wrap(initial)
self.p_each { |obj| block.call(@result, obj) }
- @result
+ @result._done
+ return @result
end
# Parallel +collect+
@@ -36,19 +39,25 @@
result
end
- # Parallel +detect+
+ # Parallel +select+; will return array of objects for which
+ # +&block+ returns true.
+ # Useful if the test block is very expensive to run
+ def p_find_all(&block)
+ @found_all = Dispatch.wrap(Array)
+ self.p_each { |obj| @found_all << obj if block.call(obj) }
+ @found_all._done # will this leak?
+ end
+
+ # Parallel +detect+; will return -one- match for +&block+
+ # but it may not be the 'first'
+ # Useful if the test block is very expensive to run
def p_find(&block)
- @done = false
- @result = nil
- self.p_each_with_index do |obj, i|
- if not @done
- if true == block.call(obj)
- @done = true
- @result = obj
- end
- end
+ @found = Dispatch.wrap(nil)
+ self.p_each do |obj|
+ found? = @found.nil? ? block.call(obj) : nil
+ @found = obj if found? and @found.nil?
end
- @result
+ @found._done # will this leak?
end
end
end
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100129/291fc964/attachment-0001.html>
More information about the macruby-changes
mailing list