upas/fs: remove useless syncsem, make sure mbox is locked when fetching / syncing
This commit is contained in:
parent
f616c63b39
commit
b24ebff76a
3 changed files with 23 additions and 30 deletions
|
@ -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;
|
||||
|
|
|
@ -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,29 +1610,25 @@ 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;
|
||||
if(mb->d != nil && mb->d->name != nil){
|
||||
d = dirstat(mb->path);
|
||||
if(d == nil)
|
||||
continue;
|
||||
|
||||
qlock(mb);
|
||||
if(mb->d)
|
||||
if(d != nil){
|
||||
if(d->qid.path != mb->d->qid.path
|
||||
|| d->qid.vers != mb->d->qid.vers){
|
||||
free(d);
|
||||
break;
|
||||
}
|
||||
qunlock(mb);
|
||||
free(d);
|
||||
}
|
||||
}
|
||||
qunlock(mb);
|
||||
}
|
||||
qunlock(&mbllock);
|
||||
if(mb != nil){
|
||||
syncmbox(mb, 1);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue