[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#6037) errno in signal handlers



h.b.furuseth@usit.uio.no wrote:
> Full_Name: Hallvard B Furuseth
> Version: HEAD, RE24
> OS:
> URL:
> Submission from: (NULL) (129.240.6.233)
> Submitted by: hallvard
>
>
> Signal handlers slapd/daemon.c:slap_sig_shutdown()/slap_sig_wake() need
> to save/restore errno, since they call functions that can modify errno.
>
> And/or possibly they need sock_errno() - sock_errset() from ac/socket.h,
> since they use tcp_write()?  I don't know if that's safe inside signal
> handlers, or if Windows itself saves/restores this code around signal
> handlers.

Windows doesn't really have signals in the first place. SIGTERM/SIGINT are 
simulated by the C runtime library, none of the other signals are really 
supported... All of the "support" is synchronous only - can only be invoked by 
raise(). I don't think there's any issue here.

(An exception - I wrote a patch for the MSYS 1.11 runtime to propagate 
SIGINT/SIGTERM to other processes. The patch only works on win32, not win64 
because I never got a decent win64 build environment working... But if you're 
using MSYS, it is possible to send these signals to a running slapd and have 
it shutdown cleanly. Otherwise, signals don't really exist for native Windows 
apps...)

> slapd/main.c:wait4child() can loop forever after EINTR, since it checks
> for errno even when the waitpid returns 0.  I don't know if there is
> a good reason it does that.  Some of the commits have my name on them
> but I think I copied it from elsewhere.
>
>
> Anyway, I'm doing the minimal changes now: save/restore errno, and
> set errno=0 in each loop iteration instead of before the loop.
> Anyone with better ideas can take it from there.

Good enough. Closing this ITS.

-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/