mirror of
https://github.com/ergochat/ergo.git
synced 2024-11-26 13:59:44 +01:00
server: Add a mutex to kill a very small, bad race
This commit is contained in:
parent
835187a736
commit
1812edb2db
@ -68,6 +68,7 @@ type Server struct {
|
|||||||
store buntdb.DB
|
store buntdb.DB
|
||||||
idle chan *Client
|
idle chan *Client
|
||||||
limits Limits
|
limits Limits
|
||||||
|
listenerEventActMutex sync.Mutex
|
||||||
listenerUpdateMutex sync.Mutex
|
listenerUpdateMutex sync.Mutex
|
||||||
listeners map[string]ListenerInterface
|
listeners map[string]ListenerInterface
|
||||||
monitoring map[string][]Client
|
monitoring map[string][]Client
|
||||||
@ -341,6 +342,11 @@ func (s *Server) createListener(addr string, tlsMap map[string]*tls.Config) {
|
|||||||
|
|
||||||
select {
|
select {
|
||||||
case event := <-s.listeners[addr].Events:
|
case event := <-s.listeners[addr].Events:
|
||||||
|
// this is used to confirm that whoever passed us this event has closed the existing listener correctly (in an attempt to get us to notice the event).
|
||||||
|
// this is required to keep REHASH from having a very small race possibility of killing the primary listener
|
||||||
|
s.listenerEventActMutex.Lock()
|
||||||
|
s.listenerEventActMutex.Unlock()
|
||||||
|
|
||||||
if event.Type == DestroyListener {
|
if event.Type == DestroyListener {
|
||||||
// listener should already be closed, this is just for safety
|
// listener should already be closed, this is just for safety
|
||||||
listener.Close()
|
listener.Close()
|
||||||
@ -922,6 +928,7 @@ func rehashHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
server.listenerEventActMutex.Lock()
|
||||||
if exists {
|
if exists {
|
||||||
// update old listener
|
// update old listener
|
||||||
fmt.Println("refreshing", addr)
|
fmt.Println("refreshing", addr)
|
||||||
@ -938,6 +945,8 @@ func rehashHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
|||||||
}
|
}
|
||||||
// force listener to apply the event right away
|
// force listener to apply the event right away
|
||||||
server.listeners[addr].Listener.Close()
|
server.listeners[addr].Listener.Close()
|
||||||
|
|
||||||
|
server.listenerEventActMutex.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, newaddr := range config.Server.Listen {
|
for _, newaddr := range config.Server.Listen {
|
||||||
|
Loading…
Reference in New Issue
Block a user