Changeset 210 in code for trunk/upstream.go
- Timestamp:
- Apr 3, 2020, 2:35:08 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/upstream.go
r209 r210 32 32 33 33 type upstreamConn struct { 34 network *network 35 logger Logger 36 net net.Conn 37 irc *irc.Conn 38 srv *Server 39 user *user 40 outgoing chan<- *irc.Message 41 closed chan struct{} 34 conn 35 36 network *network 37 user *user 42 38 43 39 serverName string … … 91 87 } 92 88 93 setKeepAlive(netConn)94 95 outgoing := make(chan *irc.Message, 64)96 89 uc := &upstreamConn{ 90 conn: *newConn(network.user.srv, netConn, logger), 97 91 network: network, 98 logger: logger,99 net: netConn,100 irc: irc.NewConn(netConn),101 srv: network.user.srv,102 92 user: network.user, 103 outgoing: outgoing,104 closed: make(chan struct{}),105 93 channels: make(map[string]*upstreamChannel), 106 94 caps: make(map[string]string), … … 113 101 } 114 102 115 go func() {116 for msg := range outgoing {117 if uc.srv.Debug {118 uc.logger.Printf("sent: %v", msg)119 }120 uc.net.SetWriteDeadline(time.Now().Add(writeTimeout))121 if err := uc.irc.WriteMessage(msg); err != nil {122 uc.logger.Printf("failed to write message: %v", err)123 break124 }125 }126 if err := uc.net.Close(); err != nil {127 uc.logger.Printf("failed to close connection: %v", err)128 } else {129 uc.logger.Printf("connection closed")130 }131 // Drain the outgoing channel to prevent SendMessage from blocking132 for range outgoing {133 // This space is intentionally left blank134 }135 }()136 137 103 return uc, nil 138 }139 140 func (uc *upstreamConn) isClosed() bool {141 select {142 case <-uc.closed:143 return true144 default:145 return false146 }147 }148 149 // Close closes the connection. It is safe to call from any goroutine.150 func (uc *upstreamConn) Close() error {151 if uc.isClosed() {152 return fmt.Errorf("upstream connection already closed")153 }154 close(uc.closed)155 close(uc.outgoing)156 return nil157 104 } 158 105 … … 1410 1357 func (uc *upstreamConn) readMessages(ch chan<- event) error { 1411 1358 for { 1412 msg, err := uc. irc.ReadMessage()1359 msg, err := uc.ReadMessage() 1413 1360 if err == io.EOF { 1414 1361 break … … 1417 1364 } 1418 1365 1419 if uc.srv.Debug {1420 uc.logger.Printf("received: %v", msg)1421 }1422 1423 1366 ch <- eventUpstreamMessage{msg, uc} 1424 1367 } 1425 1368 1426 1369 return nil 1427 }1428 1429 // SendMessage queues a new outgoing message. It is safe to call from any1430 // goroutine.1431 func (uc *upstreamConn) SendMessage(msg *irc.Message) {1432 uc.outgoing <- msg1433 1370 } 1434 1371
Note:
See TracChangeset
for help on using the changeset viewer.