cvs commit: src/share/man/man9 Makefile condvar.9 lock.9 mi_switch.9 mtx_pool.9 mutex.9 rwlock.9 sleep.9 sleepqueue.9 sx.9 thread_exit.9 src/sys/kern kern_synch.c src/sys/sys mutex.h rwlock.h sleepqueue.h sx.h systm.h

John Baldwin jhb at
Fri Mar 9 22:47:58 UTC 2007

On Friday 09 March 2007 17:41, John Baldwin wrote:
> jhb         2007-03-09 22:41:01 UTC
>   FreeBSD src repository
>   Modified files:
>     share/man/man9       Makefile condvar.9 lock.9 mi_switch.9 
>                          mtx_pool.9 mutex.9 rwlock.9 sleep.9 
>                          sleepqueue.9 sx.9 thread_exit.9 
>     sys/kern             kern_synch.c 
>     sys/sys              mutex.h rwlock.h sleepqueue.h sx.h 
>                          systm.h 
>   Log:
>   Allow threads to atomically release rw and sx locks while waiting for an
>   event.  Locking primitives that support this (mtx, rw, and sx) now each
>   include their own foo_sleep() routine.
>   - Rename msleep() to _sleep() and change it's 'struct mtx' object to a
>     'struct lock_object' pointer.  _sleep() uses the recently added
>     lc_unlock() and lc_lock() function pointers for the lock class of the
>     specified lock to release the lock while the thread is suspended.
>   - Add wrappers around _sleep() for mutexes (mtx_sleep()), rw locks
>     (rw_sleep()), and sx locks (sx_sleep()).  msleep() still exists and
>     is now identical to mtx_sleep(), but it is deprecated.
>   - Rewrite much of sleep.9 to not be msleep(9) centric.
>   - Flesh out the 'RETURN VALUES' section in sleep.9 and add an 'ERRORS'
>     section.
>   - Add __nonnull(1) to _sleep() and msleep_spin() so that the compiler will
>     warn if you try to pass a NULL wait channel.  The functions already have
>     a KASSERT to that effect.

I don't have a date set for removing msleep(), esp. given it's wide use.
I would like to remove it and all the spl*() functions in 8.0 if we can
swing it.

I also have patches to let condition variables work with rwlocks and sx
locks, but the current implementation results in an API "explosion"
since each of the cv_*wait*() functions grows a cv_*wait*_rw() version for
rwlocks and a cv_*waut*_sx() version for use with sx locks.  One possibility
would be to just cast the lock argument to (struct lock_object *) since all
of our locks have a lock_object as the first member, but then you use having
the compiler do type checking, and I'm really not willing to give up on
that.  Too easy to have evil bugs that way.  I suppose we could use some
evil macro that used typeof() but that would be very gcc specific?

I guess one other possibility is to standardize on the field name for
the lock_object, calling it lo_object instead of mtx_object, rw_object,
sx_object, etc.  Anyone else have any ideas?

John Baldwin

More information about the cvs-src mailing list