svn commit: r200274 - head/lib/libc/gen

John Baldwin jhb at freebsd.org
Tue Dec 8 14:43:40 PST 2009


On Tuesday 08 December 2009 5:10:28 pm Jilles Tjoelker wrote:
> On Tue, Dec 08, 2009 at 04:45:37PM -0500, John Baldwin wrote:
> > On Tuesday 08 December 2009 3:48:06 pm Jilles Tjoelker wrote:
> > > Author: jilles
> > > Date: Tue Dec  8 20:48:06 2009
> > > New Revision: 200274
> > > URL: http://svn.freebsd.org/changeset/base/200274
> 
> > > Log:
> > >   sem_init(3): document process shared semaphores and their restrictions
> 
> > I think the other language was more accurate.  The new language has
> > far less detail such as no longer documenting EPERM.
> 
> It seems that EPERM longer happens, at least not for any process-shared
> semaphore at all.

This does seem true.

> What's missing is the SIGSYS/ENOSYS you'll get if sem.ko is not loaded,
> and you're requesting a process-shared semaphore or not linking with
> the threading library.

This is probably less important since it is now enabled by default in HEAD.
I think ENOSYS is a bit of a special case as we don't document it for other
optional services such as SYSV IPC primitives.

> > I think it is also quite accurate to say that the current
> > implementation is not capable of process shared semaphores.  Several
> > things would need to be changed including moving away from using file
> > descriptors.
> 
> There are some lines of code dedicated to make it work, and some people
> seem to use it, although they notice that it does not work very well.
> This topic has come up on the mailing lists several times recently.

No, it doesn't really work.  It happens to work across a fork(), but that is
the only case.  In particular, you can't mmap() a file (or a shared memory
descriptor) and sem_init() a region of it and expect another process to be
able to use it directly via sem_wait() (which is what pshared is supposed to 
mean):

<quote source="Open Group">
If the pshared argument has a non-zero value, then the semaphore is shared 
between processes; in this case, any process that can access the semaphore sem 
can use sem for performing sem_wait(), [TMO] [Option Start] sem_timedwait(), 
[Option End] sem_trywait(), sem_post(), and sem_destroy() operations.
</quote>

The fact that we don't fail attempts to use pshared outright is probably 
dubious.  They cannot possibly work as currently implemented aside from fork() 
since the structure embeds a file descriptor and file descriptor indices are a 
per-process namespace, not a global namespace.

-- 
John Baldwin


More information about the svn-src-head mailing list