diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-03-12 21:23:21 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-03-12 21:23:21 +0100 |
commit | b24ebff76a1d0ef99ecef551a78288642e6ea35b (patch) | |
tree | 05b408a1599fbce5b743e6cd48ef552e083f516b /sys/src/cmd/upas | |
parent | f616c63b399fed4f78121f387be9599e8e0c2b4c (diff) |
upas/fs: remove useless syncsem, make sure mbox is locked when fetching / syncing
Diffstat (limited to 'sys/src/cmd/upas')
-rw-r--r-- | sys/src/cmd/upas/fs/dat.h | 1 | ||||
-rw-r--r-- | sys/src/cmd/upas/fs/fs.c | 41 | ||||
-rw-r--r-- | sys/src/cmd/upas/fs/mbox.c | 11 |
3 files changed, 23 insertions, 30 deletions
diff --git a/sys/src/cmd/upas/fs/dat.h b/sys/src/cmd/upas/fs/dat.h index 585af992a..bd81ad7d3 100644 --- a/sys/src/cmd/upas/fs/dat.h +++ b/sys/src/cmd/upas/fs/dat.h @@ -149,7 +149,6 @@ typedef struct Mailbox Mailbox; struct Mailbox { QLock; long idxsem; /* abort on concurrent index access */ - long syncsem; /* abort on concurrent syncs */ int refs; Mailbox *next; int id; diff --git a/sys/src/cmd/upas/fs/fs.c b/sys/src/cmd/upas/fs/fs.c index acfca8838..2b399ac3c 100644 --- a/sys/src/cmd/upas/fs/fs.c +++ b/sys/src/cmd/upas/fs/fs.c @@ -1244,6 +1244,7 @@ sanefid(f); return nil; } + qlock(f->mb); switch(t){ case Qctl: rhdr.count = 0; @@ -1251,7 +1252,6 @@ sanefid(f); case Qmboxctl: i = mboxctlread(f->mb, &p); goto output; - break; case Qheader: cacheheaders(f->mb, f->m); rhdr.count = readheader(f->m, (char*)mbuf, off, cnt); @@ -1287,6 +1287,7 @@ sanefid(f); } break; } + qunlock(f->mb); return nil; } @@ -1410,7 +1411,10 @@ rwrite(Fid *f) argc = tokenize(thdr.data, argv, nelem(argvbuf)); if(argc == 0) return Ebadctl; - return f->mb->ctl(f->mb, argc, argv); + qlock(f->mb); + err = f->mb->ctl(f->mb, argc, argv); + qunlock(f->mb); + return err; } break; case Qflags: @@ -1419,11 +1423,10 @@ rwrite(Fid *f) */ if(!f->mb || !f->m) break; + qlock(f->mb); m = gettopmsg(f->mb, f->m); err = modflags(f->mb, m, thdr.data); -// premature optimization? flags not written immediately. -// if(err == nil && f->m->cstate&Cidxstale) -// wridxfile(f->mb); /* syncmbox(f->mb, 1); */ + qunlock(f->mb); return err; } return Eperm; @@ -1607,28 +1610,24 @@ reader(void) t = time(0); qlock(&mbllock); for(mb = mbl; mb != nil; mb = mb->next){ - assert(mb->refs > 0); + if(!canqlock(mb)) + continue; if(mb->waketime != 0 && t >= mb->waketime){ - qlock(mb); mb->waketime = 0; break; } - - if(mb->d == nil || mb->d->name == nil) - continue; - d = dirstat(mb->path); - if(d == nil) - continue; - - qlock(mb); - if(mb->d) - if(d->qid.path != mb->d->qid.path - || d->qid.vers != mb->d->qid.vers){ - free(d); - break; + if(mb->d != nil && mb->d->name != nil){ + d = dirstat(mb->path); + if(d != nil){ + if(d->qid.path != mb->d->qid.path + || d->qid.vers != mb->d->qid.vers){ + free(d); + break; + } + free(d); + } } qunlock(mb); - free(d); } qunlock(&mbllock); if(mb != nil){ diff --git a/sys/src/cmd/upas/fs/mbox.c b/sys/src/cmd/upas/fs/mbox.c index 3c2c1fb53..1858da6c4 100644 --- a/sys/src/cmd/upas/fs/mbox.c +++ b/sys/src/cmd/upas/fs/mbox.c @@ -66,15 +66,12 @@ syncmbox(Mailbox *mb, int doplumb) int n, d, y, a; Message *m, *next; - if(semacquire(&mb->syncsem, 0) <= 0) - return nil; + assert(canqlock(mb) == 0); a = mb->root->subname; if(rdidxfile(mb, doplumb) == -2) wridxfile(mb); - if(s = mb->sync(mb, doplumb, &n)){ - semrelease(&mb->syncsem, 1); + if(s = mb->sync(mb, doplumb, &n)) return s; - } d = 0; y = 0; for(m = mb->root->part; m; m = next){ @@ -102,7 +99,6 @@ syncmbox(Mailbox *mb, int doplumb) henter(PATH(0, Qtop), mb->name, (Qid){PATH(mb->id, Qmbox), mb->vers, QTDIR}, nil, mb); } - semrelease(&mb->syncsem, 1); return nil; } @@ -182,7 +178,6 @@ newmbox(char *path, char *name, int flags, Mailbox **r) initheaders(); mb = emalloc(sizeof *mb); mb->idxsem = 1; - mb->syncsem = 1; mb->flags = flags; strncpy(mb->path, path, sizeof mb->path - 1); p = name; @@ -1184,8 +1179,8 @@ mbrmidx(char *path, int flags) void mboxdecref(Mailbox *mb) { - assert(mb->refs > 0); qlock(mb); + assert(mb->refs > 0); mb->refs--; if(mb->refs == 0){ syncmbox(mb, 1); |