aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/acme/look.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2006-06-25 23:51:10 +0000
committerrsc <devnull@localhost>2006-06-25 23:51:10 +0000
commitced6fd340e1a93fe87eac906d749a1989729e1ce (patch)
tree6d20c5a04c2d7eb92a09e177dc62915a77b55c41 /src/cmd/acme/look.c
parent98df7c80d83005ec6e4403a13014451c5dbfae3e (diff)
downloadplan9port-ced6fd340e1a93fe87eac906d749a1989729e1ce.tar.gz
plan9port-ced6fd340e1a93fe87eac906d749a1989729e1ce.tar.bz2
plan9port-ced6fd340e1a93fe87eac906d749a1989729e1ce.zip
reopen plumber, build mail
Diffstat (limited to 'src/cmd/acme/look.c')
-rw-r--r--src/cmd/acme/look.c56
1 files changed, 42 insertions, 14 deletions
diff --git a/src/cmd/acme/look.c b/src/cmd/acme/look.c
index a048a353..e8f926f5 100644
--- a/src/cmd/acme/look.c
+++ b/src/cmd/acme/look.c
@@ -21,32 +21,60 @@ Window* openfile(Text*, Expand*, int);
int nuntitled;
void
-plumbproc(void *v)
+plumbthread(void *v)
{
+ CFid *fid;
Plumbmsg *m;
+ Timer *t;
USED(v);
threadsetname("plumbproc");
+
+ /*
+ * Loop so that if plumber is restarted, acme need not be.
+ */
for(;;){
- m = plumbrecvfid(plumbeditfid);
- if(m == nil)
- threadexits(nil);
- sendp(cplumb, m);
+ /*
+ * Connect to plumber.
+ */
+ plumbunmount();
+ while((fid = plumbopenfid("edit", OREAD|OCEXEC)) == nil){
+ t = timerstart(2000);
+ recv(t->c, nil);
+ timerstop(t);
+ }
+ plumbeditfid = fid;
+ plumbsendfid = plumbopenfid("send", OWRITE|OCEXEC);
+
+ /*
+ * Relay messages.
+ */
+ for(;;){
+ m = plumbrecvfid(plumbeditfid);
+ if(m == nil)
+ break;
+ sendp(cplumb, m);
+ }
+
+ /*
+ * Lost connection.
+ */
+ fid = plumbsendfid;
+ plumbsendfid = nil;
+ fsclose(fid);
+
+ fid = plumbeditfid;
+ plumbeditfid = nil;
+ fsclose(fid);
}
}
void
startplumbing(void)
{
- plumbeditfid = plumbopenfid("edit", OREAD|OCEXEC);
- if(plumbeditfid == nil)
- fprint(2, "acme: can't initialize plumber: %r\n");
- else{
- cplumb = chancreate(sizeof(Plumbmsg*), 0);
- chansetname(cplumb, "cplumb");
- threadcreate(plumbproc, nil, STACK);
- }
- plumbsendfid = plumbopenfid("send", OWRITE|OCEXEC);
+ cplumb = chancreate(sizeof(Plumbmsg*), 0);
+ chansetname(cplumb, "cplumb");
+ threadcreate(plumbthread, nil, STACK);
}