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:
parent
f358fbffa9
commit
7ee07175af
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=164325
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 *);
|
||||
|
Loading…
Reference in New Issue
Block a user