| plan 9 kernel history: overview | file list | diff list |
1990/0619/port/devmnt.c (diff list | history)
| 1990/0617/sys/src/9/port/devmnt.c:65,70 – 1990/0619/sys/src/9/port/devmnt.c:65,71 (short | long | prev | next) | ||
| 1990/0303 | struct { Lock; | |
| 1990/0619 | QLock; | |
| 1990/0604 | MntQ *arena; MntQ *free; }mntqalloc; | |
| 1990/0617/sys/src/9/port/devmnt.c:141,147 – 1990/0619/sys/src/9/port/devmnt.c:142,148 | ||
| 1990/0227 | } | |
| 1990/0604 | MntQ* | |
| 1990/0617 |
| |
| 1990/0619 | mqalloc(Chan *msg) /* mntqalloc is qlocked */ | |
| 1990/0604 | { MntQ *q; | |
| 1990/0617/sys/src/9/port/devmnt.c:166,172 – 1990/0619/sys/src/9/port/devmnt.c:167,172 | ||
| 1990/0604 | lock(mq); if(--mq->ref == 0){ | |
| 1990/0617 |
| |
| 1990/0604 | msg = mq->msg; mq->msg = 0; lock(&mntqalloc); | |
| 1990/0617/sys/src/9/port/devmnt.c:271,277 – 1990/0619/sys/src/9/port/devmnt.c:271,277 | ||
| 1990/0604 | * Look for queue to same msg channel */ q = mntqalloc.arena; | |
| 1990/0617 |
| |
| 1990/0619 | qlock(&mntqalloc); | |
| 1990/0604 | for(i=0; i<conf.nmntdev; i++,q++) if(q->msg==cm){ lock(q); | |
| 1990/0617/sys/src/9/port/devmnt.c:286,292 – 1990/0619/sys/src/9/port/devmnt.c:286,292 | ||
| 1990/0617 | m->q = mqalloc(cm); | |
| 1990/0604 | out: | |
| 1990/0617 |
| |
| 1990/0619 | qunlock(&mntqalloc); | |
| 1990/0227 | mh = mhalloc(); if(waserror()){ mhfree(mh); | |
| 1990/0617/sys/src/9/port/devmnt.c:674,689 – 1990/0619/sys/src/9/port/devmnt.c:674,689 | ||
| 1990/0227 | mntxmit(Mnt *m, Mnthdr *mh) { ulong n; | |
| 1990/0619 | Mntbuf *mbw; | |
| 1990/0604 | Mnthdr *w, *ow; Chan *mntpt; MntQ *q; int qlocked; | |
| 1990/0227 |
| |
| 1990/0619 | mh->mbr = mballoc(); | |
| 1990/0227 | mbw = mballoc(); if(waserror()){ | |
| 1990/0619 | mbfree(mh->mbr); | |
| 1990/0227 | mbfree(mbw); nexterror(); } | |
| 1990/0617/sys/src/9/port/devmnt.c:712,722 – 1990/0619/sys/src/9/port/devmnt.c:712,722 | ||
| 1990/0227 | /* * Read response */ | |
| 1990/0604 |
| |
| 1990/0619 | n = (*devtab[q->msg->type].read)(q->msg, mh->mbr->buf, BUFSIZE); | |
| 1990/0604 | mqfree(q); | |
| 1990/0511 | poperror(); | |
| 1990/0619 | if(convM2S(mh->mbr->buf, &mh->rhdr, n) == 0){ | |
| 1990/0604 | print("format error in mntxmit\n"); error(0, Ebadmsg); | |
| 1990/0511 | } | |
| 1990/0617/sys/src/9/port/devmnt.c:744,750 – 1990/0619/sys/src/9/port/devmnt.c:744,750 | ||
| 1990/0511 | */ if(mh->thdr.type == Tread) memcpy(mh->thdr.data, mh->rhdr.data, mh->rhdr.count); | |
| 1990/0619 | mbfree(mh->mbr); | |
| 1990/0511 | mbfree(mbw); poperror(); return; | |
| 1990/0617/sys/src/9/port/devmnt.c:769,777 – 1990/0619/sys/src/9/port/devmnt.c:769,777 | ||
| 1990/0604 | Read: qunlock(q); qlocked = 0; | |
| 1990/0617 |
| |
| 1990/0619 | n = (*devtab[q->msg->type].read)(q->msg, mh->mbr->buf, BUFSIZE); if(convM2S(mh->mbr->buf, &mh->rhdr, n) == 0){ print("format error in mntxmit\n"); | |
| 1990/0604 | mnterrdequeue(q, mh); error(0, Ebadmsg); } | |
| 1990/0617/sys/src/9/port/devmnt.c:795,807 – 1990/0619/sys/src/9/port/devmnt.c:795,807 | ||
| 1990/0604 | /* * Hand response to correct recipient */ | |
| 1990/0617 |
| |
| 1990/0619 | if(q->writer==0) print("response with empty queue\n"); | |
| 1990/0604 | for(ow=0,w=q->writer; w; ow=w,w=w->next) if(mh->rhdr.fid == w->thdr.fid && mh->rhdr.type == w->thdr.type+1){ Mntbuf *t; | |
| 1990/0619 | t = mh->mbr; mh->mbr = w->mbr; | |
| 1990/0604 | w->mbr = t; memcpy(&w->rhdr, &mh->rhdr, sizeof mh->rhdr); /* take recipient from queue */ | |
| 1990/0617/sys/src/9/port/devmnt.c:814,820 – 1990/0619/sys/src/9/port/devmnt.c:814,819 | ||
| 1990/0604 | } goto Read; }else{ | |
| 1990/0617/sys/src/9/port/devmnt.c:822,828 – 1990/0619/sys/src/9/port/devmnt.c:821,827 | ||
| 1990/0604 | qunlock(q); qlocked = 0; if(waserror()){ /* interrupted sleep */ | |
| 1990/0617 |
| |
| 1990/0619 | print("interrupted i/o\n"); | |
| 1990/0604 | mnterrdequeue(q, mh); nexterror(); } | |
| 1990/0617/sys/src/9/port/devmnt.c:832,838 – 1990/0619/sys/src/9/port/devmnt.c:831,836 | ||
| 1990/0604 | qlocked = 1; if(q->reader == u->p) /* i got promoted */ goto Read; | |
| 1990/0617/sys/src/9/port/devmnt.c:852,858 – 1990/0619/sys/src/9/port/devmnt.c:850,856 | ||
| 1990/0227 | */ if(mh->thdr.type == Tread) memcpy(mh->thdr.data, mh->rhdr.data, mh->rhdr.count); | |
| 1990/0619 | mbfree(mh->mbr); | |
| 1990/0227 | mbfree(mbw); poperror(); } | |