| plan 9 kernel history: overview | file list | diff list |
1990/1127/port/stream.c (diff list | history)
| 1990/11211/sys/src/9/port/stream.c:35,41 – 1990/1127/sys/src/9/port/stream.c:35,40 (short | long | prev | next) | ||
| 1990/0227 | */ Stream *slist; Queue *qlist; | |
| 1990/11211/sys/src/9/port/stream.c:44,49 – 1990/1127/sys/src/9/port/stream.c:43,50 | ||
| 1990/0227 | */ typedef struct { int size; | |
| 1990/1127 | int lim; int made; | |
| 1990/0312 | Blist; | |
| 1990/03292 | QLock; /* qlock for sleepers on r */ | |
| 1990/0312 | Rendez r; /* sleep here waiting for blocks */ | |
| 1990/11211/sys/src/9/port/stream.c:66,94 – 1990/1127/sys/src/9/port/stream.c:67,90 | ||
| 1990/0227 | streaminit(void) { | |
| 1990/0907 | int class, i, n; | |
| 1990/0227 |
| |
| 1990/0911 | /* | |
| 1990/1127 | * allocate queues, streams | |
| 1990/0911 | */ | |
| 1990/0227 | slist = (Stream *)ialloc(conf.nstream * sizeof(Stream), 0); qlist = (Queue *)ialloc(conf.nqueue * sizeof(Queue), 0); | |
| 1990/1127 | /* * set limits on blocks */ | |
| 1990/0227 | n = conf.nblock; for(class = 0; class < Nclass; class++){ if(class < Nclass-1) n = n/2; bcp = &bclass[class]; | |
| 1990/0907 |
| |
| 1990/0911 |
| |
| 1990/0227 |
| |
| 1990/1127 | bcp->lim = n; bcp->made = 0; | |
| 1990/0227 | } | |
| 1990/0911 | /* | |
| 1990/11211/sys/src/9/port/stream.c:111,116 – 1990/1127/sys/src/9/port/stream.c:107,180 | ||
| 1990/0911 | } /* | |
| 1990/1127 | * upgrade a block 0 block to another class (called with bcp qlocked) */ newblock(Bclass *bcp) { Page *page; int n; Block *bp; uchar *cp; if(bcp->made > bcp->lim) return; if(bcp == bclass){ /* * create some level zero blocks and return */ page = newpage(1, 0, 0); page->va = VA(kmap(page)); n = BY2PG/sizeof(Block); bp = (Block *)(page->va); while(n-- > 0){ bp->flags = 0; bp->base = bp->lim = bp->rptr = bp->wptr = 0; if(bcp->first) bcp->last->next = bp; else bcp->first = bp; bcp->last = bp; bcp->made++; bp++; } } else { /* * create a page worth of new blocks */ page = newpage(1, 0, 0); page->va = VA(kmap(page)); n = BY2PG/bcp->size; cp = (uchar *)(page->va); while(n-- > 0){ /* * upgrade a level 0 block */ bp = allocb(0); qlock(bclass); bclass->made--; bcp->made++; bp->flags = bcp - bclass; qunlock(bclass); /* * tack on the data area */ bp->base = bp->rptr = bp->wptr = cp; cp += bcp->size; bp->lim = cp; if(bcp->first) bcp->last->next = bp; else bcp->first = bp; bcp->last = bp; } } return; } /* | |
| 1990/0227 | * allocate a block */ static int | |
| 1990/11211/sys/src/9/port/stream.c:138,143 – 1990/1127/sys/src/9/port/stream.c:202,209 | ||
| 1990/0227 | */ lock(bcp); while(bcp->first == 0){ | |
| 1990/1127 | if(newblock(bcp) == 0) continue; | |
| 1990/0227 | unlock(bcp); | |
| 1990/03292 | qlock(bcp); | |
| 1990/1113 | if(waserror()){ | |
| 1990/11211/sys/src/9/port/stream.c:846,852 – 1990/1127/sys/src/9/port/stream.c:912,918 | ||
| 1990/1009 | * if no stream, ignore it */ if(!c->stream) | |
| 1990/11211 |
| |
| 1990/1127 | return; | |
| 1990/11211 | return streamclose1(c->stream); | |
| 1990/1009 | } | |
| 1990/0227 | ||