remove listener lock

This commit is contained in:
maddalax 2024-11-12 16:12:42 -06:00
parent 79b15fe194
commit 3a3039609f

View file

@ -58,8 +58,7 @@ type SocketManager struct {
sockets *xsync.MapOf[string, *xsync.MapOf[string, SocketConnection]] sockets *xsync.MapOf[string, *xsync.MapOf[string, SocketConnection]]
idToRoom *xsync.MapOf[string, string] idToRoom *xsync.MapOf[string, string]
listeners []chan SocketEvent listeners []chan SocketEvent
listenersQueuedForDelete map[chan SocketEvent]bool listenersQueuedForDelete *xsync.MapOf[chan SocketEvent, bool]
listenerLock sync.Mutex
goroutinesRunning atomic.Int32 goroutinesRunning atomic.Int32
opts *opts.ExtensionOpts opts *opts.ExtensionOpts
lock sync.Mutex lock sync.Mutex
@ -131,7 +130,7 @@ func NewSocketManager(opts *opts.ExtensionOpts) *SocketManager {
return &SocketManager{ return &SocketManager{
sockets: xsync.NewMapOf[string, *xsync.MapOf[string, SocketConnection]](), sockets: xsync.NewMapOf[string, *xsync.MapOf[string, SocketConnection]](),
idToRoom: xsync.NewMapOf[string, string](), idToRoom: xsync.NewMapOf[string, string](),
listenersQueuedForDelete: make(map[chan SocketEvent]bool), listenersQueuedForDelete: xsync.NewMapOf[chan SocketEvent, bool](),
opts: opts, opts: opts,
goroutinesRunning: atomic.Int32{}, goroutinesRunning: atomic.Int32{},
} }
@ -180,20 +179,16 @@ func (manager *SocketManager) RunIntervalWithSocket(socketId string, interval ti
} }
func (manager *SocketManager) Listen(listener chan SocketEvent) { func (manager *SocketManager) Listen(listener chan SocketEvent) {
manager.listenerLock.Lock()
if manager.listeners == nil { if manager.listeners == nil {
manager.listeners = make([]chan SocketEvent, 0) manager.listeners = make([]chan SocketEvent, 0)
} }
if listener != nil { if listener != nil {
manager.listeners = append(manager.listeners, listener) manager.listeners = append(manager.listeners, listener)
} }
manager.listenerLock.Unlock()
} }
func (manager *SocketManager) RemoveListener(listener chan SocketEvent) { func (manager *SocketManager) RemoveListener(listener chan SocketEvent) {
manager.listenerLock.Lock() manager.listenersQueuedForDelete.Store(listener, true)
manager.listenersQueuedForDelete[listener] = true
manager.listenerLock.Unlock()
} }
func (manager *SocketManager) dispatch(event SocketEvent) { func (manager *SocketManager) dispatch(event SocketEvent) {
@ -209,16 +204,13 @@ func (manager *SocketManager) dispatch(event SocketEvent) {
} }
}() }()
manager.listenerLock.Lock() newListener := make([]chan SocketEvent, 0)
if len(manager.listenersQueuedForDelete) > 0 { for _, listener := range manager.listeners {
newListener := make([]chan SocketEvent, 0) if _, ok := manager.listenersQueuedForDelete.Load(listener); !ok {
for _, listener := range manager.listeners { newListener = append(newListener, listener)
if _, ok := manager.listenersQueuedForDelete[listener]; !ok {
newListener = append(newListener, listener)
}
} }
manager.listeners = newListener
} }
manager.listeners = newListener
wg := sync.WaitGroup{} wg := sync.WaitGroup{}
for _, listener := range manager.listeners { for _, listener := range manager.listeners {
@ -230,7 +222,6 @@ func (manager *SocketManager) dispatch(event SocketEvent) {
} }
wg.Wait() wg.Wait()
manager.listenerLock.Unlock()
done <- struct{}{} done <- struct{}{}
} }