| plan 9 kernel history: overview | file list | diff list |
1990/11211/port/stream.c (diff list | history)
| 1990/11161/sys/src/9/port/stream.c:239,245 – 1990/11211/sys/src/9/port/stream.c:239,245 (short | long | prev | next) | ||
| 1990/0227 | if(q == &qlist[conf.nqueue]){ print("no more queues\n"); | |
| 1990/11211 | error(Enoqueue); | |
| 1990/0227 | } q->flag = QINUSE; | |
| 1990/11161/sys/src/9/port/stream.c:335,341 – 1990/11211/sys/src/9/port/stream.c:335,341 | ||
| 1990/0227 | Queue *q; if(s->procq->next == WR(s->devq)) | |
| 1990/11211 | error(Ebadld); | |
| 1990/0227 | q = s->procq->next; if(q->info->close) (*q->info->close)(RD(q)); | |
| 1990/11161/sys/src/9/port/stream.c:541,547 – 1990/11211/sys/src/9/port/stream.c:541,547 | ||
| 1990/0629 | freeb(bp); else { freeb(bp); | |
| 1990/11211 | error(Ehungup); | |
| 1990/0629 | } | |
| 1990/0227 | } | |
| 1990/11161/sys/src/9/port/stream.c:554,564 – 1990/11211/sys/src/9/port/stream.c:554,564 | ||
| 1990/0911 | Qinfo *qi; | |
| 1990/0227 | if(name == 0) | |
| 1990/11211 | error(Ebadld); | |
| 1990/0911 | for(qi = lds; qi; qi = qi->next) if(strcmp(qi->name, name)==0) return qi; | |
| 1990/0227 |
| |
| 1990/11211 | error(Ebadld); | |
| 1990/0227 | } /* | |
| 1990/11161/sys/src/9/port/stream.c:608,615 – 1990/11211/sys/src/9/port/stream.c:608,615 | ||
| 1990/0907 | * the per stream directory structure */ Dirtab streamdir[]={ | |
| 1990/11211 | "data", {Sdataqid}, 0, 0600, "ctl", {Sctlqid}, 0, 0600, | |
| 1990/0907 | }; /* | |
| 1990/11161/sys/src/9/port/stream.c:633,639 – 1990/11211/sys/src/9/port/stream.c:633,639 | ||
| 1990/0227 | else return -1; | |
| 1990/11211 | devdir(c, (Qid){STREAMQID(STREAMID(c->qid.path),tab->qid.path), 0}, tab->name, tab->length, | |
| 1990/0227 | tab->perm, dp); return 1; } | |
| 1990/11161/sys/src/9/port/stream.c:661,667 – 1990/11211/sys/src/9/port/stream.c:661,667 | ||
| 1990/0227 | } if(s == &slist[conf.nstream]){ print("no more streams\n"); | |
| 1990/11211 | error(Enostream); | |
| 1990/0227 | } if(waserror()){ | |
| 1990/11161 | qunlock(s); | |
| 1990/11161/sys/src/9/port/stream.c:716,726 – 1990/11211/sys/src/9/port/stream.c:716,726 | ||
| 1990/0227 | */ for(s = slist; s < &slist[conf.nstream]; s++) { if(s->inuse && s->type == c->type && s->dev == c->dev | |
| 1990/11211 | && s->id == STREAMID(c->qid.path)){ | |
| 1990/11161 | qlock(s); | |
| 1990/0227 | if(s->inuse && s->type == c->type && s->dev == c->dev | |
| 1990/11211 | && s->id == STREAMID(c->qid.path)){ | |
| 1990/0227 | s->inuse++; | |
| 1990/0629 | s->opens++; | |
| 1990/0227 | c->stream = s; | |
| 1990/11161/sys/src/9/port/stream.c:734,740 – 1990/11211/sys/src/9/port/stream.c:734,740 | ||
| 1990/0227 | /* * create a new stream */ | |
| 1990/1009 |
| |
| 1990/11211 | c->stream = streamnew(c->type, c->dev, STREAMID(c->qid.path), qi, 0); | |
| 1990/0227 | } /* | |
| 1990/11161/sys/src/9/port/stream.c:792,802 – 1990/11211/sys/src/9/port/stream.c:792,803 | ||
| 1990/0227 | * On the last close of a stream, for each queue on the * stream release its blocks and call its close routine. */ | |
| 1990/11211 | int | |
| 1990/1009 | streamclose1(Stream *s) | |
| 1990/0227 | { Queue *q, *nq; Block *bp; | |
| 1990/11211 | int rv; | |
| 1990/0227 | /* | |
| 1990/0629 | * decrement the reference count | |
| 1990/11161/sys/src/9/port/stream.c:829,835 – 1990/11211/sys/src/9/port/stream.c:830,836 | ||
| 1990/0629 | flushq(q); } | |
| 1990/0227 | } | |
| 1990/0629 |
| |
| 1990/11211 | rv = --(s->opens); | |
| 1990/0227 | /* | |
| 1990/0629 | * leave it and free it | |
| 1990/11161/sys/src/9/port/stream.c:836,843 – 1990/11211/sys/src/9/port/stream.c:837,845 | ||
| 1990/0227 | */ | |
| 1990/0629 | streamexit(s, 1); | |
| 1990/11161 | qunlock(s); | |
| 1990/11211 | return rv; | |
| 1990/0227 | } | |
| 1990/1009 |
| |
| 1990/11211 | int | |
| 1990/1009 | streamclose(Chan *c) { /* | |
| 1990/11161/sys/src/9/port/stream.c:844,851 – 1990/11211/sys/src/9/port/stream.c:846,853 | ||
| 1990/1009 | * if no stream, ignore it */ if(!c->stream) | |
| 1990/11211 | return 1; return streamclose1(c->stream); | |
| 1990/1009 | } | |
| 1990/0227 | /* | |
| 1990/11161/sys/src/9/port/stream.c:918,928 – 1990/11211/sys/src/9/port/stream.c:920,930 | ||
| 1990/0930 | Stream *s; s = c->stream; | |
| 1990/11211 | if(STREAMTYPE(c->qid.path) == Sctlqid){ | |
| 1990/0930 | sprint(num, "%d", s->id); return stringread(c, buf, n, num); } else { | |
| 1990/11211 | if(CHDIR & c->qid.path) | |
| 1990/0930 | return devdirread(c, vbuf, n, 0, 0, streamgen); else panic("streamctlread"); | |
| 1990/11161/sys/src/9/port/stream.c:953,959 – 1990/11211/sys/src/9/port/stream.c:955,961 | ||
| 1990/0930 | int left, i; | |
| 1990/0227 | uchar *buf = vbuf; | |
| 1990/0930 |
| |
| 1990/11211 | if(STREAMTYPE(c->qid.path) != Sdataqid) | |
| 1990/0930 | return streamctlread(c, vbuf, n); | |
| 1990/0227 | /* | |
| 1990/11161/sys/src/9/port/stream.c:978,984 – 1990/11211/sys/src/9/port/stream.c:980,986 | ||
| 1990/0331 | if(s->hread++ < 3) break; else | |
| 1990/11211 | error(Ehungup); | |
| 1990/0331 | } | |
| 1990/0227 | sleep(&q->r, &isinput, (void *)q); continue; | |
| 1990/11161/sys/src/9/port/stream.c:1023,1029 – 1990/11211/sys/src/9/port/stream.c:1025,1031 | ||
| 1990/0227 | Block *bp; | |
| 1990/0930 | Stream *s; | |
| 1990/0227 | ||
| 1990/0930 |
| |
| 1990/11211 | if(STREAMTYPE(c->qid.path) != Sctlqid) | |
| 1990/0930 | panic("streamctlwrite %lux", c->qid); s = c->stream; | |
| 1990/11161/sys/src/9/port/stream.c:1095,1101 – 1990/11211/sys/src/9/port/stream.c:1097,1103 | ||
| 1990/0227 | /* * decode the qid */ | |
| 1990/0930 |
| |
| 1990/11211 | if(STREAMTYPE(c->qid.path) != Sdataqid) | |
| 1990/0930 | return streamctlwrite(c, a, n); | |
| 1990/0227 | /* | |
| 1990/11161/sys/src/9/port/stream.c:1103,1109 – 1990/11211/sys/src/9/port/stream.c:1105,1111 | ||
| 1990/0227 | */ q = s->procq; if(q->other->flag & QHUNGUP) | |
| 1990/11211 | error(Ehungup); | |
| 1990/0227 | ||
| 1990/0930 | if(!docopy && GLOBAL(a)){ | |
| 1990/0227 | /* | |