upas/fs: remove useless syncsem, make sure mbox is locked when fetching / syncing

This commit is contained in:
cinap_lenrek 2017-03-12 21:23:21 +01:00
parent f616c63b39
commit b24ebff76a
3 changed files with 23 additions and 30 deletions

View file

@ -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;

View file

@ -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){

View file

@ -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);