From 5aea34165ceeaa0f3434a317aed7517f04a2185d Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sun, 5 Aug 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-08-05 --- port/qio.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/port/qio.c b/port/qio.c index 6770e08363e4f33711b3d4e5b32ced45c16748e7..0e5b7e2a746147d8c6742d560f960bd3c77464c6 100644 --- a/port/qio.c +++ b/port/qio.c @@ -1217,23 +1217,33 @@ qbwrite(Queue *q, Block *b) int qwrite(Queue *q, void *vp, int len) { - Block *b, *next; + int n, sofar; + Block *b; + uchar *p = vp; QDEBUG if(!islo()) print("qwrite hi %lux\n", getcallerpc(&q)); - next = nil; - b = mem2bl(vp, len); - if(waserror()){ - freeblist(next); - nexterror(); - } - for(; b != nil; b = next){ - next = b->next; - b->next = nil; + sofar = 0; + do { + n = len-sofar; + if(n > Maxatomic) + n = Maxatomic; + + b = allocb(n); + setmalloctag(b, (up->text[0]<<24)|(up->text[1]<<16)|(up->text[2]<<8)|up->text[3]); + if(waserror()){ + freeb(b); + nexterror(); + } + memmove(b->wp, p+sofar, n); + poperror(); + b->wp += n; + qbwrite(q, b); - } - poperror(); + + sofar += n; + } while(sofar < len && (q->state & Qmsg) == 0); return len; }