On 3/1/2021 6:52 PM, Chris M. Thomasson wrote:
> Fwiw, here is a simple implementation of a seqlock under Relacy Race
> Detector. Now, this needs std::memory_order_seq_cst in order to get it
> to work, however, I am trying to find a way around that nasty membar.
> However, the ct_seqlock::read_enter/read_try_leave functions only does
> loads, but uses that damn seq_cst. The idea is to use this for a
> distributed poor mans RCU where there would be a seqlock per thread. It
> is crucial that a reader does not mutate state on a remote thread. So,
> loads are very important here.
[...]
I managed to get rid of a single seq_cst in the reader logic.
ct_seqlock::read_enter.
________________________
struct ct_seqlock
{
std::atomic<unsigned long> m_seq;
std::mutex m_lock;
ct_seqlock() : m_seq(0) {}
unsigned long read_enter()
{
unsigned long seq = 0;
for (;;)
{
seq = m_seq.load(std::memory_order_acquire);
if (! (seq & 1)) break;
rl::yield(1, $);
}
return seq;
}
bool read_try_leave(unsigned long cmp_seq)
{
unsigned long seq = m_seq.load(std::memory_order_seq_cst);
return (! (seq & 1) && seq == cmp_seq);
}
void write_lock()
{
m_lock.lock($);
m_seq.fetch_add(1, std::memory_order_seq_cst);
}
void write_unlock()
{
m_seq.fetch_add(1, std::memory_order_release);
m_lock.unlock($);
}
};
________________________
I have an idea to possibly get rid of the remaining seq_cst... It
involves embedding the sequence count in the mutex logic. I altered the
read_try_leave to also check to see if the seq is odd.