| plan 9 kernel history: overview | file list | diff list |
1990/1124/port/devmnt.c (diff list | history)
| 1990/1123/sys/src/9/port/devmnt.c:49,55 – 1990/1124/sys/src/9/port/devmnt.c:49,56 (short | long | prev | next) | ||
| 1990/0227 | { | |
| 1990/1123 | Mnthdr *next; /* in free list or writers list */ Mnthdr *prev; /* in writers list only */ | |
| 1990/1124 | short active; short flushing; /* a Tflush has been sent */ | |
| 1990/0227 | Fcall thdr; Fcall rhdr; | |
| 1990/0604 | Rendez r; | |
| 1990/1123/sys/src/9/port/devmnt.c:122,127 – 1990/1124/sys/src/9/port/devmnt.c:123,129 | ||
| 1990/0227 | lock(&mnthdralloc); if(mh = mnthdralloc.free){ /* assign = */ mnthdralloc.free = mh->next; | |
| 1990/1124 | mh->flushing = 0; | |
| 1990/0227 | unlock(&mnthdralloc); return mh; } | |
| 1990/1123/sys/src/9/port/devmnt.c:138,143 – 1990/1124/sys/src/9/port/devmnt.c:140,148 | ||
| 1990/0227 | void mhfree(Mnthdr *mh) { | |
| 1990/1124 | if(mh->flushing) return; mh->active = 0; | |
| 1990/0227 | lock(&mnthdralloc); mh->next = mnthdralloc.free; mnthdralloc.free = mh; | |
| 1990/1123/sys/src/9/port/devmnt.c:601,622 – 1990/1124/sys/src/9/port/devmnt.c:606,654 | ||
| 1990/1123 | if(q->writer) q->writer->prev = 0; } | |
| 1990/1124 | /* * m->q is unlocked. Send Tflush message to flush omh->tag. * Cut off all errors. Caller will free omh */ | |
| 1990/1123 | void | |
| 1990/1124 | mntflush(Mnt *m, Mnthdr *omh) /* queue is unlocked */ | |
| 1990/1123 | { | |
| 1990/1124 | Mnthdr *mh; if(omh->thdr.type == Tflush) return; mh = mhalloc(); if(waserror()){ omh->flushing = 0; mhfree(mh); return; /* no more errors please */ } mh->thdr.type = Tflush; mh->thdr.oldtag = omh->thdr.tag; mntxmit(m, mh); omh->flushing = 0; mhfree(mh); poperror(); } void mnterrdequeue(Mnt *m, Mnthdr *mh) /* queue is unlocked */ { | |
| 1990/0604 | Mnthdr *w; | |
| 1990/1124 | MntQ *q; | |
| 1990/0604 | ||
| 1990/1124 | mh->flushing = 1; q = m->q; | |
| 1990/0604 | qlock(q); /* take self from queue if necessary */ if(q->reader == u->p){ /* advance a writer to reader */ w = q->writer; if(w){ | |
| 1990/1124 | mntwunlink(q, w); | |
| 1990/0604 | q->reader = w->p; | |
| 1990/1123 |
| |
| 1990/0604 | wakeup(&w->r); }else{ q->reader = 0; | |
| 1990/1123/sys/src/9/port/devmnt.c:625,631 – 1990/1124/sys/src/9/port/devmnt.c:657,663 | ||
| 1990/1123 | }else mntwunlink(q, mh); | |
| 1990/0604 | qunlock(q); | |
| 1990/1124 | mntflush(m, mh); | |
| 1990/0604 | } | |
| 1990/11211 | ||
| 1990/0717 | int | |
| 1990/1123/sys/src/9/port/devmnt.c:641,651 – 1990/1124/sys/src/9/port/devmnt.c:673,683 | ||
| 1990/1123 | Mntbuf *mbw, *t; | |
| 1990/0604 | Mnthdr *w, *ow; MntQ *q; | |
| 1990/1123 |
| |
| 1990/1124 | int qlocked, tag, written; | |
| 1990/0227 | ||
| 1990/0619 | mh->mbr = mballoc(); | |
| 1990/0227 | mbw = mballoc(); | |
| 1990/1124 | if(waserror()){ /* 1 */ | |
| 1990/0619 | mbfree(mh->mbr); | |
| 1990/0227 | mbfree(mbw); nexterror(); | |
| 1990/1123/sys/src/9/port/devmnt.c:663,669 – 1990/1124/sys/src/9/port/devmnt.c:695,701 | ||
| 1990/0511 | goto Normal; | |
| 1990/0604 | incref(q); | |
| 1990/0227 |
| |
| 1990/1124 | if(waserror()){ /* 2 */ | |
| 1990/0604 | mqfree(q); | |
| 1990/0227 | nexterror(); } | |
| 1990/1123/sys/src/9/port/devmnt.c:677,683 – 1990/1124/sys/src/9/port/devmnt.c:709,715 | ||
| 1990/0227 | */ | |
| 1990/0619 | n = (*devtab[q->msg->type].read)(q->msg, mh->mbr->buf, BUFSIZE); | |
| 1990/0604 | mqfree(q); | |
| 1990/0511 |
| |
| 1990/1124 | poperror(); /* 2 */ | |
| 1990/0511 | ||
| 1990/0619 | if(convM2S(mh->mbr->buf, &mh->rhdr, n) == 0){ | |
| 1990/0604 | print("format error in mntxmit\n"); | |
| 1990/1123/sys/src/9/port/devmnt.c:712,718 – 1990/1124/sys/src/9/port/devmnt.c:744,750 | ||
| 1990/0511 | memcpy(mh->thdr.data, mh->rhdr.data, mh->rhdr.count); | |
| 1990/0619 | mbfree(mh->mbr); | |
| 1990/0511 | mbfree(mbw); | |
| 1990/1124 | poperror(); /* 1 */ | |
| 1990/0511 | return; Normal: | |
| 1990/1123/sys/src/9/port/devmnt.c:720,726 – 1990/1124/sys/src/9/port/devmnt.c:752,758 | ||
| 1990/0604 | incref(q); qlock(q); qlocked = 1; | |
| 1990/0511 |
| |
| 1990/1124 | if(waserror()){ /* 2 */ | |
| 1990/0604 | if(qlocked) qunlock(q); mqfree(q); | |
| 1990/1123/sys/src/9/port/devmnt.c:727,732 – 1990/1124/sys/src/9/port/devmnt.c:759,765 | ||
| 1990/0511 | nexterror(); | |
| 1990/03081 | } | |
| 1990/0717 | mh->readreply = 0; | |
| 1990/1124 | mh->active = 1; | |
| 1990/0604 | if((*devtab[q->msg->type].write)(q->msg, mbw->buf, n) != n){ print("short write in mntxmit\n"); | |
| 1990/11211 | error(Eshortmsg); | |
| 1990/1123/sys/src/9/port/devmnt.c:736,749 – 1990/1124/sys/src/9/port/devmnt.c:769,783 | ||
| 1990/0604 | Read: qunlock(q); qlocked = 0; | |
| 1990/0703 |
| |
| 1990/1124 | if(waserror()){ /* 3 */ mnterrdequeue(m, mh); | |
| 1990/0703 | nexterror(); } | |
| 1990/0619 | n = (*devtab[q->msg->type].read)(q->msg, mh->mbr->buf, BUFSIZE); | |
| 1990/0703 |
| |
| 1990/1124 | poperror(); /* 3 */ | |
| 1990/0619 | if(convM2S(mh->mbr->buf, &mh->rhdr, n) == 0){ | |
| 1990/0604 |
| |
| 1990/1124 | print("bad reply message\n"); mnterrdequeue(m, mh); | |
| 1990/11211 | error(Ebadmsg); | |
| 1990/0604 | } /* | |
| 1990/1123/sys/src/9/port/devmnt.c:755,767 – 1990/1124/sys/src/9/port/devmnt.c:789,800 | ||
| 1990/1123 | if(tag == mh->thdr.tag){ /* it's mine */ | |
| 1990/0604 | q->reader = 0; if(w = q->writer){ /* advance a writer to reader */ | |
| 1990/1124 | mntwunlink(q, w); | |
| 1990/0604 | q->reader = w->p; | |
| 1990/1123 |
| |
| 1990/0717 | w->readreply = 1; | |
| 1990/0604 | wakeup(&w->r); } | |
| 1990/1124 | mh->active = 0; | |
| 1990/0604 | qunlock(q); qlocked = 0; goto Respond; | |
| 1990/1123/sys/src/9/port/devmnt.c:774,783 – 1990/1124/sys/src/9/port/devmnt.c:807,814 | ||
| 1990/1123 | goto Read; } w = &mnthdralloc.arena[tag]; | |
| 1990/1124 | if(w->flushing || !w->active) /* nothing to do; mntflush will clean up */ | |
| 1990/1123 | goto Read; | |
| 1990/1123/sys/src/9/port/devmnt.c:791,797 – 1990/1124/sys/src/9/port/devmnt.c:822,827 | ||
| 1990/0604 | /* put self in queue */ mh->next = q->writer; | |
| 1990/1123 | mh->prev = 0; | |
| 1990/0604 | q->writer = mh; | |
| 1990/1123/sys/src/9/port/devmnt.c:798,804 – 1990/1124/sys/src/9/port/devmnt.c:828,834 | ||
| 1990/0604 | qunlock(q); qlocked = 0; if(waserror()){ /* interrupted sleep */ | |
| 1990/1124 | mnterrdequeue(m, mh); | |
| 1990/0604 | nexterror(); } | |
| 1990/0717 | sleep(&mh->r, mntreadreply, mh); | |
| 1990/1123/sys/src/9/port/devmnt.c:807,812 – 1990/1124/sys/src/9/port/devmnt.c:837,843 | ||
| 1990/0604 | qlocked = 1; if(q->reader == u->p) /* i got promoted */ goto Read; | |
| 1990/1124 | mh->active = 0; | |
| 1990/0604 | qunlock(q); qlocked = 0; goto Respond; | |
| 1990/1123/sys/src/9/port/devmnt.c:814,824 – 1990/1124/sys/src/9/port/devmnt.c:845,858 | ||
| 1990/0227 | ||
| 1990/0604 | Respond: mqfree(q); | |
| 1990/1124 | poperror(); /* 2 */ | |
| 1990/11211 | if(mh->rhdr.type == Rerror){ if(m->mntpt) errors(mh->rhdr.ename); error(Eshutdown); | |
| 1990/1124 | }else if(mh->rhdr.type != mh->thdr.type+1){ print("bad type %d not %d in mntxmit\n", mh->rhdr.type, mh->thdr.type+1); error(Ebadmsg); | |
| 1990/0227 | } /* * Copy out on read | |
| 1990/1123/sys/src/9/port/devmnt.c:830,836 – 1990/1124/sys/src/9/port/devmnt.c:864,870 | ||
| 1990/0703 | } | |
| 1990/0619 | mbfree(mh->mbr); | |
| 1990/0227 | mbfree(mbw); | |
| 1990/1124 | poperror(); /* 1 */ | |
| 1990/0717 | } mntdump() | |