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
Attilio Rao
attilio at freebsd.org
Sat Mar 10 12:13:32 UTC 2007
2007/3/9, John Baldwin <jhb at freebsd.org>:
> 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.
> > - Rename SLEEPQ_MSLEEP to SLEEPQ_SLEEP.
> > - 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?
What about adding a new function like:
static __inline struct lock_object *
mtx_export_lc(struct mtx *m)
{
return (&m->mtx_object);
}
to be per-interface (so having sx_export_lc() and rw_export_lc() too)
and than using in this way:
static struct mtx foo_lock;
static struct cv foo_cv;
...
mtx_lock(&foo_lock);
...
cv_wait(&foo_cv, mtx_export_lc(&foo_lock));
(obviously using new struct lock_object methods you added for locking/unlocking)
It sounds reasonable to you?
Attilio
--
Peace can only be achieved by understanding - A. Einstein
More information about the cvs-src
mailing list