From 4114118a9ed01f289c0694b9053af63191e6b987 Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Thu, 21 Sep 2023 17:15:23 +0100 Subject: [PATCH] Reduce mutex contention on callbacks --- sync2/poller.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sync2/poller.go b/sync2/poller.go index 85d611a0..4902bf69 100644 --- a/sync2/poller.go +++ b/sync2/poller.go @@ -222,19 +222,25 @@ func (h *PollerMap) DeviceIDs(userID string) []string { func (h *PollerMap) ExpirePollers(pids []PollerID) int { h.pollerMu.Lock() - defer h.pollerMu.Unlock() numTerminated := 0 + var pollersToTerminate []*poller for _, pid := range pids { p, ok := h.Pollers[pid] if !ok || p.terminated.Load() { continue } + pollersToTerminate = append(pollersToTerminate, p) + } + h.pollerMu.Unlock() + // now terminate the pollers. + for _, p := range pollersToTerminate { p.Terminate() // Ensure that we won't recreate this poller on startup. If it reappears later, // we'll make another EnsurePolling call which will recreate the poller. h.callbacks.OnExpiredToken(context.Background(), hashToken(p.accessToken), p.userID, p.deviceID) numTerminated++ } + return numTerminated }