Fix signalfd polling.
The signalfd descriptors otherwise always show as available. This can lead programs to spin, assuming they are looking to see what signals are pending. Updates #139 PiperOrigin-RevId: 274017890
This commit is contained in:
parent
14952d01fb
commit
f8b1859319
|
@ -121,7 +121,10 @@ func (s *SignalOperations) Read(ctx context.Context, _ *fs.File, dst usermem.IOS
|
|||
|
||||
// Readiness implements waiter.Waitable.Readiness.
|
||||
func (s *SignalOperations) Readiness(mask waiter.EventMask) waiter.EventMask {
|
||||
return mask & waiter.EventIn
|
||||
if mask&waiter.EventIn != 0 && s.target.PendingSignals()&s.Mask() != 0 {
|
||||
return waiter.EventIn // Pending signals.
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
|
|
|
@ -312,6 +312,23 @@ TEST(Signalfd, KillStillKills) {
|
|||
EXPECT_EXIT(tgkill(getpid(), gettid(), SIGKILL), KilledBySignal(SIGKILL), "");
|
||||
}
|
||||
|
||||
TEST(Signalfd, Ppoll) {
|
||||
sigset_t mask;
|
||||
sigemptyset(&mask);
|
||||
sigaddset(&mask, SIGKILL);
|
||||
FileDescriptor fd =
|
||||
ASSERT_NO_ERRNO_AND_VALUE(NewSignalFD(&mask, SFD_CLOEXEC));
|
||||
|
||||
// Ensure that the given ppoll blocks.
|
||||
struct pollfd pfd = {};
|
||||
pfd.fd = fd.get();
|
||||
pfd.events = POLLIN;
|
||||
struct timespec timeout = {};
|
||||
timeout.tv_sec = 1;
|
||||
EXPECT_THAT(RetryEINTR(ppoll)(&pfd, 1, &timeout, &mask),
|
||||
SyscallSucceedsWithValue(0));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
} // namespace testing
|
||||
|
|
Loading…
Reference in New Issue