I'm playing with fork() with druntime initialized after the fork, but I found that I can't call rt_init/rt_term to cleanup the runtime multiple times.
Simple test case:
extern extern(C) int _d_run_main(int, char**, void*);
extern (C) int rt_init();
extern (C) int rt_term();
extern(C) int main(int argc, char** argv)
{
auto res = _d_run_main(argc, argv, &testmain);
res = _d_run_main(argc, argv, &testmain);
return res;
}
int testmain(string[] args)
{
return 1;
}
Backtrace:
#0 0x00000000004327af in _d_initMonoTime ()
#1 0x000000000042a553 in rt_init ()
#2 0x0000000000427c50 in rt.dmain2._d_run_main(int, char**, extern(C) int(char[][]) function).runAll() ()
#3 0x0000000000427be8 in rt.dmain2._d_run_main(int, char**, extern(C) int(char[][]) function).tryExec(scope void() delegate) ()
#4 0x0000000000427b50 in _d_run_main ()
#5 0x0000000000427896 in main ()
Is this the expected behavior?
I guess that the problem is at least here: https://github.com/dlang/druntime/blob/8fd52019826259dc92ab712f4b37a3f0ea4d8265/src/core/time.d#L2514
Tried with dmd-2.082.0
Comment #1 by chalucha — 2018-09-25T20:46:19Z
Other test case:
extern extern(C) int _d_run_main(int, char**, void*);
extern (C) int rt_init();
extern (C) int rt_term();
extern(C) int main(int argc, char** argv)
{
rt_init();
rt_term();
rt_init(); // SIGILL
rt_term();
return 0;
}
Comment #2 by robert.schadek — 2024-12-07T13:38:39Z