Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Sep 2010 00:55:24 +0200
From:      Jilles Tjoelker <jilles@stack.nl>
To:        David Xu <davidxu@freebsd.org>
Cc:        freebsd-threads@freebsd.org
Subject:   Re: sigwait() cancellation point
Message-ID:  <20100909225524.GC48144@stack.nl>
In-Reply-To: <4C88EF47.4010906@freebsd.org>
References:  <20100906220041.GA4729@stack.nl> <4C86787E.6070908@freebsd.org> <20100908175609.GA30144@stack.nl> <4C88EF47.4010906@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100909225524.GC48144>