Fighting the good fight.

Move libfmt, libutf into subdirectories of lib9.

Add poll-based socket i/o to libthread, so that we can
avoid using multiple procs when possible, thus removing
dependence on crappy pthreads implementations.

Convert samterm, acme to the single-proc libthread.

Bring libcomplete, acme up-to-date w.r.t. Plan 9 distribution.
This commit is contained in:
rsc 2004-02-29 22:10:26 +00:00
parent d51419bf43
commit 5a8e63b2f0
107 changed files with 665 additions and 6637 deletions

View file

@ -59,7 +59,6 @@ threadmain(int argc, char *argv[])
{
int i;
char *p, *loadfile;
char buf[256];
Column *c;
int ncol;
Display *d;
@ -70,6 +69,9 @@ threadmain(int argc, char *argv[])
loadfile = nil;
ARGBEGIN{
case 'a':
globalautoindent = TRUE;
break;
case 'b':
bartflag = TRUE;
break;
@ -98,7 +100,7 @@ threadmain(int argc, char *argv[])
break;
default:
Usage:
fprint(2, "usage: acme -c ncol -f fontname -F fixedwidthfontname -l loadfile\n");
fprint(2, "usage: acme -a -c ncol -f fontname -F fixedwidthfontname -l loadfile\n");
exits("usage");
}ARGEND
@ -183,7 +185,7 @@ threadmain(int argc, char *argv[])
fprint(2, "acme: can't initialize plumber: %r\n");
else{
cplumb = chancreate(sizeof(Plumbmsg*), 0);
proccreate(plumbproc, nil, STACK);
threadcreate(plumbproc, nil, STACK);
}
plumbsendfd = plumbopen("send", OWRITE|OCEXEC);
@ -315,7 +317,7 @@ acmeerrorproc(void *v)
USED(v);
threadsetname("acmeerrorproc");
buf = emalloc(8192+1);
while((n=read(errorfd, buf, 8192)) >= 0){
while((n=threadread(errorfd, buf, 8192)) >= 0){
buf[n] = '\0';
sendp(cerr, estrdup(buf));
}
@ -324,8 +326,7 @@ acmeerrorproc(void *v)
void
acmeerrorinit(void)
{
int fd, pfd[2];
char buf[64];
int pfd[2];
if(pipe(pfd) < 0)
error("can't create pipe");
@ -351,7 +352,7 @@ acmeerrorinit(void)
errorfd = pfd[1];
if(errorfd < 0)
error("can't re-open acmeerror file");
proccreate(acmeerrorproc, nil, STACK);
threadcreate(acmeerrorproc, nil, STACK);
}
void
@ -362,7 +363,7 @@ plumbproc(void *v)
USED(v);
threadsetname("plumbproc");
for(;;){
m = plumbrecv(plumbeditfd);
m = threadplumbrecv(plumbeditfd);
if(m == nil)
threadexits(nil);
sendp(cplumb, m);
@ -399,6 +400,7 @@ keyboardthread(void *v)
winlock(t->w, 'K');
wincommit(t->w, t);
winunlock(t->w);
flushwarnings(1);
flushimage(display, 1);
}
alts[KTimer].c = nil;
@ -425,6 +427,7 @@ keyboardthread(void *v)
}
if(nbrecv(keyboardctl->c, &r) > 0)
goto casekeyboard;
flushwarnings(1);
flushimage(display, 1);
break;
}
@ -467,6 +470,7 @@ mousethread(void *v)
draw(screen, screen->r, display->white, nil, ZP);
scrlresize();
rowresize(&row, screen->clipr);
flushwarnings(1);
flushimage(display, 1);
break;
case MPlumb:
@ -477,6 +481,7 @@ mousethread(void *v)
else if(strcmp(act, "showdata")==0)
plumbshow(pm);
}
flushwarnings(1);
flushimage(display, 1);
plumbfree(pm);
break;
@ -562,6 +567,7 @@ mousethread(void *v)
goto Continue;
}
Continue:
flushwarnings(0);
flushimage(display, 1);
qunlock(&row.lk);
break;
@ -916,36 +922,48 @@ iconinit(void)
void
acmeputsnarf(void)
{
int fd, i, n;
int i, n;
Fmt f;
char *s;
if(snarffd<0 || snarfbuf.nc==0)
if(snarfbuf.nc==0)
return;
if(snarfbuf.nc > MAXSNARF)
return;
fd = open("/dev/snarf", OWRITE);
if(fd < 0)
return;
fmtstrinit(&f);
for(i=0; i<snarfbuf.nc; i+=n){
n = snarfbuf.nc-i;
if(n >= NSnarf)
n = NSnarf;
bufread(&snarfbuf, i, snarfrune, n);
if(fprint(fd, "%.*S", n, snarfrune) < 0)
if(fmtprint(&f, "%.*S", n, snarfrune) < 0)
break;
}
close(fd);
s = fmtstrflush(&f);
if(s && s[0])
putsnarf(s);
free(s);
}
void
acmegetsnarf()
acmegetsnarf(void)
{
int nulls;
char *s;
int nb, nr, nulls, len;
Rune *r;
if(snarfbuf.nc > MAXSNARF)
s = getsnarf();
if(s == nil || s[0]==0){
free(s);
return;
if(snarffd < 0)
return;
seek(snarffd, 0, 0);
}
len = strlen(s);
r = runemalloc(len+1);
cvttorunes(s, len, r, &nb, &nr, &nulls);
bufreset(&snarfbuf);
bufload(&snarfbuf, 0, snarffd, &nulls);
bufinsert(&snarfbuf, 0, r, nr);
free(r);
free(s);
}