Changeset 280 in code for trunk/conn.go
- Timestamp:
- Apr 30, 2020, 8:35:02 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/conn.go
r210 r280 4 4 "fmt" 5 5 "net" 6 "sync" 6 7 "time" 7 8 … … 21 22 22 23 type conn struct { 23 net net.Conn 24 irc *irc.Conn 25 srv *Server 26 logger Logger 24 net net.Conn 25 irc *irc.Conn 26 srv *Server 27 logger Logger 28 29 lock sync.Mutex 27 30 outgoing chan<- *irc.Message 28 closed chan struct{}31 closed bool 29 32 } 30 33 … … 39 42 outgoing: outgoing, 40 43 logger: logger, 41 closed: make(chan struct{}),42 44 } 43 45 … … 69 71 70 72 func (c *conn) isClosed() bool { 71 select { 72 case <-c.closed: 73 return true 74 default: 75 return false 76 } 73 c.lock.Lock() 74 defer c.lock.Unlock() 75 return c.closed 77 76 } 78 77 79 78 // Close closes the connection. It is safe to call from any goroutine. 80 79 func (c *conn) Close() error { 81 if c.isClosed() { 80 c.lock.Lock() 81 defer c.lock.Unlock() 82 83 if c.closed { 82 84 return fmt.Errorf("connection already closed") 83 85 } 84 close(c.closed) 86 87 c.closed = true 85 88 close(c.outgoing) 86 89 return nil … … 102 105 // SendMessage queues a new outgoing message. It is safe to call from any 103 106 // goroutine. 107 // 108 // If the connection is closed before the message is sent, SendMessage silently 109 // drops the message. 104 110 func (c *conn) SendMessage(msg *irc.Message) { 105 if c.isClosed() { 111 c.lock.Lock() 112 defer c.lock.Unlock() 113 114 if c.closed { 106 115 return 107 116 }
Note:
See TracChangeset
for help on using the changeset viewer.