[chuck-users] 147th shred removed...segmentation fault? (Ryan Supak)

Ryan Supak ryansupak at gmail.com
Mon Jun 23 17:22:54 EDT 2014


Thanks for the thorough reply. I'm doing one safer, even than "voice
stealing": each Spork is, at most, reconfiguring a single global oscillator.

Attached is the entire source. Lines 128-142 contain initialization code
that creates a Shred to make an LED blink by sending a MIDI message within
a time loop, and another Shred that sets the frequency of an LFO, polls it
every ten milliseconds, and sends some Serial output based on the LFO
position.

Anytime that the parameters controlling the blinking rate and the LFO
rate/phase have occasion to change (when MIDI events come in to change
them), the "old" Shreds are Machine.Remove'd and they're recreated
immediately following. You can see this at lines 343 and 589.

Notice that the LFOMod function and the Blink function aren't creating
anything new (with the exception of local arguments being instantiated),
but if you think those local arguments could be causing my problem I'll
eliminate them too.

Please see the attached.
rs


On Mon, Jun 23, 2014 at 11:59 AM, Perry R Cook <prc at cs.princeton.edu> wrote:

> I have lots of programs that spork hundreds or thousands
> of shreds without this error.  So, without seeing your
> code, my guesses (and questions) are as follows:
>
> Are you running this on a small memory architecture? Since
> you say headless, I'm guessing maybe Raspberry Pi?  It
> could be that you're running out of memory, so see next
> question.
>
> Does the shred that you're sporking declare new UGs or
> require memory to be allocated (arrays, lots of string
> manipulation, etc.)?  In general, this is a bad idea if you
> can avoid it.  ChucK does no garbage collection, which
> means that you need to be cautious about declaring memory.
>
> So even a shred as simple as:
>
> fun void mySine()  {
>     SinOsc s => dac;
>     Math.random2f(100,1000) => s.freq;
>     second => now;
>     s =< dac;
> }
>
> will eat up memory, because even though the SinOsc
> is unchucked and never computes again, the memory
> for that structure is still around.  We want, someday
> to make ChucK a proper garbage collecting language,
> but it's hard, especially for real-time systems.
>
> If this turns out to be your issue, then one way to
> handle this is to make a global pool of fixed
> resources and have your shred grab from that.
> Like classic "round robin voice stealing" in
> synthesizers:
>
> SinOsc s[100];
> 0 => int next2Use;
>
> fun void mySine() {
>     next2Use => int thisOne;
>     1 +=> next2Use;
>     if (next2Use > 99) 0 => next2Use;
>     s[thisOne] => dac;
>     Math.random2f(100,1000) => s[thisOne].freq;
>     second => now;
>     s[thisOne] =< dac;
> }
>
> // to test:
> while (1) {
>     Math.random2f(0.01,0.1) :: second => now;
>     spork ~ mySine();
> }
>
> I just fired up a few dozen of these running in
> parallel, VM showed 2600 total shreds running,
> no problem (and no clicks or dropouts!!).
>
> Hope this helps, if none of this applies, then you
> may have discovered a strange bug.  Source code please,
> and we can all scratch our heads on it.
>
>  Thanx!!  PRC
>
>
> Today's Topics:
>
>    1. 147th shred removed...segmentation fault? (Ryan Supak)
> _______________________________________________
> chuck-users mailing list
> chuck-users at lists.cs.princeton.edu
> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cs.princeton.edu/pipermail/chuck-users/attachments/20140623/0b1489f8/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: rsDMX.ck
Type: application/octet-stream
Size: 22362 bytes
Desc: not available
URL: <http://lists.cs.princeton.edu/pipermail/chuck-users/attachments/20140623/0b1489f8/attachment-0001.obj>


More information about the chuck-users mailing list