void lock() { XEDGE(acquire, out); uintptr_t locked; for (;;) { locked = locked_; if (!writeLocked(locked)) { if (L(acquire, locked_.compare_exchange_weak( locked, locked|kWriterLocked))) { break; } } } while (readLocked(locked)) { locked = L(acquire, locked_); } LPOST(out); }
int EthernetClient::read() { return readLocked(); }