func (clnt *Clnt) Rpcnb(r *Req) error { var tag uint16 if r.Tc.Type == ixp.Tversion { tag = ixp.NOTAG } else { tag = r.tag } ixp.SetTag(r.Tc, tag) clnt.Lock() if clnt.err != nil { clnt.Unlock() return clnt.err } if clnt.reqlast != nil { clnt.reqlast.next = r } else { clnt.reqfirst = r } r.prev = clnt.reqlast clnt.reqlast = r clnt.Unlock() clnt.reqout <- r return nil }
func (conn *Conn) send() { for { select { case <-conn.done: return case req := <-conn.reqout: ixp.SetTag(req.Rc, req.Tc.Tag) conn.Lock() conn.rsz += uint64(req.Rc.Size) conn.npend-- conn.Unlock() if conn.Debuglevel > 0 { conn.logFcall(req.Rc) if conn.Debuglevel&DbgPrintPackets != 0 { log.Println("<-<", conn.Id, fmt.Sprint(req.Rc.Pkt)) } if conn.Debuglevel&DbgPrintFcalls != 0 { log.Println("<<<", conn.Id, req.Rc.String()) } } for buf := req.Rc.Pkt; len(buf) > 0; { n, err := conn.conn.Write(buf) if err != nil { /* just close the socket, will get signal on conn.done */ log.Println("error while writing") conn.conn.Close() break } buf = buf[n:] } select { case conn.rchan <- req.Rc: break default: } } } panic("unreached") }