]> git.proxmox.com Git - mirror_spl-debian.git/commit - include/sys/condvar.h
Clear cv->cv_mutex when not in use
authorBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 23 Nov 2010 18:56:55 +0000 (10:56 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 29 Nov 2010 19:02:34 +0000 (11:02 -0800)
commit058de03caaefe63086559662f2abaed1edf0e086
treee9d879b147e9591479fe1c66b810be3ad59be415
parent00ba7ef9002a7dc7919260240f58fd8f31cea24f
Clear cv->cv_mutex when not in use

For debugging purposes the condition varaibles keep track of the
mutex used during a wait.  The idea is to validate that all callers
always use the same mutex.  Unfortunately, we have seen cases where
the caller reuses the condition variable with a different mutex but
in a way which is known to be safe.  My reading of the man pages
suggests you should not do this and always cv_destroy()/cv_init()
a new mutex.  However, there is overhead in doing this and it does
appear to be allowed under Solaris.

To accomidate this behavior cv_wait_common() and __cv_timedwait()
have been modified to clear the associated mutex when the last
waiter is dropped.  This ensures that while the condition variable
is in use the incorrect mutex case is detected.  It also allows the
condition variable to be safely recycled without requiring the
overhead of a cv_destroy()/cv_init() as long as it isn't currently
in use.

Finally, spin lock cv->cv_lock was removed because it is not required.
When the condition variable is used properly the caller will always
be holding the mutex so the spin lock is redundant.  The lock was
originally added because I expected to need to protect more than
just the cv->cv_mutex.  It turns out that was not the case.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
include/sys/condvar.h
module/spl/spl-condvar.c