On Tue, Jul 19, 2011 at 12:22:42AM -0400, Dimitry Golubovsky wrote:
>
> Hi,
>
> Looks like I found the reason why longjmp crashes subsequent GC:
>
> StackEvtInterpreter >> initStackPagesAndInterpret
>
> --------------------------------------------------------------
> theStackMemory := self
> cCode: 'alloca(stackPagesBytes)'
> inSmalltalk:
> [stackPages := self stackPagesClass new.
> stackPages initializeWithByteSize: stackPagesBytes for: self].
> --------------------------------------------------------------
>
> Of course longjmp discards this allocation. Next time the interpreter
> is entered, this stack space will be overwritten. Hence the bizarre
> effects.
>
> I haven't tried to work around this; just wandering whether using
> malloc instead of alloca is in any way harmful...
If you use malloc(), then you would also need to call free(), which
might be tricky given that you are longjmp'ing over the situation.
Note that alloca is used in various places in the interpreter and
in plugins, both in the slang and in support code for the various
platforms.
I have not looked at any of the code, but in your earlier message
you described your use of longjmp, based on Andreas' earlier work,
as follows:
1. Set a jmp_buf to to hold the jump target at the start of the
interpret() function
2. longjmp to this jmp_buf in the transferTo function if its argument
is 0 (thus exiting the interpreter once no processes are ready to
run).
I wonder if there is some other approach that you could use to
accomplish this?
Dave