Пример #1
0
void Carrier::unsafe_remove (const Ob ob)
{
    UniqueLock lock(m_mutex);

    POMAGMA_ASSERT2(m_support.contains(ob), "double removal: " << ob);
    Ob rep = ob;
    while (not m_reps[rep].compare_exchange_strong(rep, rep)) {}
    POMAGMA_ASSERT2(rep, "double removal: " << ob);
    if (rep == ob) {
        for (Ob other = ob + 1, end = item_dim(); other <= end; ++other) {
            POMAGMA_ASSERT2(m_reps[other].load() != ob,
                    "removed rep " << ob << " before dep " << other);
        }
        --m_rep_count;
    } else {
        for (Ob other = ob + 1, end = item_dim(); other <= end; ++other) {
            Ob expected = ob;
            m_reps[other].compare_exchange_strong(expected, rep);
        }
    }

    m_support.remove(ob);
    m_reps[ob].store(0);
    --m_item_count;
    POMAGMA_DEBUG1(m_item_count.load() << " obs after remove()");
}
Пример #2
0
void Approximator::close(Approximation& approx, DenseSet& temp_set) {
    POMAGMA_ASSERT_EQ(temp_set.item_dim(), m_item_dim);
    for (size_t iter = 0;; ++iter) {
        POMAGMA_DEBUG1("close step " << iter);
        if (try_close(approx, temp_set)) {
            return;
        }
    }
}