Date: Thu, 26 Apr 2007 21:36:33 +0200 From: Hans Petter Selasky <hselasky@c2i.net> To: freebsd-hackers@freebsd.org Subject: msleep() on recursivly locked mutexes Message-ID: <200704262136.33196.hselasky@c2i.net>
next in thread | raw e-mail | index | archive | help
Hi, In the new USB stack I have defined the following: u_int32_t mtx_drop_recurse(struct mtx *mtx) { u_int32_t recurse_level = mtx->mtx_recurse; u_int32_t recurse_curr = recurse_level; mtx_assert(mtx, MA_OWNED); while(recurse_curr--) { mtx_unlock(mtx); } return recurse_level; } void mtx_pickup_recurse(struct mtx *mtx, u_int32_t recurse_level) { mtx_assert(mtx, MA_OWNED); while(recurse_level--) { mtx_lock(mtx); } return; } When I do a msleep() I do it like this: level = mtx_drop_recurse(ctd->p_mtx); error = msleep(ctd, ctd->p_mtx, 0, "config td sleep", timeout); mtx_pickup_recurse(ctd->p_mtx, level); Are there any comments on integrating this functionality into msleep(), and adding mtx_drop_recurse() and mtx_pickup_recurse() to the FreeBSD kernel? --HPS
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200704262136.33196.hselasky>