On Tuesday, 18 September 2018 at 19:45:18 UTC, SrMordred wrote:
On Tuesday, 18 September 2018 at 03:09:18 UTC, Mike Parker
wrote:
On Tuesday, 18 September 2018 at 00:24:23 UTC, SrMordred wrote:
Yes, i'm using signal(SIGSEGV, sigfn_t func), it catches
correctly, but end the execution after.
I find the alternatives of setjmp/longjmp and sigaction, but
none are avaliable on windows afaik.
setjmp/longjmp are available on windows (image loaders using
libpng, lua, quake3, and lots of old C code make use of them):
https://msdn.microsoft.com/en-us/library/xe7acxfb.aspx?f=255&MSPPError=-2147217396
https://msdn.microsoft.com/en-us/library/3ye15wsy.aspx
You can declare the functions in your own code and they should
link just fine. It would be helpful if you also submit a PR to
add them to DRuntime for Windows.
As for sigaction, a quick search suggests it isn't available
(and it doesn't show up in MSDN):
https://stackoverflow.com/questions/32389905/sigaction-and-porting-linux-code-to-windows
I think this may be going beyond my knowledge ;/
(Trying to follow setjmp.h, donĀ“t have experience doing this)
enum _SIGSET_NWORDS = (1024 / (8 * (ulong.sizeof)));
struct __sigset_t
{
ulong[_SIGSET_NWORDS] __val;
}
struct __jmp_buf_tag
{
long[8] __jmpbuf;
int __mask_was_saved;
__sigset_t __saved_mask;
};
alias __jmp_buf_tag[1] jmp_buf;
extern (C) @nogc nothrow int setjmp(ref jmp_buf) ;
extern (C) @nogc nothrow void longjmp(ref jmp_buf, int);
I think your definition should look more like this:
Notes:
- modulename using druntime path.
- Not 100% sure about all the sizes (lifted from winsdk10).
- long/c_long
- JBLEN or JBLEN+1
- Compatible with MARS setjmp.h x86 sizes
------
module core.sys.windows.setjmp;
extern (C):
@system:
nothrow:
@nogc:
private import core.sys.windows.config;
import core.stdc.signal;
version ( Windows ):
version( X86 )
{
enum _JBLEN 16
struct _jmp_buf { int[_JBLEN + 1] _ssjb; }
}
else version( X86_64)
{
enum _JBLEN 16
struct {
long[2] part; // c_long ?
} float128;
struct _jmp_buf { float128[_JBLEN] _sjb;
}
else version (AArch64)
{
enum _JBLEN 28
struct _jmp_buf { int[_JBLEN] _sjb; }
}
/*
else version (IA64)
{
enum _JBLEN 33
struct {
long _high;
long _low;
} float128;
struct _jmp_buf { float128[_JBLEN] _sjb;
}
*/
else
static assert(0, "Not implemented for platforms other than
X86, yet");
alias _jmp_buf[_JBLEN] jmp_buf;
int setjmp(ref jmp_buf);
void longjmp(ref jmp_buf, int);
--------
Only the exact size of the jmp_buf is important (not the details
about the content). We only call a function with it, we never
look inside.