Fsrpc *
getsbuf(void)
{
static int ap;
int look, rounds;
Fsrpc *wb;
int small_instead_of_fast = 1;
if(small_instead_of_fast)
ap = 0; /* so we always start looking at the beginning and reuse buffers */
for(rounds = 0; rounds < 10; rounds++) {
for(look = 0; look < Nr_workbufs; look++) {
if(++ap == Nr_workbufs)
ap = 0;
if(Workq[ap].busy == 0)
break;
}
if(look == Nr_workbufs){
sleep(10 * rounds);
continue;
}
wb = &Workq[ap];
wb->pid = 0;
wb->canint = 0;
wb->flushtag = NOTAG;
wb->busy = 1;
if(wb->buf == nil) /* allocate buffers dynamically to keep size down */
wb->buf = emallocz(messagesize);
return wb;
}
fatal("No more work buffers");
return nil;
}