static void loopbackread(void *a) { Ipifc *ifc; Block *bp; LB *lb; ifc = a; lb = ifc->arg; lb->readp = up; /* hide identity under a rock for unbind */ if(waserror()){ lb->readp = 0; pexit("hangup", 1); } for(;;){ bp = qbread(lb->q, Maxtu); if(bp == nil) continue; ifc->in++; if(!canrlock(ifc)){ freeb(bp); continue; } if(waserror()){ runlock(ifc); nexterror(); } if(ifc->lifc == nil) freeb(bp); else ipiput4(lb->f, ifc, bp); runlock(ifc); poperror(); } }
static void loopbackread(void *a) { ERRSTACK(2); struct Ipifc *ifc; struct block *bp; LB *lb; ifc = a; lb = ifc->arg; lb->readp = current; /* hide identity under a rock for unbind */ if (waserror()) { lb->readp = 0; warn("loopbackread exits unexpectedly"); return; poperror(); } for (;;) { bp = qbread(lb->q, Maxtu); if (bp == NULL) continue; ifc->in++; if (!canrlock(&ifc->rwlock)) { freeb(bp); continue; } if (waserror()) { runlock(&ifc->rwlock); nexterror(); } if (ifc->lifc == NULL) freeb(bp); else ipiput4(lb->f, ifc, bp); runlock(&ifc->rwlock); poperror(); } poperror(); }