Handle ECANCELED in the same way as EINTR to work around the Posix
violation in the NetBSD's implementation.
--- /dev/null
+Handle :data:`~errno.ECANCELED` in the same way as :data:`~errno.EINTR` in
+:func:`signal.sigwaitinfo` on NetBSD.
err = sigwaitinfo(&sigset, &si);
Py_END_ALLOW_THREADS
} while (err == -1
- && errno == EINTR && !(async_err = PyErr_CheckSignals()));
+ && (errno == EINTR
+#if defined(__NetBSD__)
+ /* NetBSD's implementation violates POSIX by setting
+ * errno to ECANCELED instead of EINTR. */
+ || errno == ECANCELED
+#endif
+ ) && !(async_err = PyErr_CheckSignals()));
if (err == -1)
return (!async_err) ? PyErr_SetFromErrno(PyExc_OSError) : NULL;