On Fri, Oct 18, 2024 at 06:35:35AM +0200, Anton Lindqvist wrote: > On Thu, Oct 17, 2024 at 03:11:35AM -0600, Claudio Jeker wrote: > > CVSROOT: /cvs > > Module name: src > > Changes by: clau...@cvs.openbsd.org 2024/10/17 03:11:35 > > > > Modified files: > > sys/kern : kern_sig.c kern_synch.c > > sys/sys : signalvar.h > > sys/ufs/mfs : mfs_vfsops.c > > > > Log message: > > Shortcut cursig when called during sleep setup. > > > > Add deep flag as function argument which is used by the sleep API but > > nowhere else. Both calls to sleep_signal_check() should skip the ugly > > bits of cursig(). > > > > In cursig() if deep once it is clear a signal will be taken keep the > > signal on the thread siglist and return. sleep_signal_check() will then > > return EINTR or ERESTART based on the signal context. There is no reason > > to do more in this special case. Especially stop/cont and the ptrace trap > > must be skipped here. Once the call makes it to userret the signal will be > > picked up again and handled in a safe location. > > > > Stopping singals need some additional logic since we don't want to abort > > the sleep just to stop a process. Since our SIGSTOP handling requires > > a major rewrite this will be posponed until then. > > regress/lib/libc/sys/t_waitid.c hanged over here and I suspect this is > the culprit. > > ==== run-t_waitid-6 ==== > 6 Test that waitid(2) handled stopped/continued process loop > ./t_waitid -r 6 > > /home/src/regress/lib/libc/sys/t_waitid.c:231: 'pid > 0' evaluated to false
The problem is that this test uses nanosleep and nanosleep replaces ERESTART with EINTR and so the call fails. Takes many tries for me to hit this since a SIGSTOP needs to race against the nanosleep() call from the child. working on a fix for this. Need to pull in some changes from a bigger diff. -- :wq Claudio