void erts_lc_require_lock_flg(erts_lc_lock_t *lck, Uint16 op_flags, char *file, unsigned int line) { erts_lc_locked_locks_t *l_lcks = make_my_locked_locks(); erts_lc_locked_lock_t *l_lck = l_lcks->locked.first; if (!find_lock(&l_lck, lck)) required_not_locked(l_lcks, lck); l_lck = new_locked_lock(lck, op_flags, file, line); if (!l_lcks->required.last) { ASSERT(!l_lcks->required.first); l_lck->next = l_lck->prev = NULL; l_lcks->required.first = l_lcks->required.last = l_lck; } else { erts_lc_locked_lock_t *l_lck2; ASSERT(l_lcks->required.first); for (l_lck2 = l_lcks->required.last; l_lck2; l_lck2 = l_lck2->prev) { if (l_lck2->id < lck->id || (l_lck2->id == lck->id && l_lck2->extra < lck->extra)) break; else if (l_lck2->id == lck->id && l_lck2->extra == lck->extra) require_twice(l_lcks, lck); } if (!l_lck2) { l_lck->next = l_lcks->required.first; l_lck->prev = NULL; l_lcks->required.first->prev = l_lck; l_lcks->required.first = l_lck; } else { l_lck->next = l_lck2->next; if (l_lck->next) { ASSERT(l_lcks->required.last != l_lck2); l_lck->next->prev = l_lck; } else { ASSERT(l_lcks->required.last == l_lck2); l_lcks->required.last = l_lck; } l_lck->prev = l_lck2; l_lck2->next = l_lck; } } }
void erts_lc_require_lock_flg(erts_lc_lock_t *lck, erts_lock_options_t options, char *file, unsigned int line) { lc_thread_t *thr = make_my_locked_locks(); lc_locked_lock_t *ll = thr->locked.first; if (!find_lock(&ll, lck)) required_not_locked(thr, lck); ll = new_locked_lock(thr, lck, options, file, line); if (!thr->required.last) { ASSERT(!thr->required.first); ll->next = ll->prev = NULL; thr->required.first = thr->required.last = ll; } else { lc_locked_lock_t *l_lck2; ASSERT(thr->required.first); for (l_lck2 = thr->required.last; l_lck2; l_lck2 = l_lck2->prev) { if (l_lck2->id < lck->id || (l_lck2->id == lck->id && l_lck2->extra < lck->extra)) break; else if (l_lck2->id == lck->id && l_lck2->extra == lck->extra) require_twice(thr, lck); } if (!l_lck2) { ll->next = thr->required.first; ll->prev = NULL; thr->required.first->prev = ll; thr->required.first = ll; } else { ll->next = l_lck2->next; if (ll->next) { ASSERT(thr->required.last != l_lck2); ll->next->prev = ll; } else { ASSERT(thr->required.last == l_lck2); thr->required.last = ll; } ll->prev = l_lck2; l_lck2->next = ll; } } }