Ensure to close client WriteLoop (#193)

* Ensure client WriteLoop is closed

* Ensure to close client WriteLoop
This commit is contained in:
thedevop
2023-04-21 13:20:46 -07:00
committed by GitHub
parent 7bd7bd5087
commit aac6d699da
2 changed files with 2 additions and 5 deletions

View File

@@ -355,10 +355,6 @@ func (cl *Client) Read(packetHandler ReadFn) error {
// Stop instructs the client to shut down all processing goroutines and disconnect.
func (cl *Client) Stop(err error) {
if atomic.LoadUint32(&cl.State.done) == 1 {
return
}
cl.State.endOnce.Do(func() {
if cl.Net.Conn != nil {
_ = cl.Net.Conn.Close() // omit close error
@@ -368,6 +364,8 @@ func (cl *Client) Stop(err error) {
cl.State.stopCause.Store(err)
}
close(cl.State.outbound)
atomic.StoreUint32(&cl.State.done, 1)
atomic.StoreInt64(&cl.State.disconnected, time.Now().Unix())
})

View File

@@ -374,7 +374,6 @@ func (s *Server) attachClient(cl *Client, listener string) error {
s.Log.Debug().Str("client", cl.ID).Err(err).Str("remote", cl.Net.Remote).Str("listener", listener).Msg("client disconnected")
expire := (cl.Properties.ProtocolVersion == 5 && cl.Properties.Props.SessionExpiryIntervalFlag && cl.Properties.Props.SessionExpiryInterval == 0) || (cl.Properties.ProtocolVersion < 5 && cl.Properties.Clean)
s.hooks.OnDisconnect(cl, err, expire)
close(cl.State.outbound)
if expire && atomic.LoadUint32(&cl.State.isTakenOver) == 0 {
cl.ClearInflights(math.MaxInt64, 0)