void erts_lc_unrequire_lock_flg(erts_lc_lock_t *lck, Uint16 op_flags) { 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 = l_lcks->required.first; if (!find_lock(&l_lck, lck)) unrequire_of_not_required_lock(l_lcks, lck); if (l_lck->prev) { ASSERT(l_lcks->required.first != l_lck); l_lck->prev->next = l_lck->next; } else { ASSERT(l_lcks->required.first == l_lck); l_lcks->required.first = l_lck->next; } if (l_lck->next) { ASSERT(l_lcks->required.last != l_lck); l_lck->next->prev = l_lck->prev; } else { ASSERT(l_lcks->required.last == l_lck); l_lcks->required.last = l_lck->prev; } lc_free((void *) l_lck); }
void erts_lc_unrequire_lock_flg(erts_lc_lock_t *lck, erts_lock_options_t options) { 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 = thr->required.first; if (!find_lock(&ll, lck)) unrequire_of_not_required_lock(thr, lck); if (ll->prev) { ASSERT(thr->required.first != ll); ll->prev->next = ll->next; } else { ASSERT(thr->required.first == ll); thr->required.first = ll->next; } if (ll->next) { ASSERT(thr->required.last != ll); ll->next->prev = ll->prev; } else { ASSERT(thr->required.last == ll); thr->required.last = ll->prev; } lc_free(thr, ll); }