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;
}