|
@@ -1,12 +1,11 @@
|
|
|
package internal
|
|
package internal
|
|
|
|
|
|
|
|
-
|
|
|
|
|
import (
|
|
import (
|
|
|
"net"
|
|
"net"
|
|
|
|
|
+ "one.com/nnet"
|
|
|
"sync"
|
|
"sync"
|
|
|
"sync/atomic"
|
|
"sync/atomic"
|
|
|
"time"
|
|
"time"
|
|
|
- "one.com/nnet"
|
|
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
// 关闭原因
|
|
// 关闭原因
|
|
@@ -27,6 +26,7 @@ type Session struct {
|
|
|
extraData interface{}
|
|
extraData interface{}
|
|
|
once sync.Once // Close once
|
|
once sync.Once // Close once
|
|
|
closed int32 // session 是否关闭
|
|
closed int32 // session 是否关闭
|
|
|
|
|
+ frozen int32 // is session frozen. when no responding, no receiving, but can send.
|
|
|
chClose chan struct{}
|
|
chClose chan struct{}
|
|
|
chSend chan nnet.IPacket
|
|
chSend chan nnet.IPacket
|
|
|
chRecv chan nnet.IPacket
|
|
chRecv chan nnet.IPacket
|
|
@@ -99,6 +99,10 @@ func (self *Session) close(reason int32) {
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func (self *Session) SetFrozen(frozen int32) {
|
|
|
|
|
+ atomic.StoreInt32(&self.frozen, frozen)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func (self *Session) IsClosed() bool {
|
|
func (self *Session) IsClosed() bool {
|
|
|
return atomic.LoadInt32(&self.closed) != 0
|
|
return atomic.LoadInt32(&self.closed) != 0
|
|
|
}
|
|
}
|
|
@@ -181,7 +185,9 @@ func (self *Session) loopRead() {
|
|
|
//
|
|
//
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- self.chRecv <- pkt
|
|
|
|
|
|
|
+ if self.frozen == 0 {
|
|
|
|
|
+ self.chRecv <- pkt
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -262,4 +268,3 @@ func asyncDo(fn func(), wg *sync.WaitGroup) {
|
|
|
wg.Done()
|
|
wg.Done()
|
|
|
}()
|
|
}()
|
|
|
}
|
|
}
|
|
|
-
|
|
|