2023-10-05 04:11:12 +08:00
|
|
|
package common
|
|
|
|
|
|
|
|
import (
|
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
|
|
|
type SafeChannel struct {
|
|
|
|
ch chan interface{}
|
|
|
|
closed bool
|
|
|
|
mux sync.Mutex
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewSafeChannel(size int) *SafeChannel {
|
|
|
|
return &SafeChannel{
|
|
|
|
ch: make(chan interface{}, size),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *SafeChannel) Send(value interface{}) bool {
|
|
|
|
s.mux.Lock()
|
|
|
|
defer s.mux.Unlock()
|
|
|
|
|
|
|
|
if s.closed {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
s.ch <- value
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *SafeChannel) Receive() (interface{}, bool) {
|
|
|
|
val, ok := <-s.ch
|
|
|
|
return val, ok
|
|
|
|
}
|
|
|
|
|
2023-12-15 01:01:47 +08:00
|
|
|
func (s *SafeChannel) ReceiveChannel() <-chan interface{} {
|
|
|
|
return s.ch
|
|
|
|
}
|
|
|
|
|
2023-10-05 04:11:12 +08:00
|
|
|
func (s *SafeChannel) Close() {
|
|
|
|
s.mux.Lock()
|
|
|
|
defer s.mux.Unlock()
|
|
|
|
|
|
|
|
if !s.closed {
|
|
|
|
close(s.ch)
|
|
|
|
s.closed = true
|
|
|
|
}
|
|
|
|
}
|