# Tree maintenance for ofs
# and disk cache
Ofstree: module {
PATH: con "/dis/o/ofstree.dis";
Cfile: adt {
oprdfd: int; # Op fd in Tgets.
opwrfd: int; # Op fd in Tputs.
fsfd: ref Sys->FD; # on disk cache fd
d: ref Sys->Dir;
data: array of byte; # null if not read, array[0] of byte when empty
dirreaded: int; # directory was read (but might be empty!)
dirtyd: int;
created: int;
busy: int; # we're speaking Op, must wait.
oldname: string; # for rename in wstats
parentqid: big;
serverqid: Sys->Qid; # coherency
time: int; # when last known to be coherent
child: cyclic ref Cfile;
sibling: cyclic ref Cfile;
hash: cyclic ref Cfile;
create: fn(parent: ref Cfile, d: ref Sys->Dir): ref Cfile;
find: fn(q: big): ref Cfile;
updatedirdata: fn(f: self ref Cfile, data: array of byte);
getpath: fn(f: self ref Cfile): string;
walk: fn(fh: self ref Cfile, name: string): ref Cfile;
walkorcreate: fn(fh: self ref Cfile, name: string, d: ref Dir): (ref Cfile, int);
children: fn(f: self ref Cfile, cnt, off: int) : list of Sys->Dir;
wstat: fn(fh : self ref Cfile, d: ref Sys->Dir): string;
pwrite: fn(fh: self ref Cfile, data: array of byte, off: big): int;
pread: fn(fh : self ref Cfile, cnt: int, off: big): array of byte;
remove: fn(f: self ref Cfile): string;
dump: fn(f: self ref Cfile, t: int, pref: string);
text: fn(fh: self ref Cfile): string;
};
init: fn(msys: Sys, mstr: String, mstyx: Styx, merr: Error, n: Names, dir: string): string;
debug: int;
};
|