From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED autolearn=no autolearn_force=no version=3.4.4 Received: (qmail 32341 invoked from network); 12 Jun 2021 11:50:48 -0000 Received: from 1ess.inri.net (216.126.196.35) by inbox.vuxu.org with ESMTPUTF8; 12 Jun 2021 11:50:48 -0000 Received: from out5-smtp.messagingengine.com ([66.111.4.29]) by 1ess; Sat Jun 12 07:43:37 -0400 2021 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id 01B8E5C010F; Sat, 12 Jun 2021 07:43:36 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Sat, 12 Jun 2021 07:43:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=biobuf.link; h= message-id:to:subject:date:from:in-reply-to:mime-version :content-type:content-transfer-encoding; s=fm2; bh=Bx96u966atjAI HHg3tN1APz/OWclsx2tT1/bGYAjEuA=; b=hxhW5+nZFaz+jw/R8GcJ9eR0Hmj6Z NsuEMD1NJNkO2gdcGva/Py9njYtW5wF8C2AXIiXN0ypGYlpXc4hZLTfMOfCsc3Cg SCGhhqHspz5H7Afagqi5epN8KvT2lNxh+PMymoGha50QgQzaG50oHemFx8jHb/Vq GM0WahcemwYmAFn9M89l+kssQMIXGAfJVSuW+ksrfNDjbQYsxa2HengFvg72AWGs 7g8MD6g8eAybllxVf0SVMtazuiMzXxznuz+amnB+SZKlOIwUhxZK1qUQKK46Q+Hn DYq3K1+XrDFIdaK3CCMt2Ms74wfIWvDop3Ya29QIMVsVcafdVvY1ygT5g== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=Bx96u966atjAIHHg3tN1APz/OWclsx2tT1/bGYAjEuA=; b=QvimI431 SRBOCDlxovrxFLsFk3MYydqs7bb5SIZZ8opBlqA1c0VHh50sgsK2ZWYIM1omfqUN sgjdvhHLRU2kgnp3cL0z9HkOpxYAPlK5i6x1QDnXm8fZ6gYrUIzCG8rVAWLhhJqJ RpPRGyC/FsuCD02HGOIBO26j65aSxa9mjD3jRG8i+mOi7BNWZNahxVuNE8Q4V/N1 chU4B4F5Cx0xg3L0Sklr5q1KLpGC+BVVxBjsldXbCu9EAlFdTgUZ1Uo/Fz/5SsS6 w+4xyhjAcu/8AIVsxdtWBhIuk9FxQ9Exu5llxxiwcFgMDVdPtQN9mkJhJffv0/Fp 2ay10vSb62+o2Q== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrfedvtddggeegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefkvffufffhjgggtgfgsehtjeejtd dttddvnecuhfhrohhmpehjrghmvghsuchprghlmhgvrhcuoehjrghmvghssegsihhosghu fhdrlhhinhhkqeenucggtffrrghtthgvrhhnpeekvedvteelvdevkeehhfegueekjeeihf ekiedtvdfhleduieeutdefgfettdfhffenucevlhhushhtvghrufhiiigvpedtnecurfgr rhgrmhepmhgrihhlfhhrohhmpehjrghmvghssegsihhosghufhdrlhhinhhk X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA for <9front@9front.org>; Sat, 12 Jun 2021 07:43:35 -0400 (EDT) Message-ID: <2EA4EAAC2E19642EFB842B11A603BF2D@biobuf.link> To: 9front@9front.org Date: Sat, 12 Jun 2021 12:43:29 +0100 From: james palmer In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: private base extension Subject: Re: [9front] [PATCH] acme: limit reads of the event file to one read. Reply-To: 9front@9front.org Precedence: bulk caught a small error in this, winclose() was calling free(cur); then free(cur->buf); new patch preventing a crash on some window closing follows. thanks, - james From 57ebf7a69f14fa52cffea12883c2c7b5257a1bdd From: james palmer Date: Sat, 12 Jun 2021 11:40:03 +0000 Subject: [PATCH] acme: limit event file reads to one event this makes writing clients easier because events can be pasted into a sufficiently large buffer and parsed rather than read one byte at a time. --- diff 09b0eb0d1ac7a66569263d2c48aea96e524ccebe 57ebf7a69f14fa52cffea12883c2c7b5257a1bdd --- a/sys/src/cmd/acme/dat.h Tue Jun 8 21:13:57 2021 +++ b/sys/src/cmd/acme/dat.h Sat Jun 12 12:40:03 2021 @@ -44,6 +44,7 @@ typedef struct Fid Fid; typedef struct File File; typedef struct Elog Elog; +typedef struct Event Event; typedef struct Mntdir Mntdir; typedef struct Range Range; typedef struct Rangeset Rangeset; @@ -256,8 +257,8 @@ int rdselfd; Column *col; Xfid *eventx; - char *events; - int nevents; + Event *evhead; + Event *evtail; int owner; int maxlines; Dirlist **dlp; @@ -278,6 +279,14 @@ int tagexpand; int taglines; Rectangle tagtop; + int deleted; +}; + +struct Event { + char *buf; + int sz; + int offset; + Event *next; }; void wininit(Window*, Window*, Rectangle); --- a/sys/src/cmd/acme/wind.c Tue Jun 8 21:13:57 2021 +++ b/sys/src/cmd/acme/wind.c Sat Jun 12 12:40:03 2021 @@ -22,6 +22,9 @@ Rune *rp; int nc, i; + w->deleted = 0; + w->evhead = nil; + w->evtail = nil; w->tag.w = w; w->taglines = 1; w->tagexpand = TRUE; @@ -311,6 +314,7 @@ winclose(Window *w) { int i; + Event *cur, *next; if(decref(w) == 0){ xfidlog(w, "del"); @@ -322,7 +326,15 @@ for(i=0; inincl; i++) free(w->incl[i]); free(w->incl); - free(w->events); + + cur = w->evhead; + while(cur) { + next = cur->next; + free(cur->buf); + free(cur); + cur = next; + } + free(w); } } @@ -331,12 +343,21 @@ windelete(Window *w) { Xfid *x; + Event *cur, *next; x = w->eventx; if(x){ - w->nevents = 0; - free(w->events); - w->events = nil; + cur = w->evhead; + while(cur) { + next = cur->next; + free(cur->buf); + free(cur); + cur = next; + } + + w->deleted = 1; + w->evhead = nil; + w->evtail = nil; w->eventx = nil; sendp(x->c, nil); /* wake him up */ } @@ -669,26 +690,42 @@ void winevent(Window *w, char *fmt, ...) { - int n; - char *b; Xfid *x; + char *buf; va_list arg; + Event *ev; if(w->nopen[QWevent] == 0) return; if(w->owner == 0) - error("no window owner"); + error("no window owner"); + + ev = emalloc(sizeof(Event)); + ev->next = nil; + va_start(arg, fmt); - b = vsmprint(fmt, arg); + buf = vsmprint(fmt, arg); va_end(arg); - if(b == nil) + + if(buf == nil) error("vsmprint failed"); - n = strlen(b); - w->events = erealloc(w->events, w->nevents+1+n); - w->events[w->nevents++] = w->owner; - memmove(w->events+w->nevents, b, n); - free(b); - w->nevents += n; + + ev->buf = smprint("%c%s", w->owner, buf); + if(!ev->buf) + error("smprint failed"); + free(buf); + + ev->offset = 0; + ev->sz = strlen(ev->buf); + + if(w->evhead) { + w->evtail->next = ev; + w->evtail = ev; + } else { + w->evhead = ev; + w->evtail = ev; + } + x = w->eventx; if(x){ w->eventx = nil; --- a/sys/src/cmd/acme/xfid.c Tue Jun 8 21:13:57 2021 +++ b/sys/src/cmd/acme/xfid.c Sat Jun 12 12:40:03 2021 @@ -991,34 +991,45 @@ xfideventread(Xfid *x, Window *w) { Fcall fc; - char *b; - int i, n; + Event *ev; + int bufsz; + char *buf; - i = 0; x->flushed = FALSE; - while(w->nevents == 0){ - if(i){ - if(!x->flushed) - respond(x, &fc, "window shut down"); + while(!w->evhead){ + if(w->deleted) { + respond(x, &fc, "window shut down"); return; } + w->eventx = x; winunlock(w); recvp(x->c); winlock(w, 'F'); - i++; } - - n = w->nevents; - if(n > x->count) - n = x->count; - fc.count = n; - fc.data = w->events; + + ev = w->evhead; + bufsz = ev->sz - ev->offset < x->count + ? ev->sz - ev->offset : x->count; + buf = emalloc(bufsz); + + memcpy(buf, ev->buf+ev->offset, bufsz); + ev->offset += bufsz; + + if(ev->offset == bufsz) { + w->evhead = ev->next; + free(ev->buf); + free(ev); + + if(!w->evhead) + w->evtail = nil; + } + + + fc.count = bufsz; + fc.data = buf; respond(x, &fc, nil); - b = w->events; - w->events = estrdup(w->events+n); - free(b); - w->nevents -= n; + free(buf); } void