upas/fs: getting rid of the fine-grain locking...
now that locking works, its time to get rid of it. given that the only concurrency is between the periodic reader process and the filesystem code, just make sure the filesystem rpc handlers do not run concurrenty while syncing is in progress with a single qlock.
This commit is contained in:
parent
c8d9390070
commit
efddf48500
3 changed files with 22 additions and 127 deletions
|
@ -147,7 +147,6 @@ struct Mcache {
|
||||||
|
|
||||||
typedef struct Mailbox Mailbox;
|
typedef struct Mailbox Mailbox;
|
||||||
struct Mailbox {
|
struct Mailbox {
|
||||||
QLock;
|
|
||||||
int refs;
|
int refs;
|
||||||
Mailbox *next;
|
Mailbox *next;
|
||||||
int id;
|
int id;
|
||||||
|
@ -355,7 +354,6 @@ extern ulong msgallocd;
|
||||||
extern ulong msgfreed;
|
extern ulong msgfreed;
|
||||||
extern Mailbox *mbl;
|
extern Mailbox *mbl;
|
||||||
extern Message *root;
|
extern Message *root;
|
||||||
extern QLock mbllock;
|
|
||||||
extern Refs *rtab;
|
extern Refs *rtab;
|
||||||
|
|
||||||
#define dprint(...) if(debug) fprint(2, __VA_ARGS__); else {}
|
#define dprint(...) if(debug) fprint(2, __VA_ARGS__); else {}
|
||||||
|
|
|
@ -109,7 +109,6 @@ enum
|
||||||
Hsize= 1999,
|
Hsize= 1999,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
char *mntpt;
|
char *mntpt;
|
||||||
char user[Elemlen];
|
char user[Elemlen];
|
||||||
int Dflag;
|
int Dflag;
|
||||||
|
@ -121,7 +120,6 @@ int debug;
|
||||||
int plumbing = 1;
|
int plumbing = 1;
|
||||||
ulong cachetarg = Maxcache;
|
ulong cachetarg = Maxcache;
|
||||||
Mailbox *mbl;
|
Mailbox *mbl;
|
||||||
QLock mbllock;
|
|
||||||
|
|
||||||
static int messagesize = 8*1024 + IOHDRSZ;
|
static int messagesize = 8*1024 + IOHDRSZ;
|
||||||
static int mfd[2];
|
static int mfd[2];
|
||||||
|
@ -133,6 +131,7 @@ static Hash *htab[Hsize];
|
||||||
static Fcall rhdr;
|
static Fcall rhdr;
|
||||||
static Fcall thdr;
|
static Fcall thdr;
|
||||||
static Fid *fids;
|
static Fid *fids;
|
||||||
|
static QLock synclock;
|
||||||
|
|
||||||
void
|
void
|
||||||
sanemsg(Message *m)
|
sanemsg(Message *m)
|
||||||
|
@ -778,17 +777,13 @@ doclone(Fid *f, int nfid)
|
||||||
nf->busy = 1;
|
nf->busy = 1;
|
||||||
nf->open = 0;
|
nf->open = 0;
|
||||||
nf->mb = f->mb;
|
nf->mb = f->mb;
|
||||||
if(nf->mb){
|
if(nf->mb)
|
||||||
qlock(nf->mb);
|
|
||||||
mboxincref(nf->mb);
|
mboxincref(nf->mb);
|
||||||
}
|
|
||||||
if(nf->m = f->m)
|
if(nf->m = f->m)
|
||||||
msgincref(gettopmsg(nf->mb, nf->m));
|
msgincref(gettopmsg(nf->mb, nf->m));
|
||||||
if(nf->mtop = f->mtop)
|
if(nf->mtop = f->mtop)
|
||||||
msgincref(nf->mtop);
|
msgincref(nf->mtop);
|
||||||
nf->qid = f->qid;
|
nf->qid = f->qid;
|
||||||
if(nf->mb)
|
|
||||||
qunlock(nf->mb);
|
|
||||||
return nf;
|
return nf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -816,10 +811,6 @@ dowalk(Fid *f, char *name)
|
||||||
t = FILE(f->qid.path);
|
t = FILE(f->qid.path);
|
||||||
rv = Enotexist;
|
rv = Enotexist;
|
||||||
|
|
||||||
qlock(&mbllock);
|
|
||||||
if(f->mb)
|
|
||||||
qlock(f->mb);
|
|
||||||
|
|
||||||
/* this must catch everything except . and .. */
|
/* this must catch everything except . and .. */
|
||||||
retry:
|
retry:
|
||||||
t1 = FILE(f->qid.path);
|
t1 = FILE(f->qid.path);
|
||||||
|
@ -833,12 +824,8 @@ retry:
|
||||||
if(h != nil){
|
if(h != nil){
|
||||||
if(f->m)
|
if(f->m)
|
||||||
msgdecref(f->mb, gettopmsg(f->mb, f->m));
|
msgdecref(f->mb, gettopmsg(f->mb, f->m));
|
||||||
if(f->mb && f->mb != h->mb){
|
if(f->mb && f->mb != h->mb)
|
||||||
qunlock(f->mb);
|
|
||||||
mboxdecref(f->mb);
|
mboxdecref(f->mb);
|
||||||
}
|
|
||||||
if(h->mb && h->mb != f->mb)
|
|
||||||
qlock(h->mb);
|
|
||||||
f->mb = h->mb;
|
f->mb = h->mb;
|
||||||
f->m = h->m;
|
f->m = h->m;
|
||||||
if(f->m)
|
if(f->m)
|
||||||
|
@ -864,10 +851,6 @@ retry:
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(f->mb)
|
|
||||||
qunlock(f->mb);
|
|
||||||
qunlock(&mbllock);
|
|
||||||
|
|
||||||
if(rv == nil)
|
if(rv == nil)
|
||||||
return rv;
|
return rv;
|
||||||
|
|
||||||
|
@ -890,12 +873,9 @@ retry:
|
||||||
f->qid.vers = 0;
|
f->qid.vers = 0;
|
||||||
mb = f->mb;
|
mb = f->mb;
|
||||||
f->mb = nil;
|
f->mb = nil;
|
||||||
qlock(&mbllock);
|
|
||||||
mboxdecref(mb);
|
mboxdecref(mb);
|
||||||
qunlock(&mbllock);
|
|
||||||
break;
|
break;
|
||||||
case Qdir:
|
case Qdir:
|
||||||
qlock(f->mb);
|
|
||||||
if(Topmsg(f->mb, f->m)){
|
if(Topmsg(f->mb, f->m)){
|
||||||
f->qid.path = PATH(f->mb->id, Qmbox);
|
f->qid.path = PATH(f->mb->id, Qmbox);
|
||||||
f->qid.type = QTDIR;
|
f->qid.type = QTDIR;
|
||||||
|
@ -909,7 +889,6 @@ retry:
|
||||||
f->qid.path = PATH(f->m->id, Qdir);
|
f->qid.path = PATH(f->m->id, Qdir);
|
||||||
f->qid.type = QTDIR;
|
f->qid.type = QTDIR;
|
||||||
}
|
}
|
||||||
qunlock(f->mb);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
rv = nil;
|
rv = nil;
|
||||||
|
@ -975,12 +954,10 @@ ropen(Fid *f)
|
||||||
|
|
||||||
/* make sure we've decoded */
|
/* make sure we've decoded */
|
||||||
if(file == Qbody){
|
if(file == Qbody){
|
||||||
qlock(f->mb);
|
|
||||||
cachebody(f->mb, f->m);
|
cachebody(f->mb, f->m);
|
||||||
decode(f->m);
|
decode(f->m);
|
||||||
convert(f->m);
|
convert(f->m);
|
||||||
putcache(f->mb, f->m);
|
putcache(f->mb, f->m);
|
||||||
qunlock(f->mb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rhdr.iounit = 0;
|
rhdr.iounit = 0;
|
||||||
|
@ -1003,24 +980,20 @@ readtopdir(Fid*, uchar *buf, long off, int cnt, int blen)
|
||||||
long pos;
|
long pos;
|
||||||
Mailbox *mb;
|
Mailbox *mb;
|
||||||
|
|
||||||
qlock(&mbllock);
|
|
||||||
|
|
||||||
n = 0;
|
n = 0;
|
||||||
pos = 0;
|
pos = 0;
|
||||||
mkstat(&d, nil, nil, Qctl);
|
mkstat(&d, nil, nil, Qctl);
|
||||||
m = convD2M(&d, &buf[n], blen);
|
m = convD2M(&d, &buf[n], blen);
|
||||||
if(off <= pos){
|
if(off <= pos){
|
||||||
if(m <= BIT16SZ || m > cnt)
|
if(m <= BIT16SZ || m > cnt)
|
||||||
goto out;
|
return n;
|
||||||
n += m;
|
n += m;
|
||||||
cnt -= m;
|
cnt -= m;
|
||||||
}
|
}
|
||||||
pos += m;
|
pos += m;
|
||||||
|
|
||||||
for(mb = mbl; mb != nil; mb = mb->next){
|
for(mb = mbl; mb != nil; mb = mb->next){
|
||||||
qlock(mb);
|
|
||||||
mkstat(&d, mb, nil, Qmbox);
|
mkstat(&d, mb, nil, Qmbox);
|
||||||
qunlock(mb);
|
|
||||||
m = convD2M(&d, &buf[n], blen - n);
|
m = convD2M(&d, &buf[n], blen - n);
|
||||||
if(off <= pos){
|
if(off <= pos){
|
||||||
if(m <= BIT16SZ || m > cnt)
|
if(m <= BIT16SZ || m > cnt)
|
||||||
|
@ -1030,8 +1003,6 @@ readtopdir(Fid*, uchar *buf, long off, int cnt, int blen)
|
||||||
}
|
}
|
||||||
pos += m;
|
pos += m;
|
||||||
}
|
}
|
||||||
out:
|
|
||||||
qlock(&mbllock);
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1043,7 +1014,6 @@ readmboxdir(Fid *f, uchar *buf, long off, int cnt, int blen)
|
||||||
long pos;
|
long pos;
|
||||||
Message *msg;
|
Message *msg;
|
||||||
|
|
||||||
qlock(f->mb);
|
|
||||||
if(off == 0)
|
if(off == 0)
|
||||||
syncmbox(f->mb, 1);
|
syncmbox(f->mb, 1);
|
||||||
|
|
||||||
|
@ -1054,7 +1024,7 @@ readmboxdir(Fid *f, uchar *buf, long off, int cnt, int blen)
|
||||||
if(off == 0){
|
if(off == 0){
|
||||||
if(m <= BIT16SZ || m > cnt){
|
if(m <= BIT16SZ || m > cnt){
|
||||||
f->fptr = nil;
|
f->fptr = nil;
|
||||||
goto out;
|
return n;
|
||||||
}
|
}
|
||||||
n += m;
|
n += m;
|
||||||
cnt -= m;
|
cnt -= m;
|
||||||
|
@ -1091,8 +1061,6 @@ readmboxdir(Fid *f, uchar *buf, long off, int cnt, int blen)
|
||||||
f->foff = pos;
|
f->foff = pos;
|
||||||
f->fptr = msg;
|
f->fptr = msg;
|
||||||
f->fvers = f->mb->vers;
|
f->fvers = f->mb->vers;
|
||||||
out:
|
|
||||||
qunlock(f->mb);
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1104,7 +1072,6 @@ readmsgdir(Fid *f, uchar *buf, long off, int cnt, int blen)
|
||||||
long pos;
|
long pos;
|
||||||
Message *msg;
|
Message *msg;
|
||||||
|
|
||||||
qlock(f->mb);
|
|
||||||
n = 0;
|
n = 0;
|
||||||
pos = 0;
|
pos = 0;
|
||||||
for(i = 0; i < Qmax; i++){
|
for(i = 0; i < Qmax; i++){
|
||||||
|
@ -1112,7 +1079,7 @@ readmsgdir(Fid *f, uchar *buf, long off, int cnt, int blen)
|
||||||
m = convD2M(&d, &buf[n], blen - n);
|
m = convD2M(&d, &buf[n], blen - n);
|
||||||
if(off <= pos){
|
if(off <= pos){
|
||||||
if(m <= BIT16SZ || m > cnt)
|
if(m <= BIT16SZ || m > cnt)
|
||||||
goto out;
|
return n;
|
||||||
n += m;
|
n += m;
|
||||||
cnt -= m;
|
cnt -= m;
|
||||||
}
|
}
|
||||||
|
@ -1129,8 +1096,6 @@ readmsgdir(Fid *f, uchar *buf, long off, int cnt, int blen)
|
||||||
}
|
}
|
||||||
pos += m;
|
pos += m;
|
||||||
}
|
}
|
||||||
out:
|
|
||||||
qunlock(f->mb);
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1171,7 +1136,6 @@ rread(Fid *f)
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
qlock(f->mb);
|
|
||||||
switch(t){
|
switch(t){
|
||||||
case Qctl:
|
case Qctl:
|
||||||
rhdr.count = 0;
|
rhdr.count = 0;
|
||||||
|
@ -1214,7 +1178,6 @@ rread(Fid *f)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
qunlock(f->mb);
|
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1335,10 +1298,7 @@ rwrite(Fid *f)
|
||||||
argc = tokenize(thdr.data, argv, nelem(argvbuf));
|
argc = tokenize(thdr.data, argv, nelem(argvbuf));
|
||||||
if(argc == 0)
|
if(argc == 0)
|
||||||
return Ebadctl;
|
return Ebadctl;
|
||||||
qlock(f->mb);
|
return f->mb->ctl(f->mb, argc, argv);
|
||||||
err = f->mb->ctl(f->mb, argc, argv);
|
|
||||||
qunlock(f->mb);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Qflags:
|
case Qflags:
|
||||||
|
@ -1347,11 +1307,8 @@ rwrite(Fid *f)
|
||||||
*/
|
*/
|
||||||
if(!f->mb || !f->m)
|
if(!f->mb || !f->m)
|
||||||
break;
|
break;
|
||||||
qlock(f->mb);
|
|
||||||
m = gettopmsg(f->mb, f->m);
|
m = gettopmsg(f->mb, f->m);
|
||||||
err = modflags(f->mb, m, thdr.data);
|
return modflags(f->mb, m, thdr.data);
|
||||||
qunlock(f->mb);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
return Eperm;
|
return Eperm;
|
||||||
}
|
}
|
||||||
|
@ -1366,8 +1323,6 @@ rclunk(Fid *f)
|
||||||
f->fid = -1;
|
f->fid = -1;
|
||||||
f->open = 0;
|
f->open = 0;
|
||||||
mb = f->mb;
|
mb = f->mb;
|
||||||
if(mb)
|
|
||||||
qlock(mb);
|
|
||||||
if(f->mtop)
|
if(f->mtop)
|
||||||
msgdecref(mb, f->mtop);
|
msgdecref(mb, f->mtop);
|
||||||
if(f->m)
|
if(f->m)
|
||||||
|
@ -1375,10 +1330,7 @@ rclunk(Fid *f)
|
||||||
f->m = f->mtop = nil;
|
f->m = f->mtop = nil;
|
||||||
if(mb){
|
if(mb){
|
||||||
f->mb = nil;
|
f->mb = nil;
|
||||||
qunlock(mb);
|
|
||||||
qlock(&mbllock);
|
|
||||||
mboxdecref(mb);
|
mboxdecref(mb);
|
||||||
qunlock(&mbllock);
|
|
||||||
}
|
}
|
||||||
f->busy = 0;
|
f->busy = 0;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1388,11 +1340,9 @@ char *
|
||||||
rremove(Fid *f)
|
rremove(Fid *f)
|
||||||
{
|
{
|
||||||
if(f->m != nil){
|
if(f->m != nil){
|
||||||
qlock(f->mb);
|
|
||||||
if(!f->m->deleted)
|
if(!f->m->deleted)
|
||||||
mailplumb(f->mb, f->m, 1);
|
mailplumb(f->mb, f->m, 1);
|
||||||
f->m->deleted = Deleted;
|
f->m->deleted = Deleted;
|
||||||
qunlock(f->mb);
|
|
||||||
}
|
}
|
||||||
return rclunk(f);
|
return rclunk(f);
|
||||||
}
|
}
|
||||||
|
@ -1402,15 +1352,11 @@ rstat(Fid *f)
|
||||||
{
|
{
|
||||||
Dir d;
|
Dir d;
|
||||||
|
|
||||||
if(f->mb)
|
|
||||||
qlock(f->mb);
|
|
||||||
if(FILE(f->qid.path) == Qmbox)
|
if(FILE(f->qid.path) == Qmbox)
|
||||||
syncmbox(f->mb, 1);
|
syncmbox(f->mb, 1);
|
||||||
mkstat(&d, f->mb, f->m, FILE(f->qid.path));
|
mkstat(&d, f->mb, f->m, FILE(f->qid.path));
|
||||||
rhdr.nstat = convD2M(&d, mbuf, messagesize - IOHDRSZ);
|
rhdr.nstat = convD2M(&d, mbuf, messagesize - IOHDRSZ);
|
||||||
rhdr.stat = mbuf;
|
rhdr.stat = mbuf;
|
||||||
if(f->mb)
|
|
||||||
qunlock(f->mb);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1473,6 +1419,7 @@ io(void)
|
||||||
if(Dflag)
|
if(Dflag)
|
||||||
fprint(2, "%s:<-%F\n", argv0, &thdr);
|
fprint(2, "%s:<-%F\n", argv0, &thdr);
|
||||||
|
|
||||||
|
qlock(&synclock);
|
||||||
rhdr.data = (char*)mdata + messagesize;
|
rhdr.data = (char*)mdata + messagesize;
|
||||||
if(!fcalls[thdr.type])
|
if(!fcalls[thdr.type])
|
||||||
err = "bad fcall type";
|
err = "bad fcall type";
|
||||||
|
@ -1486,6 +1433,8 @@ io(void)
|
||||||
rhdr.fid = thdr.fid;
|
rhdr.fid = thdr.fid;
|
||||||
}
|
}
|
||||||
rhdr.tag = thdr.tag;
|
rhdr.tag = thdr.tag;
|
||||||
|
qunlock(&synclock);
|
||||||
|
|
||||||
if(Dflag)
|
if(Dflag)
|
||||||
fprint(2, "%s:->%F\n", argv0, &rhdr);
|
fprint(2, "%s:->%F\n", argv0, &rhdr);
|
||||||
n = convS2M(&rhdr, mdata, messagesize);
|
n = convS2M(&rhdr, mdata, messagesize);
|
||||||
|
@ -1506,11 +1455,9 @@ reader(void)
|
||||||
setname(readerargv);
|
setname(readerargv);
|
||||||
sleep(15*1000);
|
sleep(15*1000);
|
||||||
for(;;){
|
for(;;){
|
||||||
|
qlock(&synclock);
|
||||||
t = time(0);
|
t = time(0);
|
||||||
qlock(&mbllock);
|
|
||||||
for(mb = mbl; mb != nil; mb = mb->next){
|
for(mb = mbl; mb != nil; mb = mb->next){
|
||||||
if(!canqlock(mb))
|
|
||||||
continue;
|
|
||||||
if(mb->waketime != 0 && t >= mb->waketime){
|
if(mb->waketime != 0 && t >= mb->waketime){
|
||||||
mb->waketime = 0;
|
mb->waketime = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -1526,16 +1473,16 @@ reader(void)
|
||||||
free(d);
|
free(d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qunlock(mb);
|
|
||||||
}
|
}
|
||||||
qunlock(&mbllock);
|
|
||||||
if(mb != nil) {
|
if(mb != nil) {
|
||||||
syncmbox(mb, 1);
|
syncmbox(mb, 1);
|
||||||
qunlock(mb);
|
qunlock(&synclock);
|
||||||
} else
|
} else {
|
||||||
|
qunlock(&synclock);
|
||||||
sleep(15*1000);
|
sleep(15*1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
newid(void)
|
newid(void)
|
||||||
|
@ -1662,8 +1609,6 @@ readheader(Message *m, char *buf, int off, int cnt)
|
||||||
return to - buf;
|
return to - buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
QLock hashlock;
|
|
||||||
|
|
||||||
uint
|
uint
|
||||||
hash(ulong ppath, char *name)
|
hash(ulong ppath, char *name)
|
||||||
{
|
{
|
||||||
|
@ -1684,14 +1629,10 @@ hlook(ulong ppath, char *name)
|
||||||
int h;
|
int h;
|
||||||
Hash *hp;
|
Hash *hp;
|
||||||
|
|
||||||
qlock(&hashlock);
|
|
||||||
h = hash(ppath, name);
|
h = hash(ppath, name);
|
||||||
for(hp = htab[h]; hp != nil; hp = hp->next)
|
for(hp = htab[h]; hp != nil; hp = hp->next)
|
||||||
if(ppath == hp->ppath && strcmp(name, hp->name) == 0){
|
if(ppath == hp->ppath && strcmp(name, hp->name) == 0)
|
||||||
qunlock(&hashlock);
|
|
||||||
return hp;
|
return hp;
|
||||||
}
|
|
||||||
qunlock(&hashlock);
|
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1701,7 +1642,6 @@ henter(ulong ppath, char *name, Qid qid, Message *m, Mailbox *mb)
|
||||||
int h;
|
int h;
|
||||||
Hash *hp, **l;
|
Hash *hp, **l;
|
||||||
|
|
||||||
qlock(&hashlock);
|
|
||||||
h = hash(ppath, name);
|
h = hash(ppath, name);
|
||||||
for(l = &htab[h]; *l != nil; l = &(*l)->next){
|
for(l = &htab[h]; *l != nil; l = &(*l)->next){
|
||||||
hp = *l;
|
hp = *l;
|
||||||
|
@ -1709,18 +1649,15 @@ henter(ulong ppath, char *name, Qid qid, Message *m, Mailbox *mb)
|
||||||
hp->m = m;
|
hp->m = m;
|
||||||
hp->mb = mb;
|
hp->mb = mb;
|
||||||
hp->qid = qid;
|
hp->qid = qid;
|
||||||
qunlock(&hashlock);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*l = hp = emalloc(sizeof(*hp));
|
*l = hp = emalloc(sizeof(*hp));
|
||||||
hp->m = m;
|
hp->m = m;
|
||||||
hp->mb = mb;
|
hp->mb = mb;
|
||||||
hp->qid = qid;
|
hp->qid = qid;
|
||||||
hp->name = name;
|
hp->name = name;
|
||||||
hp->ppath = ppath;
|
hp->ppath = ppath;
|
||||||
qunlock(&hashlock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1729,7 +1666,6 @@ hfree(ulong ppath, char *name)
|
||||||
int h;
|
int h;
|
||||||
Hash *hp, **l;
|
Hash *hp, **l;
|
||||||
|
|
||||||
qlock(&hashlock);
|
|
||||||
h = hash(ppath, name);
|
h = hash(ppath, name);
|
||||||
for(l = &htab[h]; *l != nil; l = &(*l)->next){
|
for(l = &htab[h]; *l != nil; l = &(*l)->next){
|
||||||
hp = *l;
|
hp = *l;
|
||||||
|
@ -1740,7 +1676,6 @@ hfree(ulong ppath, char *name)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qunlock(&hashlock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -65,7 +65,6 @@ syncmbox(Mailbox *mb, int doplumb)
|
||||||
int n, d, y, a;
|
int n, d, y, a;
|
||||||
Message *m, *next;
|
Message *m, *next;
|
||||||
|
|
||||||
assert(!canqlock(mb));
|
|
||||||
a = mb->root->subname;
|
a = mb->root->subname;
|
||||||
if(rdidxfile(mb, doplumb) == -2)
|
if(rdidxfile(mb, doplumb) == -2)
|
||||||
wridxfile(mb);
|
wridxfile(mb);
|
||||||
|
@ -146,9 +145,6 @@ mboxrename(char *a, char *b, int flags)
|
||||||
henter(PATH(0, Qtop), mb->name,
|
henter(PATH(0, Qtop), mb->name,
|
||||||
(Qid){PATH(mb->id, Qmbox), mb->vers, QTDIR}, nil, mb);
|
(Qid){PATH(mb->id, Qmbox), mb->vers, QTDIR}, nil, mb);
|
||||||
done:
|
done:
|
||||||
if(mb == nil)
|
|
||||||
return err;
|
|
||||||
qunlock(mb);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,7 +202,6 @@ newmbox(char *path, char *name, int flags, Mailbox **r)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make sure name isn't taken */
|
/* make sure name isn't taken */
|
||||||
qlock(&mbllock);
|
|
||||||
for(l = &mbl; *l != nil; l = &(*l)->next)
|
for(l = &mbl; *l != nil; l = &(*l)->next)
|
||||||
if(strcmp((*l)->name, mb->name) == 0){
|
if(strcmp((*l)->name, mb->name) == 0){
|
||||||
if(strcmp(path, (*l)->path) == 0)
|
if(strcmp(path, (*l)->path) == 0)
|
||||||
|
@ -216,7 +211,6 @@ newmbox(char *path, char *name, int flags, Mailbox **r)
|
||||||
if(mb->close)
|
if(mb->close)
|
||||||
mb->close(mb);
|
mb->close(mb);
|
||||||
free(mb);
|
free(mb);
|
||||||
qunlock(&mbllock);
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,9 +223,7 @@ newmbox(char *path, char *name, int flags, Mailbox **r)
|
||||||
mb->mtree = avlcreate(mtreecmp);
|
mb->mtree = avlcreate(mtreecmp);
|
||||||
|
|
||||||
*l = mb;
|
*l = mb;
|
||||||
qunlock(&mbllock);
|
|
||||||
|
|
||||||
qlock(mb);
|
|
||||||
henter(PATH(0, Qtop), mb->name,
|
henter(PATH(0, Qtop), mb->name,
|
||||||
(Qid){PATH(mb->id, Qmbox), mb->vers, QTDIR}, nil, mb);
|
(Qid){PATH(mb->id, Qmbox), mb->vers, QTDIR}, nil, mb);
|
||||||
if(mb->ctl)
|
if(mb->ctl)
|
||||||
|
@ -240,8 +232,6 @@ newmbox(char *path, char *name, int flags, Mailbox **r)
|
||||||
rv = syncmbox(mb, 0);
|
rv = syncmbox(mb, 0);
|
||||||
if(r)
|
if(r)
|
||||||
*r = mb;
|
*r = mb;
|
||||||
else
|
|
||||||
qunlock(mb);
|
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -252,7 +242,6 @@ freembox(char *name)
|
||||||
{
|
{
|
||||||
Mailbox **l, *mb;
|
Mailbox **l, *mb;
|
||||||
|
|
||||||
qlock(&mbllock);
|
|
||||||
for(l=&mbl; *l != nil; l=&(*l)->next)
|
for(l=&mbl; *l != nil; l=&(*l)->next)
|
||||||
if(strcmp(name, (*l)->name) == 0){
|
if(strcmp(name, (*l)->name) == 0){
|
||||||
mb = *l;
|
mb = *l;
|
||||||
|
@ -261,7 +250,6 @@ freembox(char *name)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
hfree(PATH(0, Qtop), name);
|
hfree(PATH(0, Qtop), name);
|
||||||
qunlock(&mbllock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -270,14 +258,9 @@ syncallmboxes(void)
|
||||||
char *err;
|
char *err;
|
||||||
Mailbox *m;
|
Mailbox *m;
|
||||||
|
|
||||||
qlock(&mbllock);
|
for(m = mbl; m != nil; m = m->next)
|
||||||
for(m = mbl; m != nil; m = m->next){
|
|
||||||
qlock(m);
|
|
||||||
if(err = syncmbox(m, 1))
|
if(err = syncmbox(m, 1))
|
||||||
eprint("syncmbox: %s\n", err);
|
eprint("syncmbox: %s\n", err);
|
||||||
qunlock(m);
|
|
||||||
}
|
|
||||||
qunlock(&mbllock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -288,7 +271,6 @@ removembox(char *name, int flags)
|
||||||
Mailbox **l, *mb;
|
Mailbox **l, *mb;
|
||||||
|
|
||||||
found = 0;
|
found = 0;
|
||||||
qlock(&mbllock);
|
|
||||||
for(l=&mbl; *l != nil; l=&(*l)->next)
|
for(l=&mbl; *l != nil; l=&(*l)->next)
|
||||||
if(strcmp(name, (*l)->path) == 0){
|
if(strcmp(name, (*l)->path) == 0){
|
||||||
mb = *l;
|
mb = *l;
|
||||||
|
@ -300,7 +282,6 @@ removembox(char *name, int flags)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
hfree(PATH(0, Qtop), name);
|
hfree(PATH(0, Qtop), name);
|
||||||
qunlock(&mbllock);
|
|
||||||
|
|
||||||
if(found == 0)
|
if(found == 0)
|
||||||
return "maibox not found";
|
return "maibox not found";
|
||||||
|
@ -1065,13 +1046,9 @@ delmessages(int ac, char **av)
|
||||||
Mailbox *mb;
|
Mailbox *mb;
|
||||||
Message *m;
|
Message *m;
|
||||||
|
|
||||||
qlock(&mbllock);
|
|
||||||
for(mb = mbl; mb != nil; mb = mb->next)
|
for(mb = mbl; mb != nil; mb = mb->next)
|
||||||
if(strcmp(av[0], mb->name) == 0){
|
if(strcmp(av[0], mb->name) == 0)
|
||||||
qlock(mb);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
qunlock(&mbllock);
|
|
||||||
if(mb == nil)
|
if(mb == nil)
|
||||||
return "no such mailbox";
|
return "no such mailbox";
|
||||||
|
|
||||||
|
@ -1089,7 +1066,6 @@ delmessages(int ac, char **av)
|
||||||
}
|
}
|
||||||
if(needwrite)
|
if(needwrite)
|
||||||
syncmbox(mb, 1);
|
syncmbox(mb, 1);
|
||||||
qunlock(mb);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1103,13 +1079,9 @@ flagmessages(int argc, char **argv)
|
||||||
|
|
||||||
if(argc%2)
|
if(argc%2)
|
||||||
return "bad flags";
|
return "bad flags";
|
||||||
qlock(&mbllock);
|
|
||||||
for(mb = mbl; mb; mb = mb->next)
|
for(mb = mbl; mb; mb = mb->next)
|
||||||
if(strcmp(*argv, mb->name) == 0){
|
if(strcmp(*argv, mb->name) == 0)
|
||||||
qlock(mb);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
qunlock(&mbllock);
|
|
||||||
if(mb == nil)
|
if(mb == nil)
|
||||||
return "no such mailbox";
|
return "no such mailbox";
|
||||||
needwrite = 0;
|
needwrite = 0;
|
||||||
|
@ -1124,13 +1096,9 @@ flagmessages(int argc, char **argv)
|
||||||
}
|
}
|
||||||
if(needwrite)
|
if(needwrite)
|
||||||
syncmbox(mb, 1);
|
syncmbox(mb, 1);
|
||||||
qunlock(mb);
|
|
||||||
return rerr;
|
return rerr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* the following are called with the mailbox qlocked
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
msgincref(Message *m)
|
msgincref(Message *m)
|
||||||
{
|
{
|
||||||
|
@ -1140,7 +1108,6 @@ msgincref(Message *m)
|
||||||
void
|
void
|
||||||
msgdecref(Mailbox *mb, Message *m)
|
msgdecref(Mailbox *mb, Message *m)
|
||||||
{
|
{
|
||||||
assert(!canqlock(mb));
|
|
||||||
assert(m->refs > 0);
|
assert(m->refs > 0);
|
||||||
m->refs--;
|
m->refs--;
|
||||||
if(m->refs == 0){
|
if(m->refs == 0){
|
||||||
|
@ -1151,9 +1118,6 @@ msgdecref(Mailbox *mb, Message *m)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* the following are called with mbllock'd
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
mboxincref(Mailbox *mb)
|
mboxincref(Mailbox *mb)
|
||||||
{
|
{
|
||||||
|
@ -1177,7 +1141,6 @@ mbrmidx(char *path, int flags)
|
||||||
void
|
void
|
||||||
mboxdecref(Mailbox *mb)
|
mboxdecref(Mailbox *mb)
|
||||||
{
|
{
|
||||||
qlock(mb);
|
|
||||||
assert(mb->refs > 0);
|
assert(mb->refs > 0);
|
||||||
mb->refs--;
|
mb->refs--;
|
||||||
if(mb->refs == 0){
|
if(mb->refs == 0){
|
||||||
|
@ -1193,8 +1156,7 @@ mboxdecref(Mailbox *mb)
|
||||||
free(mb->mtree);
|
free(mb->mtree);
|
||||||
free(mb->d);
|
free(mb->d);
|
||||||
free(mb);
|
free(mb);
|
||||||
} else
|
}
|
||||||
qunlock(mb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue