static void readthread(void *a) { uint8_t *buf; int n; Client *c; Ioproc *io; Msg *m; char tmp[32]; c = a; snprint(tmp, sizeof tmp, "read%d", c->num); threadsetname(tmp); buf = emalloc(8192); io = c->readerproc; while((n = ioread(io, c->fd[0], buf, 8192)) >= 0){ m = emalloc(sizeof(Msg)+n); m->rp = (uint8_t*)&m[1]; m->ep = m->rp + n; if(n) memmove(m->rp, buf, n); queuemsg(c, m); matchmsgs(c); } queuemsg(c, Zmsg); free(buf); die(c); }
/*===========================================================================* * fs_sendrec * *===========================================================================*/ int fs_sendrec(endpoint_t fs_e, message *reqmp) { struct vmnt *vmp; int r; if ((vmp = find_vmnt(fs_e)) == NULL) { printf("Trying to talk to non-existent FS endpoint %d\n", fs_e); return(EIO); } if (fs_e == fp->fp_endpoint) return(EDEADLK); self->w_sendrec = reqmp; /* Where to store request and reply */ /* Find out whether we can send right away or have to enqueue */ if ( !(vmp->m_flags & VMNT_CALLBACK) && vmp->m_comm.c_cur_reqs < vmp->m_comm.c_max_reqs) { /* There's still room to send more and no proc is queued */ r = sendmsg(vmp, vmp->m_fs_e, self); } else { r = queuemsg(vmp); } self->w_next = NULL; /* End of list */ if (r != OK) return(r); worker_wait(); /* Yield execution until we've received the reply. */ return(reqmp->m_type); }