func (c *Conn) Read(b []byte) (n int, err error) { mu.Lock() defer mu.Unlock() for { n = copy(b, c.readBuf) c.readBuf = c.readBuf[n:] c.updateReadBufNotEmpty() if n != 0 { // Inbound packets are backed up when the read buffer is too big. c.processInbound() return } if c.gotFin.IsSet() || c.closed.IsSet() { err = io.EOF return } if c.destroyed.IsSet() { if c.err == nil { panic("closed without receiving fin, and no error") } err = c.err return } if c.connDeadlines.read.passed.IsSet() { err = errTimeout return } missinggo.WaitEvents(&mu, &c.gotFin, &c.closed, &c.destroyed, &c.connDeadlines.read.passed, &c.readBufNotEmpty) } }
func (c *Conn) waitAck(seq uint16) { send := c.seqSend(seq) if send == nil { return } missinggo.WaitEvents(&mu, &send.acked, &c.destroyed) return }
func (s *Socket) nextSyn() (syn syn, err error) { for { missinggo.WaitEvents(&mu, &s.closed, &s.backlogNotEmpty, &s.destroyed) if s.closed.IsSet() { err = errClosed return } if s.destroyed.IsSet() { err = s.ReadErr return } for k := range s.backlog { syn = k delete(s.backlog, k) s.backlogChanged() return } } }
func (c *Conn) Write(p []byte) (n int, err error) { mu.Lock() defer mu.Unlock() for len(p) != 0 { if c.wroteFin.IsSet() || c.closed.IsSet() { err = errClosed return } if c.destroyed.IsSet() { err = c.err return } if c.connDeadlines.write.passed.IsSet() { err = errTimeout return } // If peerWndSize is 0, we still want to send something, so don't // block until we exceed it. if c.canWrite.IsSet() { var n1 int n1, err = c.write(stData, c.send_id, p, c.seq_nr) n += n1 if err != nil { break } if n1 == 0 { panic(len(p)) } p = p[n1:] continue } missinggo.WaitEvents(&mu, &c.wroteFin, &c.closed, &c.destroyed, &c.connDeadlines.write.passed, &c.canWrite) } return }