Hey again,

Sorry just had another idea - since it seems like you don't want the enclosing 
scope/context to be evaluated in a thread, you could
try using instance_eval in a "blank" context where you won't have surrounding 
variables available to your block.

That, and passing arguments to the block as parameters should work but I'm way 
out of my depth as far as GCD goes.

Rob
----
http://robgleeson.github.com    Website
http://github.com/robgleeson   GitHub
r...@flowof.info                                E-Mail


On 15 Jul 2010, at 22:29, Rob Gleeson wrote:

> Hey ernest,
> 
> I haven't got any experience with GCD but wouldn't it make more sense if 
> block arguments were received as parameters to the block?
> This would make the variables block-local.
> 
> Dispatch::Queue.new("i").sync { |i| # block local 'i' }
> 
> Remember blocks in Ruby are closures, too. 
> 
> Rob
> ----
> http://robgleeson.github.com  Website
> http://github.com/robgleeson   GitHub
> r...@flowof.info                              E-Mail
> 
> 
> On 15 Jul 2010, at 21:47, MacRuby wrote:
> 
>> #795: GCD inconsistently copies local variables inside blocks
>> ----------------------------------------+-----------------------------------
>> Reporter:  ernest.prabha...@…          |       Owner:  lsansone...@…        
>>    Type:  defect                      |      Status:  new                  
>> Priority:  critical                    |   Milestone:                       
>> Component:  MacRuby                     |    Keywords:                       
>> ----------------------------------------+-----------------------------------
>> The expectation is that Ruby blocks will have their local variables copied
>> before being passed to GCD, to avoid errors from accessing them after they
>> are destroyed.
>> 
>> However, that does not seem to always happen.  For example:
>> 
>>    $ macruby -e 'i=0; Dispatch::Queue.new("i").sync {i = 42}; puts i'
>> 
>> returns '0' as expected.  However, this does not:
>> 
>>    $ macirb
>>    irb(main):001:0> i=0; Dispatch::Queue.new("i").sync {i = 42}; puts i
>>    42
>>    => nil
>> 
>> It appears to be copied properly in the block_spec.rb test:
>> 
>>    it "should create const copies of dynamic (local) variables" do
>>      i = 42
>>      @q.sync {i = 1}
>>      i.should == 42
>>    end
>> 
>> But not in the README.rdoc for the dispatch module (aka
>> dispatch_methods.rb sample):
>> 
>>    n = 0
>>    job = Dispatch::Job.new { n = 21 }
>>    job.join
>>    puts "n (after): #{n} => 0?!?" # [returns 21, not 0]
>> 
>> Any suggestions?
>> 
>> -- 
>> Ticket URL: <http://www.macruby.org/trac/ticket/795>
>> MacRuby <http://macruby.org/>
>> 
>> _______________________________________________
>> MacRuby-devel mailing list
>> MacRuby-devel@lists.macosforge.org
>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
> 
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel@lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

Reply via email to