Hey Ernest,

Oh okay, and now that code makes more sense :-D
I'm out of my depth here as I really don't understand GCD nor have I looked 
into your GCD library. 

I can only think of one thing, really, and that is to make "i" available as a 
block parameter.
The variable would then be block-local, but you would still enjoy the benefits 
of closures.

As I understand it, you don't want any mutations to "i" to exist outside the 
thread you're executing. 
My 2 cents. Sorry if it is not useful to you.

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


On 15 Jul 2010, at 22:38, Ernest N. Prabhakar, Ph.D. wrote:

> Hi Rob,
> 
> On Jul 15, 2010, at 2:34 PM, Rob Gleeson wrote:
>> 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.
> 
> 
> Um, I don't think I'm following you.
> 
> The real issue with GCD is that it expects blocks to be closures, which 
> capture their local environment.  For the most part, we can pass Ruby blocks 
> and it will "do the right thing" -- but with one caveat.
> 
> Ruby allows read-write access to captured variables, but GCD can't, because 
> the block may be executed asynchronously long after the current scope is 
> destroyed.  Therefore, we hack the Ruby runtime to 'const-ify' any local 
> variables that are present in a GCD block.
> 
> We don't want to remove -any- reference to local variables, as that would 
> defeat the benefit of using closures.
> 
> -- Ernie P.
> 
>> 
>> 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
> 
> _______________________________________________
> 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