The way I do it is to set a global variable in the signal handler, then have the loop watch for it. So like

__gshared bool terminated = false;
extern(C) void handleSigTerm(int) { terminated = true; }

void main() {
    while(!terminated) {
          if(select() < 0)
if(errno == EINTR) continue; // let the loop check the flag again
          // the rest of the stuff
    }

    // do normal cleanup here, and as the functions return
    // naturally they will do unwinding.
}



Of course, with this strategy, if there's some long operation running inside the loop it won't get a chance to check the flag.... how you handle that is up to you. Maybe check that flag from time to time and throw an exception from work functions if it is set.


But there's no convenient way to exit from the handler itself while doing unwinding. You can exit, sure (use the C exit function), and the OS will clean up a lot of stuff but D destructors won't be called that way.

Reply via email to