
Alexander Terekhov wrote:
Peter Dimov wrote: [...]
I have PS/2 Model 80 (with 64 Megs) "tank" at home (in addition to A31p ThinkPad ;-) ).
He he. OK, if you had CAS (PS/2 Model 70 486) how would you do it?
Ok, you owe me a "Blue Lightening" processor upgrade. ;-) How about
void lock() throw() { while (int lock_status = m_lock_status.cas(0, 1, msync::ddacq)) if (lock_status < 0 || m_lock_status.cas(1,-1, msync::ddacq)) m_retry_event.wait();
Err. m_retry_event.wait(), m_retry_event.set();
}
bool trylock() throw() { return !m_lock_status.cas(0, 1, msync::acq); }
bool timedlock(absolute_timeout const & timeout) throw() { while (int lock_status = m_lock_status.cas(0, 1, msync::ddacq)) if (lock_status < 0 || m_lock_status.cas(1,-1, msync::ddacq)) if (!m_retry_event.timedwait(timeout)) m_retry_event.set(), return !m_lock_status.swap(1, msync::acq); return true; }
Forget it. timedlock() would make it "posix unsafe". lock_queue is the way to go. regards, alexander.