All reads and writes are serialized with a hand-rolled lock, but unlocking it always wakes up all waiters. Existing flag fields get resized to make room for introduction of waiter counter without growing the struct.
I don't see an easy way to get rid of pipelock or convert into into an actual lock.