diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-04-04 06:47:26 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-04-04 06:47:26 +0200 |
commit | a74542613df2305bd2fde7485e55fce4fafee0e6 (patch) | |
tree | 8084cb56935f226e017b68d1602ce04c55e68ca7 /sys/src/cmd | |
parent | 84e16f5b5c91048bfc3898654d99fb2bcfa9dfa2 (diff) |
rio: /dev/kbd cleanup
- use free running unsigned indeces for window kbdq
- emalloc() vs malloc() in xfid
Diffstat (limited to 'sys/src/cmd')
-rw-r--r-- | sys/src/cmd/rio/wind.c | 62 | ||||
-rw-r--r-- | sys/src/cmd/rio/xfid.c | 6 |
2 files changed, 30 insertions, 38 deletions
diff --git a/sys/src/cmd/rio/wind.c b/sys/src/cmd/rio/wind.c index e833422d4..d68584040 100644 --- a/sys/src/cmd/rio/wind.c +++ b/sys/src/cmd/rio/wind.c @@ -159,7 +159,7 @@ showcandidates(Window *, Completion *); void winctl(void *arg) { - Rune *rp, *up; + Rune *rp, *up, r; uint qh, q0; int nr, nb, c, wid, i, npart, initial, lastb; char *s, *t, part[3]; @@ -174,7 +174,7 @@ winctl(void *arg) Wctlmesg wcm; Completion *cr; char *kbdq[32], *kbds; - int kbdqr, kbdqw; + uint kbdqr, kbdqw; w = arg; threadsetname("winctl-id%d", w->id); @@ -216,7 +216,6 @@ winctl(void *arg) alts[Wgone].op = CHANNOP; alts[NWALT].op = CHANEND; - memset(kbdq, 0, sizeof(kbdq)); kbdqr = kbdqw = 0; npart = 0; lastb = -1; @@ -258,45 +257,38 @@ winctl(void *arg) } switch(alt(alts)){ case WKbd: - if(w->kbdopen){ - i = (kbdqw+1) % nelem(kbdq); - if(i != kbdqr) - kbdqw = i; - } else if(*kbds == 'c'){ - Rune r; - - chartorune(&r, kbds+1); - if(r) - wkeyctl(w, r); + if(kbdqw - kbdqr < nelem(kbdq)) + kbdq[kbdqw++ % nelem(kbdq)] = kbds; + else + free(kbds); + if(w->kbdopen) + continue; + while(kbdqr != kbdqw){ + kbds = kbdq[kbdqr++ % nelem(kbdq)]; + if(*kbds == 'c'){ + chartorune(&r, kbds+1); + if(r) + wkeyctl(w, r); + } + free(kbds); } - free(kbdq[kbdqw]); - kbdq[kbdqw] = kbds; break; - case WKbdread: recv(crm.c1, &pair); - nb = pair.ns; - pair.ns = 0; - t = pair.s; + nb = 0; while(kbdqr != kbdqw){ - int m; - - i = (kbdqr+1) % nelem(kbdq); - if(kbdq[i] == nil) + kbds = kbdq[kbdqr % nelem(kbdq)]; + i = strlen(kbds)+1; + if(nb+i > pair.ns) break; - m = strlen(kbdq[i])+1; - nb -= m; - if(nb < 0) - break; - memmove(t, kbdq[i], m); - t += m, pair.ns += m; - free(kbdq[i]); - kbdq[i] = nil; - kbdqr = i; + memmove((char*)pair.s + nb, kbds, i); + free(kbds); + nb += i; + kbdqr++; } + pair.ns = nb; send(crm.c2, &pair); continue; - case WMouse: if(w->mouseopen) { w->mouse.counter++; @@ -332,8 +324,8 @@ winctl(void *arg) continue; case WCtl: if(wctlmesg(w, wcm.type, wcm.r, wcm.p) == Exited){ - for(i=0; i<nelem(kbdq); i++) - free(kbdq[i]); + while(kbdqr != kbdqw) + free(kbdq[kbdqr++ % nelem(kbdq)]); chanfree(crm.c1); chanfree(crm.c2); chanfree(mrm.cm); diff --git a/sys/src/cmd/rio/xfid.c b/sys/src/cmd/rio/xfid.c index 879dc01d5..d41ec61e2 100644 --- a/sys/src/cmd/rio/xfid.c +++ b/sys/src/cmd/rio/xfid.c @@ -630,7 +630,7 @@ xfidread(Xfid *x) case Qwctl: if(cnt < 4*12){ filsysrespond(x->fs, x, &fc, Etooshort); - break; + return; } alts[Adata].c = w->wctlread; goto Consmesg; @@ -665,13 +665,13 @@ xfidread(Xfid *x) } c1 = crm.c1; c2 = crm.c2; - t = malloc(cnt+UTFmax+1); /* room to unpack partial rune plus */ + t = emalloc(cnt+UTFmax+1); /* room to unpack partial rune plus */ pair.s = t; pair.ns = cnt; send(c1, &pair); recv(c2, &pair); fc.data = pair.s; - fc.count = pair.ns; + fc.count = min(cnt, pair.ns); filsysrespond(x->fs, x, &fc, nil); free(t); break; |