fix: 修复 server.Conn 和 client.Client 连接关闭时发生的竞态问题

This commit is contained in:
kercylan98
2023-09-09 13:10:19 +08:00
parent 8fd4e8f722
commit 0215c5449a
4 changed files with 63 additions and 50 deletions
+14 -5
View File
@@ -34,14 +34,14 @@ type Client struct {
func (slf *Client) Run() error {
var runState = make(chan error)
go func() {
go func(runState chan<- error) {
defer func() {
if err := recover(); err != nil {
slf.Close(err.(error))
}
}()
slf.core.Run(runState, slf.onReceive)
}()
}(runState)
err := <-runState
if err != nil {
slf.mutex.Lock()
@@ -81,13 +81,11 @@ func (slf *Client) Close(err ...error) {
}
if slf.packets != nil {
close(slf.packets)
slf.packets = nil
}
if slf.accumulate != nil {
close(slf.accumulate)
slf.accumulate = nil
}
slf.packets = nil
unlock = true
slf.mutex.Unlock()
if len(err) > 0 {
@@ -139,6 +137,7 @@ func (slf *Client) write(wst int, packet []byte, callback ...func(err error)) {
// writeLoop 写循环
func (slf *Client) writeLoop(wait *sync.WaitGroup) {
slf.mutex.Lock()
slf.packets = make(chan *Packet, 1024*10)
slf.packetPool = concurrent.NewPool[*Packet](10*1024,
func() *Packet {
@@ -161,11 +160,21 @@ func (slf *Client) writeLoop(wait *sync.WaitGroup) {
err = fmt.Errorf("%v", err)
}
slf.Close(err)
slf.packets = nil
}
}()
wait.Done()
slf.mutex.Unlock()
for {
packet, ok := <-slf.packets
if !ok {
slf.mutex.Lock()
slf.packets = nil
slf.mutex.Unlock()
break
}
for packet := range slf.packets {
data := packet
var err = slf.core.Write(data)
callback := data.callback