sigwait() cancellation point

Jilles Tjoelker jilles at stack.nl
Thu Sep 9 22:55:25 UTC 2010


On Thu, Sep 09, 2010 at 02:29:27PM +0000, David Xu wrote:
> Jilles Tjoelker wrote:
> > On Tue, Sep 07, 2010 at 05:38:06PM +0000, David Xu wrote:
> >> Jilles Tjoelker wrote:
> >>> Our sigwait() implementation may not be POSIX-compliant as it returns
> >>> EINTR when it is interrupted by a caught signal. (Unfortunately I can
> >>> only find this in SUSv4 in the Rationale, B.2.3 Error Numbers,
> >>> Disallowing Return of the [EINTR] Error Code; the sigwait() page in XSH
> >>> does not list an [EINTR] error condition, but does not prohibit one
> >>> either like pthread_mutex_lock() and various others do.)

> >> A system call can not return EINTR is not flexible, I think why don't
> >> we fix it in libc and libthr, but let kernel returns EINTR?

> >> I have worked out a patch:

> >> http://people.freebsd.org/~davidxu/patch/sigwait.diff

> > The idea and patch seem sensible. Some man page changes seem in order
> > though: sigwaitinfo.2 should mention this difference between sigwait()
> > and sigwaitinfo() more explicitly.

> problem is I still want to know which OS does not return EINTR ?
> it seems I can not find one on net, so is it an accident of the
> specification group?

Recent versions of glibc do this. They implement
sigwait/sigwaitinfo/sigtimedwait based on a single extended sigtimedwait
system call; sigwait differs from the others by retrying when it gets
EINTR. This is not documented very well in man pages (for example, man
sigwait might get you an ancient LinuxThreads man page).

One reference:
http://lkml.indiana.edu/hypermail/linux/kernel/0508.0/0181.html

Google also provides various examples of applications that treated any
sigwait() error as fatal and needed to be changed to work reliably on
systems where sigwait() may return EINTR (not just FreeBSD).

-- 
Jilles Tjoelker


More information about the freebsd-threads mailing list