When I need to get a queue-protected result into a local in code that is concurrent (so I can't use an ivar) is a pointer the best (only) way to get the result of a sync block? Assuming I don't want to factor out a method object. ex: result_p = Pointer.new(:id) some_queue.sync do result_p.assign(value_protected_by_queue) end result = result_p[0] it's not very ruby-ish... Cheerio, Michael Johnston lastobelus@mac.com On 2011-01-26, at 2:50 PM, Laurent Sansonetti wrote:
On Jan 26, 2011, at 12:49 AM, Charles Oliver Nutter wrote:
On Mon, Jan 24, 2011 at 11:13 AM, Joshua Ballanco <jballanc@gmail.com> wrote:
Regarding the potential bug...well...where to begin? So, yes, MacRuby blocks have the same semantics as regular Ruby blocks, *except* when they are dispatched through GCD. In that case, ivars are shared, but local variable get copied. I'm sure Laurent can explain why better than I, but it has to do with the semantics of libdispatch and the uncertainty inherent in when a dispatched block or function will execute (i.e. if local variables were not copied during dispatch, they might go out of scope and be collected before GCD ever gets around to running the code).
Wow, that's very surprising. I'm not sure I agree with bending Ruby semantics so drastically, even to help concurrency. Or at least, I'd expect other threaded scenarios to be consistent:
~ ➔ ruby -ve "a = 0; Thread.new { a += 1 }.join; p a" MacRuby 0.8 (ruby 1.9.2) [universal-darwin10.0, x86_64] 1
~ ➔ ruby -ve "a = 0; q = Dispatch::Queue.concurrent; q.sync {a += 1}; p a" MacRuby 0.8 (ruby 1.9.2) [universal-darwin10.0, x86_64] 0
The implicitness in being able to mutate the surrounding scope is certainly problematic. This is one reason Java's anonymous inner classes require that referenced variables be declared final...to indicate they can't be mutated by the body of the anonymous inner class's methods.
The result is that people end up using one-element arrays and the like, but people find ways around anything.
So I suppose this applies to anything in the surrounding scope, including visibility, $~, and so on?
No, only locals and dynamic (block) variables.
To be honest I always disliked this semantic change too. I think it was a mistake to add it. It will probably be reverted for 1.0.
Laurent _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel