P
Pete
I've run into a problem that sounds superficially similar to the
one that Noah Easterly posted around a month ago, but I don't think
the suggested solutions work for me.
Here's the sitch... I'm working on an extension to handle real-time
MIDI, and my concept is to have an 'each' method for the MidiIn class
that will just feed events to a block as they arrive. This is implemented
by the 'each' (C++) function making the block available to a callback
function, which is itself called by the Midi handler for each arriving
event, and does a rb_yield(). The original function is meanwhile just
sitting on a semaphore, and will return when that is released.
This all works fine, as the semaphore can be released either by a
particular yield return value or by a timeout, *unless* there is
a 'break' in the invoked block. The base problem is that -- although
I can catch the break with an 'ensure' for instance -- the top-level
'each' is still sitting on the semaphore until that is released,
but as the break has *already* popped the stack, when that function
*does* terminate it just segfaults!
What I seem to need to do is to prevent the break bypassing the
normal return, but I can't see any way to do that. Otherwise I guess
I just have to put a notice in large letters: "DO NOT USE BREAK!" -/)
-- Pete --
one that Noah Easterly posted around a month ago, but I don't think
the suggested solutions work for me.
Here's the sitch... I'm working on an extension to handle real-time
MIDI, and my concept is to have an 'each' method for the MidiIn class
that will just feed events to a block as they arrive. This is implemented
by the 'each' (C++) function making the block available to a callback
function, which is itself called by the Midi handler for each arriving
event, and does a rb_yield(). The original function is meanwhile just
sitting on a semaphore, and will return when that is released.
This all works fine, as the semaphore can be released either by a
particular yield return value or by a timeout, *unless* there is
a 'break' in the invoked block. The base problem is that -- although
I can catch the break with an 'ensure' for instance -- the top-level
'each' is still sitting on the semaphore until that is released,
but as the break has *already* popped the stack, when that function
*does* terminate it just segfaults!
What I seem to need to do is to prevent the break bypassing the
normal return, but I can't see any way to do that. Otherwise I guess
I just have to put a notice in large letters: "DO NOT USE BREAK!" -/)
-- Pete --