X ... 3 receivers buffer_end send(1): DONE send(2): CANCELLED send(3): DONE receive(): 1 send(x): senders++, receivers, buffer_end if senders >= receivers { if senders < buffer_end { storeElement(senders, x) // buffering! } else { /* suspend */ } } else { /* rendezvous */ } receive(): senders, receivers++, buffer_end++ receiveImpl(senders, receivers) makeBuffered(buffer_end) // inc buffer_end // again on failure senders