Bug #908
Updated by sjg over 11 years ago
Any suggestions on how to make this clearer are welcome. Index: notes/porting_drivers.txt =================================================================== RCS file: /home/aggelos/imports/vcs/dcvs/doc/notes/porting_drivers.txt,v retrieving revision 1.3 diff -u -p -u -r1.3 porting_drivers.txt --- notes/porting_drivers.txt 29 Dec 2007 18:35:59 -0000 1.3 +++ notes/porting_drivers.txt 6 Jan 2008 17:40:24 -0000 @@ -84,6 +84,24 @@ $DragonFly: doc/notes/porting_drivers.tx call is replaced with lockmgr(&my_lock, LK_EXCLUSIVE|LK_NOWAIT); + On occasion, the FreeBSD code will use mtx_sleep() or msleep() + (currently [01/2008], those macros have identical definitions) + in order to release a mutex and sleep without missing any + wakeups that might occur in between. The DragonFly idiom for + this case is to enter a critical section and use tsleep_interlock() + to let threads in other cpus know that we're about to go to + sleep. In our example, you would substitute + + crit_enter(); + tsleep_interlock(ident); + lockmgr(&my_lock, LK_RELEASE); + tsleep(ident, flags, "whatever", timeout); + crit_exit(); + lockmgr(&my_lock, LK_EXCLUSIVE); + + for + msleep(ident, &my_mtx, flags, "whatever", timeout); + As for mtx_assert() calls, translate them like this: mtx_assert(&my_mtx, MA_OWNED) -> KKASSERT(lockstatus(&my_lock, curthread) != 0)