- Use lock_init/lock_destroy() to setup the lock_object inside of lockmgr.

We can now use LOCK_CLASS() as a stronger check in lockmgr_chain() as a
  result.  This required putting back lk_flags as lockmgr's use of flags
  conflicted with other flags in lo_flags otherwise.
- Tweak 'show lock' output for lockmgr to match sx, rw, and mtx.
This commit is contained in:
John Baldwin 2007-03-30 18:07:24 +00:00
parent 9a78e8bc19
commit ab2dab1680
2 changed files with 13 additions and 9 deletions

View File

@ -180,7 +180,7 @@ acquire(struct lock **lkpp, int extflags, int wanted, int *contested, uint64_t *
* accepted shared locks and shared-to-exclusive upgrades to go away.
*/
int
_lockmgr(struct lock *lkp, int flags, struct mtx *interlkp,
_lockmgr(struct lock *lkp, u_int flags, struct mtx *interlkp,
struct thread *td, char *file, int line)
{
@ -544,7 +544,6 @@ lockinit(lkp, prio, wmesg, timo, flags)
lkp->lk_waitcount = 0;
lkp->lk_exclusivecount = 0;
lkp->lk_prio = prio;
lkp->lk_wmesg = wmesg;
lkp->lk_timo = timo;
lkp->lk_lockholder = LK_NOPROC;
lkp->lk_newlock = NULL;
@ -552,6 +551,8 @@ lockinit(lkp, prio, wmesg, timo, flags)
stack_zero(&lkp->lk_stack);
#endif
lock_profile_object_init(&lkp->lk_object, &lock_class_lockmgr, wmesg);
lock_init(&lkp->lk_object, &lock_class_lockmgr, wmesg, NULL,
LO_RECURSABLE | LO_SLEEPABLE | LO_UPGRADABLE);
}
/*
@ -564,6 +565,7 @@ lockdestroy(lkp)
CTR2(KTR_LOCK, "lockdestroy(): lkp == %p (lk_wmesg == \"%s\")",
lkp, lkp->lk_wmesg);
lock_profile_object_destroy(&lkp->lk_object);
lock_destroy(&lkp->lk_object);
}
/*
@ -661,7 +663,8 @@ lockmgr_chain(struct thread *td, struct thread **ownerp)
lkp = td->td_wchan;
/* Simple test to see if wchan points to a lockmgr lock. */
if (lkp->lk_wmesg == td->td_wmesg)
if (LOCK_CLASS(&lkp->lk_object) == &lock_class_lockmgr &&
lkp->lk_wmesg == td->td_wmesg)
goto ok;
/*
@ -670,7 +673,8 @@ lockmgr_chain(struct thread *td, struct thread **ownerp)
*/
lkp = (struct lock *)((char *)td->td_wchan -
offsetof(struct lock, lk_flags));
if (lkp->lk_wmesg == td->td_wmesg && (lkp->lk_flags & LK_WAITDRAIN))
if (LOCK_CLASS(&lkp->lk_object) == &lock_class_lockmgr &&
lkp->lk_wmesg == td->td_wmesg && (lkp->lk_flags & LK_WAITDRAIN))
goto ok;
/* Doen't seem to be a lockmgr lock. */
@ -697,8 +701,8 @@ db_show_lockmgr(struct lock_object *lock)
lkp = (struct lock *)lock;
db_printf("lock type: %s\n", lkp->lk_wmesg);
db_printf("state: ");
db_printf(" lock type: %s\n", lkp->lk_wmesg);
db_printf(" state: ");
if (lkp->lk_sharecount)
db_printf("SHARED (count %d)\n", lkp->lk_sharecount);
else if (lkp->lk_flags & LK_HAVE_EXCL) {
@ -709,6 +713,6 @@ db_show_lockmgr(struct lock_object *lock)
} else
db_printf("UNLOCKED\n");
if (lkp->lk_waitcount > 0)
db_printf("waiters: %d\n", lkp->lk_waitcount);
db_printf(" waiters: %d\n", lkp->lk_waitcount);
}
#endif

View File

@ -53,6 +53,7 @@ struct mtx;
struct lock {
struct lock_object lk_object; /* common lock properties */
struct mtx *lk_interlock; /* lock on remaining fields */
u_int lk_flags; /* see below */
int lk_sharecount; /* # of accepted shared locks */
int lk_waitcount; /* # of processes sleeping for lock */
short lk_exclusivecount; /* # of recursive exclusive locks */
@ -66,7 +67,6 @@ struct lock {
#endif
};
#define lk_flags lk_object.lo_flags
#define lk_wmesg lk_object.lo_name
/*
* Lock request types:
@ -202,7 +202,7 @@ void lockinit(struct lock *, int prio, const char *wmesg,
int timo, int flags);
void lockdestroy(struct lock *);
int _lockmgr(struct lock *, int flags,
int _lockmgr(struct lock *, u_int flags,
struct mtx *, struct thread *p, char *file, int line);
void transferlockers(struct lock *, struct lock *);
void lockmgr_printinfo(struct lock *);