do not free r until done with it!

This commit is contained in:
rsc 2005-01-04 22:20:52 +00:00
parent 7e19561a6c
commit d165fa680c

View file

@ -49,6 +49,7 @@ muxrpc(Mux *mux, void *tx)
/* actually send the packet */ /* actually send the packet */
if(tag < 0 || mux->settag(mux, tx, tag) < 0 || _muxsend(mux, tx) < 0){ if(tag < 0 || mux->settag(mux, tx, tag) < 0 || _muxsend(mux, tx) < 0){
qlock(&mux->lk); qlock(&mux->lk);
dequeue(mux, r);
puttag(mux, r); puttag(mux, r);
qunlock(&mux->lk); qunlock(&mux->lk);
return nil; return nil;
@ -85,14 +86,13 @@ muxrpc(Mux *mux, void *tx)
continue; continue;
} }
r2 = mux->wait[tag]; r2 = mux->wait[tag];
if(r2 == nil){ if(r2 == nil || r2->prev == nil){
fprint(2, "%s: bad rpc tag %ux (no one waiting on that tag)\n", argv0, tag); fprint(2, "%s: bad rpc tag %ux (no one waiting on that tag)\n", argv0, tag);
/* must leak packet! don't know how to free it! */ /* must leak packet! don't know how to free it! */
continue; continue;
} }
r2->p = p; r2->p = p;
dequeue(mux, r2); dequeue(mux, r2);
puttag(mux, r2);
rwakeup(&r2->r); rwakeup(&r2->r);
} }
mux->muxer = 0; mux->muxer = 0;
@ -103,6 +103,7 @@ muxrpc(Mux *mux, void *tx)
} }
//print("finished %p\n", r); //print("finished %p\n", r);
p = r->p; p = r->p;
puttag(mux, r);
qunlock(&mux->lk); qunlock(&mux->lk);
return p; return p;
} }