lksleep - Add lksleep for lockmgr locks
authorAlex Hornung <ahornung@gmail.com>
Mon, 28 Sep 2009 18:03:19 +0000 (19:03 +0100)
committerAlex Hornung <ahornung@gmail.com>
Wed, 30 Sep 2009 06:39:49 +0000 (07:39 +0100)
* Add the function lksleep() to do the same ssleep does, but for lockmgr
  locks.

sys/kern/kern_synch.c
sys/sys/systm.h

index 055c38d..ba82d98 100644 (file)
@@ -710,6 +710,21 @@ ssleep(void *ident, struct spinlock *spin, int flags,
        return (error);
 }
 
+int
+lksleep(void *ident, struct lock *lock, int flags,
+       const char *wmesg, int timo)
+{
+       globaldata_t gd = mycpu;
+       int error;
+
+       _tsleep_interlock(gd, ident, flags);
+       lockmgr(lock, LK_RELEASE);
+       error = tsleep(ident, flags | PINTERLOCKED, wmesg, timo);
+       lockmgr(lock, LK_EXCLUSIVE);
+
+       return (error);
+}
+
 /*
  * Interlocked mutex sleep.  An exclusively held mutex must be passed
  * to mtxsleep().  The function will atomically release the mutex
index 6c9ad66..0495ba7 100644 (file)
@@ -124,6 +124,7 @@ extern vm_paddr_t Maxmem;   /* Highest physical memory address in system */
 
 struct intrframe;
 struct spinlock;
+struct lock;
 struct mtx;
 struct lwkt_serialize;
 struct malloc_type;
@@ -343,6 +344,7 @@ extern watchdog_tickle_fn   wdog_tickler;
  */
 int    tsleep (void *, int, const char *, int);
 int    ssleep (void *, struct spinlock *, int, const char *, int);
+int    lksleep (void *, struct lock *, int, const char *, int);
 int    mtxsleep (void *, struct mtx *, int, const char *, int);
 int    zsleep(void *, struct lwkt_serialize *, int, const char *, int);
 void   tsleep_interlock (void *, int);