Skip to content

Commit fdc438d

Browse files
author
stefanKnott
committed
fix race condition caused when many server.On() events are being mapped concurrently
1 parent e9f0a9b commit fdc438d

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

handler.go

+9
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ type baseHandler struct {
1010
events map[string]*caller
1111
name string
1212
broadcast BroadcastAdaptor
13+
evMu sync.Mutex
1314
}
1415

1516
func newBaseHandler(name string, broadcast BroadcastAdaptor) *baseHandler {
1617
return &baseHandler{
1718
events: make(map[string]*caller),
1819
name: name,
1920
broadcast: broadcast,
21+
evMu: sync.Mutex{},
2022
}
2123
}
2224

@@ -26,7 +28,9 @@ func (h *baseHandler) On(event string, f interface{}) error {
2628
if err != nil {
2729
return err
2830
}
31+
h.evMu.Lock()
2932
h.events[event] = c
33+
h.evMu.Unlock()
3034
return nil
3135
}
3236

@@ -40,13 +44,16 @@ type socketHandler struct {
4044

4145
func newSocketHandler(s *socket, base *baseHandler) *socketHandler {
4246
events := make(map[string]*caller)
47+
base.evMu.Lock()
4348
for k, v := range base.events {
4449
events[k] = v
4550
}
51+
base.evMu.Unlock()
4652
return &socketHandler{
4753
baseHandler: &baseHandler{
4854
events: events,
4955
broadcast: base.broadcast,
56+
evMu: base.evMu,
5057
},
5158
acks: make(map[int]*caller),
5259
socket: s,
@@ -146,7 +153,9 @@ func (h *socketHandler) onPacket(decoder *decoder, packet *packet) ([]interface{
146153
message = decoder.Message()
147154
}
148155
}
156+
h.evMu.Lock()
149157
c, ok := h.events[message]
158+
h.evMu.Unlock()
150159
if !ok {
151160
// If the message is not recognized by the server, the decoder.currentCloser
152161
// needs to be closed otherwise the server will be stuck until the e

0 commit comments

Comments
 (0)