Change sleepq_add(9) argument from 'struct mtx *' to 'struct lock_object *',

which allows to use it with different kinds of locks. For example it allows
to implement Solaris conditions variables which will be used in ZFS port on
top of sx(9) locks.

Reviewed by:	jhb
This commit is contained in:
Pawel Jakub Dawidek 2006-11-16 01:02:00 +00:00
parent f358fbffa9
commit 7ee07175af
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=164325
5 changed files with 15 additions and 14 deletions

View File

@ -54,7 +54,7 @@
.Ft void
.Fn sleepq_abort "struct thread *td"
.Ft void
.Fn sleepq_add "void *wchan" "struct mtx *lock" "const char *wmesg" "int flags"
.Fn sleepq_add "void *wchan" "struct lock_object *lock" "const char *wmesg" "int flags"
.Ft struct sleepqueue *
.Fn sleepq_alloc "void"
.Ft void
@ -157,12 +157,12 @@ The sleep queue chain associated with argument
must be locked by a prior call to
.Fn sleepq_lock
when this function is called.
If a mutex is specified via the
If a lock is specified via the
.Fa lock
argument, and if the kernel was compiled with
.Cd "options INVARIANTS" ,
then the sleep queue code will perform extra checks to ensure that
the mutex is used by all threads sleeping on
the lock is used by all threads sleeping on
.Fa wchan .
The
.Fa wmesg

View File

@ -149,7 +149,7 @@ cv_wait_unlock(struct cv *cvp, struct mtx *mp)
DROP_GIANT();
mtx_unlock(mp);
sleepq_add(cvp, mp, cvp->cv_description, SLEEPQ_CONDVAR);
sleepq_add(cvp, &mp->mtx_object, cvp->cv_description, SLEEPQ_CONDVAR);
sleepq_wait(cvp);
PICKUP_GIANT();
@ -196,7 +196,7 @@ cv_wait_sig(struct cv *cvp, struct mtx *mp)
DROP_GIANT();
mtx_unlock(mp);
sleepq_add(cvp, mp, cvp->cv_description, SLEEPQ_CONDVAR |
sleepq_add(cvp, &mp->mtx_object, cvp->cv_description, SLEEPQ_CONDVAR |
SLEEPQ_INTERRUPTIBLE);
rval = sleepq_wait_sig(cvp);
@ -250,7 +250,7 @@ cv_timedwait(struct cv *cvp, struct mtx *mp, int timo)
DROP_GIANT();
mtx_unlock(mp);
sleepq_add(cvp, mp, cvp->cv_description, SLEEPQ_CONDVAR);
sleepq_add(cvp, &mp->mtx_object, cvp->cv_description, SLEEPQ_CONDVAR);
sleepq_set_timeout(cvp, timo);
rval = sleepq_timedwait(cvp);
@ -307,7 +307,7 @@ cv_timedwait_sig(struct cv *cvp, struct mtx *mp, int timo)
DROP_GIANT();
mtx_unlock(mp);
sleepq_add(cvp, mp, cvp->cv_description, SLEEPQ_CONDVAR |
sleepq_add(cvp, &mp->mtx_object, cvp->cv_description, SLEEPQ_CONDVAR |
SLEEPQ_INTERRUPTIBLE);
sleepq_set_timeout(cvp, timo);
rval = sleepq_timedwait_sig(cvp);

View File

@ -188,7 +188,8 @@ msleep(ident, mtx, priority, wmesg, timo)
* stopped, then td will no longer be on a sleep queue upon
* return from cursig().
*/
sleepq_add(ident, ident == &lbolt ? NULL : mtx, wmesg, flags);
sleepq_add(ident, ident == &lbolt ? NULL : &mtx->mtx_object, wmesg,
flags);
if (timo)
sleepq_set_timeout(ident, timo);
@ -265,7 +266,7 @@ msleep_spin(ident, mtx, wmesg, timo)
/*
* We put ourselves on the sleep queue and start our timeout.
*/
sleepq_add(ident, mtx, wmesg, SLEEPQ_MSLEEP);
sleepq_add(ident, &mtx->mtx_object, wmesg, SLEEPQ_MSLEEP);
if (timo)
sleepq_set_timeout(ident, timo);

View File

@ -120,7 +120,7 @@ struct sleepqueue {
void *sq_wchan; /* (c) Wait channel. */
#ifdef INVARIANTS
int sq_type; /* (c) Queue type. */
struct mtx *sq_lock; /* (c) Associated lock. */
struct lock_object *sq_lock; /* (c) Associated lock. */
#endif
};
@ -262,7 +262,7 @@ sleepq_release(void *wchan)
* woken up.
*/
void
sleepq_add(void *wchan, struct mtx *lock, const char *wmesg, int flags)
sleepq_add(void *wchan, struct lock_object *lock, const char *wmesg, int flags)
{
struct sleepqueue_chain *sc;
struct sleepqueue *sq;
@ -895,7 +895,7 @@ DB_SHOW_COMMAND(sleepq, db_show_sleepqueue)
#ifdef INVARIANTS
db_printf("Queue type: %d\n", sq->sq_type);
if (sq->sq_lock) {
lock = &sq->sq_lock->mtx_object;
lock = sq->sq_lock;
db_printf("Associated Interlock: %p - (%s) %s\n", lock,
LOCK_CLASS(lock)->lc_name, lock->lo_name);
}

View File

@ -75,7 +75,7 @@
* using this interface as well (death to TDI_IWAIT!)
*/
struct mtx;
struct lock_object;
struct sleepqueue;
struct thread;
@ -88,7 +88,7 @@ struct thread;
void init_sleepqueues(void);
void sleepq_abort(struct thread *td, int intrval);
void sleepq_add(void *, struct mtx *, const char *, int);
void sleepq_add(void *, struct lock_object *, const char *, int);
struct sleepqueue *sleepq_alloc(void);
void sleepq_broadcast(void *, int, int);
void sleepq_free(struct sleepqueue *);