:
INIT:
init()
{
ready = 0;
done = 1;
}
:
send()
{
while (!done)
sleep();
/* copy data in */
done = 0;
ready = 1;
}
:
poll()
{
while (1)
{
if (ready)
{
recv();
}
sleep();
}
}
recv()
{
/* copy data out */
ready = 0;
done = 1;
}
mem ( , , flush/invalidate).
( ) :
, , : (, send/recv )
poll()
{
while(1)
{
if (current_owner == me)
{
if (active)
{
recv();
}
else if (!request[me] && request[other])
{
request[other] = 0;
current_owner = other;
}
}
sleep();
}
}
recv()
{
active = 0;
if (!request[me] && request[other])
{
request[other] = 0;
current_owner = other;
}
}
send()
{
request[me] = 1;
while (current_owner != me || active)
{
sleep();
}
request[me] = 0;
active = 1;
current_owner = other;
}