ref: c91e9322f1f76fa86db69ade780110664750408d
parent: 5e6f3db0d764ef8774e880c96e95f805df6a09e9
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Jun 8 12:21:16 EDT 2024
gefs: only start epochs for console procs that need them we shouldn't need to defer reclamation for procs that don't actually interact with the tree directly, especially since if they send on a channel they can stall for a while.
--- a/sys/src/cmd/gefs/cons.c
+++ b/sys/src/cmd/gefs/cons.c
@@ -14,6 +14,7 @@
char *sub;
int minarg;
int maxarg;
+ int epoch;
void (*fn)(int, char**, int);
};
@@ -391,7 +392,7 @@
Cmd cmdtab[] = {
/* admin */
- {.name="check", .sub=nil, .minarg=0, .maxarg=0, .fn=fsckfs},
+ {.name="check", .sub=nil, .minarg=0, .maxarg=0, .fn=fsckfs, .epoch=1},
{.name="df", .sub=nil, .minarg=0, .maxarg=0, .fn=showdf},
{.name="halt", .sub=nil, .minarg=0, .maxarg=0, .fn=haltfs},
{.name="help", .sub=nil, .minarg=0, .maxarg=0, .fn=help},
@@ -403,9 +404,9 @@
/* debugging */
{.name="show", .sub="fid", .minarg=0, .maxarg=0, .fn=showfid},
- {.name="show", .sub="tree", .minarg=0, .maxarg=1, .fn=showtree},
+ {.name="show", .sub="tree", .minarg=0, .maxarg=1, .fn=showtree, .epoch=1},
{.name="show", .sub="users", .minarg=0, .maxarg=0, .fn=showusers},
- {.name="show", .sub="bstate", .minarg=0, .maxarg=0, .fn=showbstate},
+ {.name="show", .sub="bstate", .minarg=0, .maxarg=0, .fn=showbstate, .epoch=1},
{.name="show", .sub="free", .minarg=0, .maxarg=0, .fn=showfree},
{.name="debug", .sub=nil, .minarg=0, .maxarg=1, .fn=setdbg},
{.name="save", .sub="trace", .minarg=0, .maxarg=1, .fn=savetrace},
@@ -424,11 +425,10 @@
fprint(fd, "gefs# ");
if((n = read(fd, buf, sizeof(buf)-1)) == -1)
break;
- epochstart(tid);
buf[n] = 0;
nf = tokenize(buf, f, nelem(f));
if(nf == 0 || strlen(f[0]) == 0)
- goto Next;
+ continue;
for(c = cmdtab; c->name != nil; c++){
ap = f;
na = nf;
@@ -444,7 +444,15 @@
}
if(na < c->minarg || na > c->maxarg)
continue;
- c->fn(fd, ap, na);
+ if(c->epoch)
+ epochstart(tid);
+ if(!waserror()){
+ c->fn(fd, ap, na);
+ poperror();
+ }else
+ fprint(fd, "%s: %s\n", f[0], errmsg());
+ if(c->epoch)
+ epochend(tid);
break;
}
if(c->name == nil){
@@ -453,7 +461,5 @@
fprint(fd, " %s", f[i]);
fprint(fd, "'\n");
}
-Next:
- epochend(tid);
}
}