fix: Fix panic: send on closed channel

```
device                           broker
------------------------------------------------------
dev.br.register <- dev

dev.br.unregister <- dev
                                 handle unregister
                                       c.Close()

                                 handle register
                                       c.WriteMsg(msgTypeRegister, append([]byte{err}, msg...))
                                            dev.send <- append(b, data...)

```

Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
This commit is contained in:
Jianhui Zhao
2024-11-23 20:14:15 +08:00
parent 26328a681f
commit 7dd174d096
4 changed files with 18 additions and 2 deletions
+4
View File
@@ -66,6 +66,10 @@ func (br *broker) run() {
for {
select {
case c := <-br.register:
if c.Closed() {
break
}
devid := c.DeviceID()
if c.IsDevice() {
+2
View File
@@ -11,4 +11,6 @@ type Client interface {
IsDevice() bool
Close()
Closed() bool
}
+6 -1
View File
@@ -131,10 +131,15 @@ func (dev *device) WriteMsg(typ int, data []byte) {
dev.send <- append(b, data...)
}
func (dev *device) Closed() bool {
return atomic.LoadUint32(&dev.closed) == 1
}
func (dev *device) Close() {
if atomic.LoadUint32(&dev.closed) == 1 {
if dev.Closed() {
return
}
atomic.StoreUint32(&dev.closed, 1)
log.Debug().Msgf("Device '%s' disconnected", dev.conn.RemoteAddr())
+6 -1
View File
@@ -55,10 +55,15 @@ func (u *user) WriteMsg(typ int, data []byte) {
}
}
func (u *user) Closed() bool {
return atomic.LoadUint32(&u.closed) == 1
}
func (u *user) Close() {
if atomic.LoadUint32(&u.closed) == 1 {
if u.Closed() {
return
}
atomic.StoreUint32(&u.closed, 1)
u.conn.Close()