#556: Subsequent calls to dispatch apply improperly access incorrect "self" ---------------------------------------+------------------------------------ Reporter: joshua.balla...@… | Owner: lsansone...@… Type: defect | Status: new Priority: blocker | Milestone: Component: MacRuby | Keywords: GCD ---------------------------------------+------------------------------------ The following code: {{{ class Array def pmap(priority = :default, &block) results = [] results_queue = Dispatch::Queue.new("#{results.object_id}_access_queue") Dispatch::Queue.concurrent(priority).apply(size) do |idx| print "self.object_id #=> #{self.object_id}\n" print "self[idx] #=> #{self[idx]}\n" result = block[self[idx]] print "result #=> #{result}\n" results_queue.async do results[idx] = result end end results_queue.sync {} results end end
test_ary = ('a'..'j').to_a p test_ary print "test_ary.object_id #=> #{test_ary.object_id}\n" p test_ary.pmap {|i| i.upcase } test_ary = (1..10).to_a p test_ary print "test_ary.object_id #=> #{test_ary.object_id}\n" p test_ary.pmap {|i| i**2 } }}} ...generates this output: {{{ ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] test_ary.object_id #=> 8594638688 self.object_id #=> 8594638688 self[idx] #=> a result #=> A self.object_id #=> 8594638688 self[idx] #=> e result #=> E self.object_id #=> 8594638688 self[idx] #=> f result #=> F self.object_id #=> 8594638688 self[idx] #=> g result #=> G self.object_id #=> 8594638688 self[idx] #=> h result #=> H self.object_id #=> 8594638688 self[idx] #=> i self.object_id #=> 8594638688 result #=> I self[idx] #=> b self.object_id #=> 8594638688 self[idx] #=> j result #=> J result #=> B self.object_id #=> 8594638688 self[idx] #=> c result #=> C self.object_id #=> 8594638688 self[idx] #=> d result #=> D ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] test_ary.object_id #=> 8591101024 self.object_id #=> 8594638688 self[idx] #=> a result #=> A self.object_id #=> 8591101024 self.object_id #=> 8591101024 self[idx] #=> 2 self[idx] #=> 3 result #=> 9 self.object_id #=> 8594638688 result #=> 4 self.object_id #=> 8591101024 self[idx] #=> f self.object_id #=> 8591101024 self[idx] #=> 4 self.object_id #=> 8591101024 self[idx] #=> 5 result #=> F self[idx] #=> 8 self.object_id #=> 8591101024 result #=> 16 self.object_id #=> 8591101024 self.object_id #=> 8591101024 result #=> 25 result #=> 64 self[idx] #=> 9 self[idx] #=> 10 self[idx] #=> 7 result #=> 81 result #=> 100 result #=> 49 [nil, 4, 9, 16, 25, nil, 49, 64, 81, 100] }}} Notice that, in the second call to #pmap, some of the iterations of Dispatch::Queue#apply evaluate "self" as the "self" from the first call to #pmap -- Ticket URL: <http://www.macruby.org/trac/ticket/556> MacRuby <http://macruby.org/> _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel