int lock_release_contention(cos_lock_t *l, union cos_lock_atomic_struct *prev_val) { int lock_id = l->lock_id; /* * This must evaluate to false, as contested * is already set, we are the owner (thus no * other thread should set that), */ if (unlikely(!cos_cas((unsigned long*)&l->atom, prev_val->v, 0))) BUG(); if (lock_component_release(cos_spd_id(), lock_id)) return -1; return 0; }
static inline void block_ser_if_client_fault_notification(int spdid) { struct track_block *tb; do { if (sched_component_take(cos_spd_id())) BUG(); } while (0); if (!tracking_block_list[spdid].next) goto done; if (EMPTY_LIST(&tracking_block_list[spdid], next, prev)) goto done; for (tb = FIRST_LIST(&tracking_block_list[spdid], next, prev); tb != &tracking_block_list[spdid]; tb = FIRST_LIST(tb, next, prev)) { do { if (sched_component_release(cos_spd_id())) BUG(); } while (0); lock_component_release(spdid, tb->lock_id); do { if (sched_component_take(cos_spd_id())) BUG(); } while (0); } done: do { if (sched_component_release(cos_spd_id())) BUG(); } while (0); return; }