summaryrefslogtreecommitdiffstats
path: root/src/cmd/fossil/9proc.c
diff options
context:
space:
mode:
authorDavid du Colombier <0intro@gmail.com>2013-09-23 23:16:25 +0200
committerDavid du Colombier <0intro@gmail.com>2013-09-23 23:16:25 +0200
commit4b5766580559d101dd1c29cc575b3ffa9f51c2d7 (patch)
treef35364a39e255b1336482ee30217d68279ba8699 /src/cmd/fossil/9proc.c
parent6f4d00ee45693290fae042b27536b54f77b96acd (diff)
downloadplan9port-4b5766580559d101dd1c29cc575b3ffa9f51c2d7.tar.gz
plan9port-4b5766580559d101dd1c29cc575b3ffa9f51c2d7.zip
fossil: move from liboventi to libthread and libventi
R=rsc https://codereview.appspot.com/13504049
Diffstat (limited to 'src/cmd/fossil/9proc.c')
-rw-r--r--src/cmd/fossil/9proc.c215
1 files changed, 99 insertions, 116 deletions
diff --git a/src/cmd/fossil/9proc.c b/src/cmd/fossil/9proc.c
index bddd3baa..f87cdc4d 100644
--- a/src/cmd/fossil/9proc.c
+++ b/src/cmd/fossil/9proc.c
@@ -12,18 +12,18 @@ enum {
};
static struct {
- VtLock* alock; /* alloc */
+ QLock alock; /* alloc */
Msg* ahead;
- VtRendez* arendez;
+ Rendez arendez;
int maxmsg;
int nmsg;
int nmsgstarve;
- VtLock* rlock; /* read */
+ QLock rlock; /* read */
Msg* rhead;
Msg* rtail;
- VtRendez* rrendez;
+ Rendez rrendez;
int maxproc;
int nproc;
@@ -33,11 +33,11 @@ static struct {
} mbox;
static struct {
- VtLock* alock; /* alloc */
+ QLock alock; /* alloc */
Con* ahead;
- VtRendez* arendez;
+ Rendez arendez;
- VtLock* clock;
+ RWLock clock;
Con* chead;
Con* ctail;
@@ -66,7 +66,7 @@ conFree(Con* con)
con->flags = 0;
con->isconsole = 0;
- vtLock(cbox.alock);
+ qlock(&cbox.alock);
if(con->cprev != nil)
con->cprev->cnext = con->cnext;
else
@@ -79,25 +79,18 @@ conFree(Con* con)
if(cbox.ncon > cbox.maxcon){
if(con->name != nil)
- vtMemFree(con->name);
- vtLockFree(con->fidlock);
- vtMemFree(con->data);
- vtRendezFree(con->wrendez);
- vtLockFree(con->wlock);
- vtRendezFree(con->mrendez);
- vtLockFree(con->mlock);
- vtRendezFree(con->rendez);
- vtLockFree(con->lock);
- vtMemFree(con);
+ vtfree(con->name);
+ vtfree(con->data);
+ vtfree(con);
cbox.ncon--;
- vtUnlock(cbox.alock);
+ qunlock(&cbox.alock);
return;
}
con->anext = cbox.ahead;
cbox.ahead = con;
if(con->anext == nil)
- vtWakeup(cbox.arendez);
- vtUnlock(cbox.alock);
+ rwakeup(&cbox.arendez);
+ qunlock(&cbox.alock);
}
static void
@@ -106,19 +99,19 @@ msgFree(Msg* m)
assert(m->rwnext == nil);
assert(m->flush == nil);
- vtLock(mbox.alock);
+ qlock(&mbox.alock);
if(mbox.nmsg > mbox.maxmsg){
- vtMemFree(m->data);
- vtMemFree(m);
+ vtfree(m->data);
+ vtfree(m);
mbox.nmsg--;
- vtUnlock(mbox.alock);
+ qunlock(&mbox.alock);
return;
}
m->anext = mbox.ahead;
mbox.ahead = m;
if(m->anext == nil)
- vtWakeup(mbox.arendez);
- vtUnlock(mbox.alock);
+ rwakeup(&mbox.arendez);
+ qunlock(&mbox.alock);
}
static Msg*
@@ -126,15 +119,15 @@ msgAlloc(Con* con)
{
Msg *m;
- vtLock(mbox.alock);
+ qlock(&mbox.alock);
while(mbox.ahead == nil){
if(mbox.nmsg >= mbox.maxmsg){
mbox.nmsgstarve++;
- vtSleep(mbox.arendez);
+ rsleep(&mbox.arendez);
continue;
}
- m = vtMemAllocZ(sizeof(Msg));
- m->data = vtMemAlloc(mbox.msize);
+ m = vtmallocz(sizeof(Msg));
+ m->data = vtmalloc(mbox.msize);
m->msize = mbox.msize;
mbox.nmsg++;
mbox.ahead = m;
@@ -143,7 +136,7 @@ msgAlloc(Con* con)
m = mbox.ahead;
mbox.ahead = m->anext;
m->anext = nil;
- vtUnlock(mbox.alock);
+ qunlock(&mbox.alock);
m->con = con;
m->state = MsgR;
@@ -188,9 +181,9 @@ msgFlush(Msg* m)
* If it's not found must assume Elvis has already
* left the building and reply normally.
*/
- vtLock(con->mlock);
+ qlock(&con->mlock);
if(m->state == MsgF){
- vtUnlock(con->mlock);
+ qunlock(&con->mlock);
return;
}
for(old = con->mhead; old != nil; old = old->mnext)
@@ -199,7 +192,7 @@ msgFlush(Msg* m)
if(old == nil){
if(Dflag)
fprint(2, "msgFlush: cannot find %d\n", m->t.oldtag);
- vtUnlock(con->mlock);
+ qunlock(&con->mlock);
return;
}
@@ -253,17 +246,17 @@ msgFlush(Msg* m)
if(Dflag)
fprint(2, "msgFlush: add %d to %d queue\n",
m->t.tag, old->t.tag);
- vtUnlock(con->mlock);
+ qunlock(&con->mlock);
}
static void
msgProc(void*)
{
Msg *m;
- char *e;
+ char e[ERRMAX];
Con *con;
- vtThreadSetName("msgProc");
+ threadsetname("msgProc");
for(;;){
/*
@@ -271,64 +264,64 @@ msgProc(void*)
* If not, wait for and pull a message off
* the read queue.
*/
- vtLock(mbox.rlock);
+ qlock(&mbox.rlock);
if(mbox.nproc > mbox.maxproc){
mbox.nproc--;
- vtUnlock(mbox.rlock);
+ qunlock(&mbox.rlock);
break;
}
while(mbox.rhead == nil)
- vtSleep(mbox.rrendez);
+ rsleep(&mbox.rrendez);
m = mbox.rhead;
mbox.rhead = m->rwnext;
m->rwnext = nil;
- vtUnlock(mbox.rlock);
+ qunlock(&mbox.rlock);
con = m->con;
- e = nil;
+ *e = 0;
/*
* If the message has been flushed before
* any 9P processing has started, mark it so
* none will be attempted.
*/
- vtLock(con->mlock);
+ qlock(&con->mlock);
if(m->state == MsgF)
- e = "flushed";
+ strcpy(e, "flushed");
else
m->state = Msg9;
- vtUnlock(con->mlock);
+ qunlock(&con->mlock);
- if(e == nil){
+ if(*e == 0){
/*
* explain this
*/
- vtLock(con->lock);
+ qlock(&con->lock);
if(m->t.type == Tversion){
con->version = m;
con->state = ConDown;
while(con->mhead != m)
- vtSleep(con->rendez);
+ rsleep(&con->rendez);
assert(con->state == ConDown);
if(con->version == m){
con->version = nil;
con->state = ConInit;
}
else
- e = "Tversion aborted";
+ strcpy(e, "Tversion aborted");
}
else if(con->state != ConUp)
- e = "connection not ready";
- vtUnlock(con->lock);
+ strcpy(e, "connection not ready");
+ qunlock(&con->lock);
}
/*
* Dispatch if not error already.
*/
m->r.tag = m->t.tag;
- if(e == nil && !(*rFcall[m->t.type])(m))
- e = vtGetError();
- if(e != nil){
+ if(*e == 0 && !(*rFcall[m->t.type])(m))
+ rerrstr(e, sizeof e);
+ if(*e != 0){
m->r.type = Rerror;
m->r.ename = e;
}
@@ -340,14 +333,14 @@ msgProc(void*)
* write queue and wakeup the write process.
*/
if(!m->nowq){
- vtLock(con->wlock);
+ qlock(&con->wlock);
if(con->whead == nil)
con->whead = m;
else
con->wtail->rwnext = m;
con->wtail = m;
- vtWakeup(con->wrendez);
- vtUnlock(con->wlock);
+ rwakeup(&con->wrendez);
+ qunlock(&con->wlock);
}
}
}
@@ -359,7 +352,7 @@ msgRead(void* v)
Con *con;
int eof, fd, n;
- vtThreadSetName("msgRead");
+ threadsetname("msgRead");
con = v;
fd = con->fd;
@@ -388,7 +381,7 @@ msgRead(void* v)
if(Dflag)
fprint(2, "msgRead %p: t %F\n", con, &m->t);
- vtLock(con->mlock);
+ qlock(&con->mlock);
if(con->mtail != nil){
m->mprev = con->mtail;
con->mtail->mnext = m;
@@ -398,14 +391,14 @@ msgRead(void* v)
m->mprev = nil;
}
con->mtail = m;
- vtUnlock(con->mlock);
+ qunlock(&con->mlock);
- vtLock(mbox.rlock);
+ qlock(&mbox.rlock);
if(mbox.rhead == nil){
mbox.rhead = m;
- if(!vtWakeup(mbox.rrendez)){
+ if(!rwakeup(&mbox.rrendez)){
if(mbox.nproc < mbox.maxproc){
- if(vtThread(msgProc, nil) > 0)
+ if(proccreate(msgProc, nil, STACK) > 0)
mbox.nproc++;
}
else
@@ -413,13 +406,13 @@ msgRead(void* v)
}
/*
* don't need this surely?
- vtWakeup(mbox.rrendez);
+ rwakeup(&mbox.rrendez);
*/
}
else
mbox.rtail->rwnext = m;
mbox.rtail = m;
- vtUnlock(mbox.rlock);
+ qunlock(&mbox.rlock);
}
}
@@ -430,10 +423,10 @@ msgWrite(void* v)
int eof, n;
Msg *flush, *m;
- vtThreadSetName("msgWrite");
+ threadsetname("msgWrite");
con = v;
- if(vtThread(msgRead, con) < 0){
+ if(proccreate(msgRead, con, STACK) < 0){
conFree(con);
return;
}
@@ -442,14 +435,14 @@ msgWrite(void* v)
/*
* Wait for and pull a message off the write queue.
*/
- vtLock(con->wlock);
+ qlock(&con->wlock);
while(con->whead == nil)
- vtSleep(con->wrendez);
+ rsleep(&con->wrendez);
m = con->whead;
con->whead = m->rwnext;
m->rwnext = nil;
assert(!m->nowq);
- vtUnlock(con->wlock);
+ qunlock(&con->wlock);
eof = 0;
@@ -457,7 +450,7 @@ msgWrite(void* v)
* Write each message (if it hasn't been flushed)
* followed by any messages waiting for it to complete.
*/
- vtLock(con->mlock);
+ qlock(&con->mlock);
while(m != nil){
msgMunlink(m);
@@ -467,13 +460,13 @@ msgWrite(void* v)
if(m->state != MsgF){
m->state = MsgW;
- vtUnlock(con->mlock);
+ qunlock(&con->mlock);
n = convS2M(&m->r, con->data, con->msize);
if(write(con->fd, con->data, n) != n)
eof = 1;
- vtLock(con->mlock);
+ qlock(&con->mlock);
}
if((flush = m->flush) != nil){
@@ -483,21 +476,21 @@ msgWrite(void* v)
msgFree(m);
m = flush;
}
- vtUnlock(con->mlock);
+ qunlock(&con->mlock);
- vtLock(con->lock);
+ qlock(&con->lock);
if(eof && con->fd >= 0){
close(con->fd);
con->fd = -1;
}
if(con->state == ConDown)
- vtWakeup(con->rendez);
+ rwakeup(&con->rendez);
if(con->state == ConMoribund && con->mhead == nil){
- vtUnlock(con->lock);
+ qunlock(&con->lock);
conFree(con);
break;
}
- vtUnlock(con->lock);
+ qunlock(&con->lock);
}
}
@@ -508,24 +501,19 @@ conAlloc(int fd, char* name, int flags)
char buf[128], *p;
int rfd, n;
- vtLock(cbox.alock);
+ qlock(&cbox.alock);
while(cbox.ahead == nil){
if(cbox.ncon >= cbox.maxcon){
cbox.nconstarve++;
- vtSleep(cbox.arendez);
+ rsleep(&cbox.arendez);
continue;
}
- con = vtMemAllocZ(sizeof(Con));
- con->lock = vtLockAlloc();
- con->rendez = vtRendezAlloc(con->lock);
- con->data = vtMemAlloc(cbox.msize);
+ con = vtmallocz(sizeof(Con));
+ con->rendez.l = &con->lock;
+ con->data = vtmalloc(cbox.msize);
con->msize = cbox.msize;
- con->alock = vtLockAlloc();
- con->mlock = vtLockAlloc();
- con->mrendez = vtRendezAlloc(con->mlock);
- con->wlock = vtLockAlloc();
- con->wrendez = vtRendezAlloc(con->wlock);
- con->fidlock = vtLockAlloc();
+ con->mrendez.l = &con->mlock;
+ con->wrendez.l = &con->wlock;
cbox.ncon++;
cbox.ahead = con;
@@ -553,13 +541,13 @@ conAlloc(int fd, char* name, int flags)
con->state = ConNew;
con->fd = fd;
if(con->name != nil){
- vtMemFree(con->name);
+ vtfree(con->name);
con->name = nil;
}
if(name != nil)
- con->name = vtStrDup(name);
+ con->name = vtstrdup(name);
else
- con->name = vtStrDup("unknown");
+ con->name = vtstrdup("unknown");
con->remote[0] = 0;
snprint(buf, sizeof buf, "%s/remote", con->name);
if((rfd = open(buf, OREAD)) >= 0){
@@ -574,9 +562,9 @@ conAlloc(int fd, char* name, int flags)
}
con->flags = flags;
con->isconsole = 0;
- vtUnlock(cbox.alock);
+ qunlock(&cbox.alock);
- if(vtThread(msgWrite, con) < 0){
+ if(proccreate(msgWrite, con, STACK) < 0){
conFree(con);
return nil;
}
@@ -616,21 +604,21 @@ cmdMsg(int argc, char* argv[])
if(argc)
return cliError(usage);
- vtLock(mbox.alock);
+ qlock(&mbox.alock);
if(maxmsg)
mbox.maxmsg = maxmsg;
maxmsg = mbox.maxmsg;
nmsg = mbox.nmsg;
nmsgstarve = mbox.nmsgstarve;
- vtUnlock(mbox.alock);
+ qunlock(&mbox.alock);
- vtLock(mbox.rlock);
+ qlock(&mbox.rlock);
if(maxproc)
mbox.maxproc = maxproc;
maxproc = mbox.maxproc;
nproc = mbox.nproc;
nprocstarve = mbox.nprocstarve;
- vtUnlock(mbox.rlock);
+ qunlock(&mbox.rlock);
consPrint("\tmsg -m %d -p %d\n", maxmsg, maxproc);
consPrint("\tnmsg %d nmsgstarve %d nproc %d nprocstarve %d\n",
@@ -717,7 +705,7 @@ cmdWho(int argc, char* argv[])
if(argc > 0)
return cliError(usage);
- vtRLock(cbox.clock);
+ rlock(&cbox.clock);
l1 = 0;
l2 = 0;
for(con=cbox.chead; con; con=con->cnext){
@@ -728,7 +716,7 @@ cmdWho(int argc, char* argv[])
}
for(con=cbox.chead; con; con=con->cnext){
consPrint("\t%-*s %-*s", l1, con->name, l2, con->remote);
- vtLock(con->fidlock);
+ qlock(&con->fidlock);
last = nil;
for(i=0; i<NFidHash; i++)
for(fid=con->fidhash[i]; fid; fid=fid->hash)
@@ -741,21 +729,19 @@ cmdWho(int argc, char* argv[])
for(; fid; last=fid, fid=fid->sort)
if(last==nil || strcmp(fid->uname, last->uname) != 0)
consPrint(" %q", fid->uname);
- vtUnlock(con->fidlock);
+ qunlock(&con->fidlock);
consPrint("\n");
}
- vtRUnlock(cbox.clock);
+ runlock(&cbox.clock);
return 1;
}
void
msgInit(void)
{
- mbox.alock = vtLockAlloc();
- mbox.arendez = vtRendezAlloc(mbox.alock);
+ mbox.arendez.l = &mbox.alock;
- mbox.rlock = vtLockAlloc();
- mbox.rrendez = vtRendezAlloc(mbox.rlock);
+ mbox.rrendez.l = &mbox.rlock;
mbox.maxmsg = NMsgInit;
mbox.maxproc = NMsgProcInit;
@@ -789,22 +775,22 @@ cmdCon(int argc, char* argv[])
if(argc)
return cliError(usage);
- vtLock(cbox.clock);
+ wlock(&cbox.clock);
if(maxcon)
cbox.maxcon = maxcon;
maxcon = cbox.maxcon;
ncon = cbox.ncon;
nconstarve = cbox.nconstarve;
- vtUnlock(cbox.clock);
+ wunlock(&cbox.clock);
consPrint("\tcon -m %d\n", maxcon);
consPrint("\tncon %d nconstarve %d\n", ncon, nconstarve);
- vtRLock(cbox.clock);
+ rlock(&cbox.clock);
for(con = cbox.chead; con != nil; con = con->cnext){
consPrint("\t%s\n", con->name);
}
- vtRUnlock(cbox.clock);
+ runlock(&cbox.clock);
return 1;
}
@@ -812,10 +798,7 @@ cmdCon(int argc, char* argv[])
void
conInit(void)
{
- cbox.alock = vtLockAlloc();
- cbox.arendez = vtRendezAlloc(cbox.alock);
-
- cbox.clock = vtLockAlloc();
+ cbox.arendez.l = &cbox.alock;
cbox.maxcon = NConInit;
cbox.msize = NMsizeInit;