From 07acb90dd6daeac1ca3224fd550601de47b1635b Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 15 May 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-05-15 --- port/alloc.c | 6 ++---- port/portfns.h | 17 +++++++++++------ port/stream.c | 32 +++++++++++++++++++------------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/port/alloc.c b/port/alloc.c index 24196593bf3db9aefe45d57fb930de04cf023391..1ee12f448aa21943c411ccb8ca9ce9824523e8cc 100644 --- a/port/alloc.c +++ b/port/alloc.c @@ -95,8 +95,7 @@ xinit(void) if(np1 > conf.npage1) np1 = conf.npage1; - palloc.p1 = conf.base1; - conf.base1 += np1*BY2PG; + palloc.p1 = conf.base1 + (conf.npage1 - np1)*BY2PG; conf.npage1 -= np1; xhole(conf.base1, conf.npage1*BY2PG); conf.npage1 = conf.base1+(conf.npage1*BY2PG); @@ -106,8 +105,7 @@ xinit(void) if(np0 > conf.npage0) np0 = conf.npage0; - palloc.p0 = conf.base0; - conf.base0 += np0*BY2PG; + palloc.p0 = conf.base0 + (conf.npage0 - np0)*BY2PG; conf.npage0 -= np0; xhole(conf.base0, conf.npage0*BY2PG); conf.npage0 = conf.base0+(conf.npage0*BY2PG); diff --git a/port/portfns.h b/port/portfns.h index 019b99d0d13deae7ea2609c02e470c409884975e..c362d53b79c452f2ab2a9c73d51ee46ddcffa3db 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -1,6 +1,11 @@ void alarmkproc(void*); int anyready(void); Image* attachimage(int, Chan*, ulong, ulong); +long authread(Chan*, char*, int); +long authwrite(Chan*, char*, int); +long authcheck(Chan*, char*, int); +ulong authrequest(Session*, Fcall*); +void authreply(Session*, ulong, Fcall*); void bitdebug(void); void bitdepth(void); void bitreverse(uchar*, int); @@ -71,6 +76,7 @@ int freebroken(void); void freechan(Chan*); void freepte(Segment*, Pte*); void freesegs(int); +void freesession(Session*); int getc(IOQ*); void getcolor(ulong, ulong*, ulong*, ulong*); int getfields(char*, char**, int, char); @@ -172,8 +178,13 @@ void putstr(char*); void putstrn(char*, long); void putswap(Page*); ulong pwait(Waitmsg*); +int qconsume(Queue*, uchar*, int, int); void qlock(QLock*); +Queue* qopen(int); +int qproduce(Queue*, uchar*, int, int); +long qread(Queue*, char*, int, int); void qunlock(QLock*); +long qwrite(Queue*, char*, int); int readnum(ulong, char*, ulong, ulong, int); int readstr(ulong, char*, ulong, char*); void ready(Proc*); @@ -265,9 +276,3 @@ long keywrite(char*, int); long userwrite(char*, int); long hostownerwrite(char*, int); long hostdomainwrite(char*, int); -long authread(Chan*, char*, int); -long authwrite(Chan*, char*, int); -long authcheck(Chan*, char*, int); -ulong authrequest(Session*, Fcall*); -void authreply(Session*, ulong, Fcall*); -void freesession(Session*); diff --git a/port/stream.c b/port/stream.c index 1e950a5aa293ff4242abd962f3235f9536d12d26..82e4ce4b7af99276c569dceddc1dff5c7fa9ef73 100644 --- a/port/stream.c +++ b/port/stream.c @@ -218,7 +218,7 @@ consume(Queue *q, uchar *p, int len, int drop) } int -produce(Queue *q, uchar *p, int len) +produce(Queue *q, uchar *p, int len, int append) { Block *b; @@ -240,18 +240,24 @@ produce(Queue *q, uchar *p, int len) /* no waiting receivers, buffer */ if(q->len >= q->limit) return -1; - b = ialloc(sizeof(Block)+len); - if(b == 0) - return -1; - b->base = (uchar*)(b+1); - b->rp = b->base; - b->wp = b->lim = b->base + len; - memmove(b->rp, p, len); - if(q->bfirst) - q->blast->next = b; - else - q->bfirst = b; - q->last = b; + b = q->first; + if(append && b && b->lim-b->wp <= len){ + memmove(b->wp, p, len); + b->wp += len; + } else { + b = ialloc(sizeof(Block)+len); + if(b == 0) + return -1; + b->base = (uchar*)(b+1); + b->rp = b->base; + b->wp = b->lim = b->base + len; + memmove(b->rp, p, len); + if(q->bfirst) + q->blast->next = b; + else + q->bfirst = b; + q->last = b; + } q->len += len; unlock(q); return len;