fossil: move from liboventi to libthread and libventi

R=rsc
https://codereview.appspot.com/13504049
This commit is contained in:
David du Colombier 2013-09-23 23:16:25 +02:00
parent 6f4d00ee45
commit 4b57665805
38 changed files with 1360 additions and 1424 deletions

View file

@ -3,7 +3,7 @@
#include "9.h"
static struct {
VtLock* lock;
QLock lock;
Fid* free;
int nfree;
@ -14,11 +14,11 @@ static void
fidLock(Fid* fid, int flags)
{
if(flags & FidFWlock){
vtLock(fid->lock);
wlock(&fid->lock);
fid->flags = flags;
}
else
vtRLock(fid->lock);
rlock(&fid->lock);
/*
* Callers of file* routines are expected to lock fsys->fs->elk
@ -47,10 +47,10 @@ fidUnlock(Fid* fid)
fsysFsRUnlock(fid->fsys);
if(fid->flags & FidFWlock){
fid->flags = 0;
vtUnlock(fid->lock);
wunlock(&fid->lock);
return;
}
vtRUnlock(fid->lock);
runlock(&fid->lock);
}
static Fid*
@ -58,19 +58,17 @@ fidAlloc(void)
{
Fid *fid;
vtLock(fbox.lock);
qlock(&fbox.lock);
if(fbox.nfree > 0){
fid = fbox.free;
fbox.free = fid->hash;
fbox.nfree--;
}
else{
fid = vtMemAllocZ(sizeof(Fid));
fid->lock = vtLockAlloc();
fid->alock = vtLockAlloc();
fid = vtmallocz(sizeof(Fid));
}
fbox.inuse++;
vtUnlock(fbox.lock);
qunlock(&fbox.lock);
fid->con = nil;
fid->fidno = NOFID;
@ -105,11 +103,11 @@ fidFree(Fid* fid)
fidUnlock(fid);
if(fid->uid != nil){
vtMemFree(fid->uid);
vtfree(fid->uid);
fid->uid = nil;
}
if(fid->uname != nil){
vtMemFree(fid->uname);
vtfree(fid->uname);
fid->uname = nil;
}
if(fid->excl != nil)
@ -124,11 +122,11 @@ fidFree(Fid* fid)
fid->fsys = nil;
}
if(fid->cuname != nil){
vtMemFree(fid->cuname);
vtfree(fid->cuname);
fid->cuname = nil;
}
vtLock(fbox.lock);
qlock(&fbox.lock);
fbox.inuse--;
if(fbox.nfree < 10){
fid->hash = fbox.free;
@ -136,11 +134,9 @@ fidFree(Fid* fid)
fbox.nfree++;
}
else{
vtLockFree(fid->alock);
vtLockFree(fid->lock);
vtMemFree(fid);
vtfree(fid);
}
vtUnlock(fbox.lock);
qunlock(&fbox.lock);
}
static void
@ -182,7 +178,7 @@ fidGet(Con* con, u32int fidno, int flags)
return nil;
hash = &con->fidhash[fidno % NFidHash];
vtLock(con->fidlock);
qlock(&con->fidlock);
for(fid = *hash; fid != nil; fid = fid->hash){
if(fid->fidno != fidno)
continue;
@ -192,17 +188,17 @@ fidGet(Con* con, u32int fidno, int flags)
* when called from attach, clone or walk.
*/
if(flags & FidFCreate){
vtUnlock(con->fidlock);
vtSetError("%s: fid 0x%ud in use", argv0, fidno);
qunlock(&con->fidlock);
werrstr("%s: fid 0x%ud in use", argv0, fidno);
return nil;
}
fid->ref++;
vtUnlock(con->fidlock);
qunlock(&con->fidlock);
fidLock(fid, flags);
if((fid->open & FidOCreate) || fid->fidno == NOFID){
fidPut(fid);
vtSetError("%s: fid invalid", argv0);
werrstr("%s: fid invalid", argv0);
return nil;
}
return fid;
@ -228,7 +224,7 @@ fidGet(Con* con, u32int fidno, int flags)
fid->next = nil;
con->nfid++;
vtUnlock(con->fidlock);
qunlock(&con->fidlock);
/*
* The FidOCreate flag is used to prevent any
@ -239,19 +235,19 @@ fidGet(Con* con, u32int fidno, int flags)
fid->open &= ~FidOCreate;
return fid;
}
vtUnlock(con->fidlock);
qunlock(&con->fidlock);
vtSetError("%s: fid not found", argv0);
werrstr("%s: fid not found", argv0);
return nil;
}
void
fidPut(Fid* fid)
{
vtLock(fid->con->fidlock);
qlock(&fid->con->fidlock);
assert(fid->ref > 0);
fid->ref--;
vtUnlock(fid->con->fidlock);
qunlock(&fid->con->fidlock);
if(fid->ref == 0 && fid->fidno == NOFID){
fidFree(fid);
@ -265,12 +261,12 @@ fidClunk(Fid* fid)
{
assert(fid->flags & FidFWlock);
vtLock(fid->con->fidlock);
qlock(&fid->con->fidlock);
assert(fid->ref > 0);
fid->ref--;
fidUnHash(fid);
fid->fidno = NOFID;
vtUnlock(fid->con->fidlock);
qunlock(&fid->con->fidlock);
if(fid->ref > 0){
/* not reached - fidUnHash requires ref == 0 */
@ -286,19 +282,18 @@ fidClunkAll(Con* con)
Fid *fid;
u32int fidno;
vtLock(con->fidlock);
qlock(&con->fidlock);
while(con->fhead != nil){
fidno = con->fhead->fidno;
vtUnlock(con->fidlock);
qunlock(&con->fidlock);
if((fid = fidGet(con, fidno, FidFWlock)) != nil)
fidClunk(fid);
vtLock(con->fidlock);
qlock(&con->fidlock);
}
vtUnlock(con->fidlock);
qunlock(&con->fidlock);
}
void
fidInit(void)
{
fbox.lock = vtLockAlloc();
}