/* * mutex_init: * * Initialize a mutex for use. Note that adaptive mutexes are in * essence spin mutexes that can sleep to avoid deadlock and wasting * CPU time. We can't easily provide a type of mutex that always * sleeps - see comments in mutex_vector_enter() about releasing * mutexes unlocked. */ void mutex_init(kmutex_t *mtx, kmutex_type_t type, int ipl) { bool dodebug; memset(mtx, 0, sizeof(*mtx)); switch (type) { case MUTEX_ADAPTIVE: KASSERT(ipl == IPL_NONE); break; case MUTEX_DEFAULT: case MUTEX_DRIVER: if (ipl == IPL_NONE || ipl == IPL_SOFTCLOCK || ipl == IPL_SOFTBIO || ipl == IPL_SOFTNET || ipl == IPL_SOFTSERIAL) { type = MUTEX_ADAPTIVE; } else { type = MUTEX_SPIN; } break; default: break; } switch (type) { case MUTEX_NODEBUG: dodebug = LOCKDEBUG_ALLOC(mtx, NULL, (uintptr_t)__builtin_return_address(0)); MUTEX_INITIALIZE_SPIN(mtx, dodebug, ipl); break; case MUTEX_ADAPTIVE: dodebug = LOCKDEBUG_ALLOC(mtx, &mutex_adaptive_lockops, (uintptr_t)__builtin_return_address(0)); MUTEX_INITIALIZE_ADAPTIVE(mtx, dodebug); break; case MUTEX_SPIN: dodebug = LOCKDEBUG_ALLOC(mtx, &mutex_spin_lockops, (uintptr_t)__builtin_return_address(0)); MUTEX_INITIALIZE_SPIN(mtx, dodebug, ipl); break; default: panic("mutex_init: impossible type"); break; } }
/* * rw_init: * * Initialize a rwlock for use. */ void rw_init(krwlock_t *rw) { bool dodebug; memset(rw, 0, sizeof(*rw)); dodebug = LOCKDEBUG_ALLOC(rw, &rwlock_lockops, (uintptr_t)__builtin_return_address(0)); RW_SETDEBUG(rw, dodebug); }