tdo not free r until done with it! - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit d165fa680cba59b60cbe1fe4a0fa8aac92fdef67
 (DIR) parent 7e19561a6c511205d64667bb3bf89842678c6f96
 (HTM) Author: rsc <devnull@localhost>
       Date:   Tue,  4 Jan 2005 22:20:52 +0000
       
       do not free r until done with it!
       
       Diffstat:
         M src/libmux/mux.c                    |       5 +++--
       
       1 file changed, 3 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/src/libmux/mux.c b/src/libmux/mux.c
       t@@ -49,6 +49,7 @@ muxrpc(Mux *mux, void *tx)
                /* actually send the packet */
                if(tag < 0 || mux->settag(mux, tx, tag) < 0 || _muxsend(mux, tx) < 0){
                        qlock(&mux->lk);
       +                dequeue(mux, r);
                        puttag(mux, r);
                        qunlock(&mux->lk);
                        return nil;
       t@@ -85,14 +86,13 @@ muxrpc(Mux *mux, void *tx)
                                        continue;
                                }
                                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);
                                        /* must leak packet! don't know how to free it! */
                                        continue;
                                }        
                                r2->p = p;
                                dequeue(mux, r2);
       -                        puttag(mux, r2);
                                rwakeup(&r2->r);
                        }
                        mux->muxer = 0;
       t@@ -103,6 +103,7 @@ muxrpc(Mux *mux, void *tx)
                }
        //print("finished %p\n", r);
                p = r->p;
       +        puttag(mux, r);
                qunlock(&mux->lk);
                return p;
        }