Hi Pete,

I imagine that this bug is similar to one I posted (420). I was getting similar behaviour and things much improved when I unrolled the loop. Maybe you could try that? (or try what i suggest below).

I am waiting with bated breath to see Laurent's GCD code in the macruby version of Sinatra.

I imagine that it is actually quite hard to turn ruby blocks into C blocks - normally everything would be copied to the stack with C blocks - unless manually copied to the heap - but probably in macruby they have to be immediately copied to the heap. And then what to do with all the scoped (but in C static) variables? In C there are complicated inferred return block types which sometimes work, automatic releases sometimes, sometimes manual releases are necessary of queues (i.e GCD does not use GC) - it all seems rather complicated.

There is a note somewhere I believe in the macruby gcd code about how it might be bad to access instance variables from a queue - none the less when using Laurent's web_server.rb code as model - the threading bit - and doing something similar in GCD - I got something working ok.

Using threads (as per the example) and GCD I could get some speed improvements - however on a 2 core  machine - those improvements were not much - i actually don't expect that much on only 2 cores - since there is a hell of a lot of other threading happening (eg GC) even if we don't consider the demands that the rest of the OS is putting on the processor.

So with 2 cores I found best results to limit to two GCD serial queues.
cpuCount = NSProcessInfo.processInfo.processorCount 
is a helpful command in this regard.

I would be very interested to see your results if you try this out. One thing to watch out for variable allocations within the queue block - the variables might not be instantly available (like the next line).

From what i have read there are many resources in the OS which can stall when there are too many processes trying to access them - so perhaps a good way in the future is actually to wrap all resource access in semaphores - adjusted by cpu count.


Cheers,
J





On Mon, Nov 23, 2009 at 1:27 AM, MacRuby <ruby-noreply@macosforge.org> wrote:
#447: GCD Crashes
------------------------------+---------------------------------------------
 Reporter:  pete@…            |       Owner:  lsansonetti@…
    Type:  defect            |      Status:  new
 Priority:  major             |   Milestone:  MacRuby 0.5
Component:  MacRuby           |    Keywords:
------------------------------+---------------------------------------------
 I've been playing with the GCD support in 0.5, and I can get it to
 misbehave consistently with a fairly simple script (attached.)

 Various things happen when this script is run. Sometimes I get a crash
 with the assertion below, sometimes I get a seg fault.

 Assertion failed: ((arity.max == -1) | | (argc <= arity.max)), function
 !__rb_vm_fix_args, file dispatcher.cpp, line 29.

 Sometimes it runs mostly ok, but spits out NaN instead of the correct
 value at random intervals.

 Something to do with the block being prematurely garbage collected
 perhaps?

--
Ticket URL: <http://www.macruby.org/trac/ticket/447>
MacRuby <http://macruby.org/>

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