Exemple #1
0
inline bool Carrier::set_and_merge(std::atomic<Ob>& destin, Ob source) const {
    POMAGMA_ASSERT_RANGE_(5, source, item_dim());

    Ob old = 0;
    while (not destin.compare_exchange_strong(
        old, source, std::memory_order_acq_rel, std::memory_order_acquire)) {
        source = ensure_equal(source, old);
        if (old == source) return false;
    }
    return old == 0;
}
Exemple #2
0
inline bool Carrier::set_or_merge(std::atomic<Ob>& destin, Ob source) const {
    POMAGMA_ASSERT_RANGE_(5, source, item_dim());

    Ob old = 0;
    if (destin.compare_exchange_strong(old, source, std::memory_order_acq_rel,
                                       std::memory_order_acquire)) {
        return true;
    } else {
        ensure_equal(source, old);
        return false;
    }
}
Exemple #3
0
void execute (const AssumeTask & task)
{
    POMAGMA_DEBUG("assume " << task.expression);

    InsertParser parser(signature);
    parser.begin(task.expression);
    std::string type = parser.parse_token();
    Ob lhs = parser.parse_term();
    Ob rhs = parser.parse_term();
    parser.end();

    if (type == "EQUAL") {
        ensure_equal(lhs, rhs);
	} else if (type == "LESS") {
        ensure_less(lhs, rhs);
	} else if (type == "NLESS") {
        ensure_nless(lhs, rhs);
	} else {
        POMAGMA_ERROR("bad relation type: " << type);
	}
}