The goal is pretty simple. No crash, that's it. Optionally, releasing resource as much as possible. But the resource in this case is not about Scheme world or Sagittarius created, it's OS resource such as allocated stack or so.
Yes, it's the problem. The problem was sometimes it crashed with
0xC0000005(access violation, SEGV in POSIX way). The termination process was described in previous article (Safer thread termination) . The cause, in short, was interrupting
Ripmay break call stack frame.
As my conclusion, if the Scheme process went into deep inside of C function call, then the program counter is overwritten, the call stack may get broke. So when the process tries to return from
RaiseExceptionhowever there is no place to return or returning invalid address. (This may not be true but seems like it.)
Comparing stack pointer was not enough
In previous article, I've written to do it. It does prevent the error when the thread has already returned from entry point however it didn't resolve returning from deep stack address. So I need to find one more thing.
The issue is breaking call stack. Means, if I can restore it until the thread entry function is called, then the call stack is not broken and can return properly.
If I need to restore the stack frame of certain point, then
longjmpseem the things I need to use, instead of calling
RaiseException. So I've put
setjmpbefore calling Scheme world process. Then the
thread-terminate!interrupts the process to the C function which calls
Not a perfect solution
Unfortunately, this isn't a perfect solution. It works most of the time and, I think, should be good enough (so far I don't get crash in my test case). However, the following code may not work:
(thread-terminate! (thread-start! (make-thread (lambda () #t))))The problem of this piece of code is that the thread may not be terminated. If the thread couldn't reach the point where
setjmpis called, then
jmp_buf. Or the thread wouldn't be terminated if it didn't reach the internal thread entry point. Who writes this crap? Who knows.
This may not be a perfect solution but at least less possibility to get crashed. Thus it's safer than before. So, for now, I'm happy with it.