Oops, by the way, I just meant passing variables that would be written to. It'd require the user to be explicit about what variables they are going to write to, though.
Rob ---- http://robgleeson.github.com Website http://github.com/robgleeson GitHub r...@flowof.info E-Mail On 15 Jul 2010, at 22:47, Rob Gleeson wrote: > 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 _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel