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 <[email protected]>wrote: > #447: GCD Crashes > > ------------------------------+--------------------------------------------- > Reporter: p...@… | Owner: lsansone...@… > 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 > [email protected] > http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel >
_______________________________________________ MacRuby-devel mailing list [email protected] http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
