On Wed, May 12, 1999 at 01:34:05PM -0700, Matthew Dillon wrote:
> asleep() allows a subroutine deep in the call stack to specify an
> asynchronous blocking condition and then return a temporary failure
> up through the ranks. At the top level, the scheduler sees and acts
> upon the asynchronous blocking condition. Higher level routines do not
So if I get it right, this would give something like the code below.
Is that the idea? What's missing in the asleep/await code to use
them in such a way?
soxxx()
{
for (;;) {
await(&mbuf_slp);
/* code */
error = xxx(&mbuf_slp);
if (error != ENOBUFS)
break;
}
}
m_retry()
{
/* find an mbuf... */
if (/* got an mbuf to return */)
return mbuf;
else {
asleep(&mbuf_slp);
return NULL;
}
}
m_free()
{
/* Free mbuf... */
wakeup(&mbuf_slp);
}
And, unless I'm missing something, we still need to properly check
for NULL return values from m_get and friends.
--
Pierre Beyssac [email protected]
To Unsubscribe: send mail to [email protected]
with "unsubscribe freebsd-current" in the body of the message