2
sender writes to own buffer
4
reader reads from senders buffer
12
semwait(read) semwait(pending)
13
fill header await(from->node == me)
14
fill buffer semwait(from->written)
15
sempost(written) read header
16
sempost(to->pending) read buffer
19
while (additional) while (additional)
20
semwait(read) semwait(from->written)
21
fill buffer read buffer
22
sempost(written) sempost(from->read)
31
await(buffer_full == FALSE)
32
fill header await(from->node == me)
33
fill buffer await(from->buffer_full == TRUE)
34
from->buffer_full = FALSE read header
36
from->buffer_full = FALSE
38
while (additional) while (additional)
39
await(buffer_full == FALSE) await(from->buffer_full == TRUE)
40
fill buffer read buffer
41
from->buffer_full = FALSE from->buffer_full = FALSE
48
writable = address of the 128 byte header
49
readable = address of the buffer
51
writable initialized to unlocked
52
readable initialized to locked
56
lock(writable) lock(from->readable)
57
fill header await(from->node == me)
58
fill buffer read header
59
unlock(readable) read buffer
60
unlock(from->writable)
62
while (additional) while (additional)
63
lock(writable) lock(readable)
64
fill buffer read(buffer)
65
unlock(readable) unlock(writable)