ldi_ev_callback_list
static struct ldi_ev_callback_list ldi_ev_callback_list;
mutex_init(&ldi_ev_callback_list.le_lock, NULL, MUTEX_DEFAULT, NULL);
cv_init(&ldi_ev_callback_list.le_cv, NULL, CV_DEFAULT, NULL);
ldi_ev_callback_list.le_busy = 0;
ldi_ev_callback_list.le_thread = NULL;
listp = &ldi_ev_callback_list.le_head;
ldi_ev_callback_list.le_walker_next = NULL;
ldi_ev_callback_list.le_walker_prev = NULL;
list_create(&ldi_ev_callback_list.le_head,
mutex_enter(&ldi_ev_callback_list.le_lock);
if (ldi_ev_callback_list.le_thread == curthread) {
ASSERT(ldi_ev_callback_list.le_busy >= 1);
ldi_ev_callback_list.le_busy++;
while (ldi_ev_callback_list.le_busy)
cv_wait(&ldi_ev_callback_list.le_cv,
&ldi_ev_callback_list.le_lock);
ASSERT(ldi_ev_callback_list.le_thread == NULL);
ldi_ev_callback_list.le_busy = 1;
ldi_ev_callback_list.le_thread = curthread;
mutex_exit(&ldi_ev_callback_list.le_lock);
mutex_enter(&ldi_ev_callback_list.le_lock);
ASSERT(ldi_ev_callback_list.le_thread == curthread);
ASSERT(ldi_ev_callback_list.le_busy >= 1);
ldi_ev_callback_list.le_busy--;
if (ldi_ev_callback_list.le_busy == 0) {
ldi_ev_callback_list.le_thread = NULL;
cv_signal(&ldi_ev_callback_list.le_cv);
mutex_exit(&ldi_ev_callback_list.le_lock);
list_insert_tail(&ldi_ev_callback_list.le_head, lecp);
VERIFY(ldi_ev_callback_list.le_walker_next == NULL);
listp = &ldi_ev_callback_list.le_head;
ldi_ev_callback_list.le_walker_next) {
ldi_ev_callback_list.le_walker_next = list_next(listp, lecp);
VERIFY(ldi_ev_callback_list.le_walker_prev == NULL);
for (; lecp; lecp = ldi_ev_callback_list.le_walker_prev) {
ldi_ev_callback_list.le_walker_prev = list_prev(listp, lecp);
ldi_ev_callback_list.le_walker_next = NULL;
ldi_ev_callback_list.le_walker_prev = NULL;
VERIFY(ldi_ev_callback_list.le_walker_next == NULL);
listp = &ldi_ev_callback_list.le_head;
ldi_ev_callback_list.le_walker_next) {
ldi_ev_callback_list.le_walker_next = list_next(listp, lecp);
ldi_ev_callback_list.le_walker_next = NULL;
listp = &ldi_ev_callback_list.le_head;
if (ldi_ev_callback_list.le_walker_next == lecp)
ldi_ev_callback_list.le_walker_next = next;
if (ldi_ev_callback_list.le_walker_prev == lecp)
ldi_ev_callback_list.le_walker_prev = list_prev(
listp, ldi_ev_callback_list.le_walker_prev);