diff --git a/bridgev2/bridge.go b/bridgev2/bridge.go index 24ceaf6b..38f7ce1d 100644 --- a/bridgev2/bridge.go +++ b/bridgev2/bridge.go @@ -318,6 +318,7 @@ func (br *Bridge) Stop() { func (br *Bridge) stop(isRunOnce bool) { br.Log.Info().Msg("Shutting down bridge") + br.DisappearLoop.Stop() br.stopBackfillQueue.Set() br.Matrix.PreStop() if !isRunOnce { diff --git a/bridgev2/disappear.go b/bridgev2/disappear.go index 5f9900a5..d7b2182b 100644 --- a/bridgev2/disappear.go +++ b/bridgev2/disappear.go @@ -8,6 +8,7 @@ package bridgev2 import ( "context" + "sync/atomic" "time" "github.com/rs/zerolog" @@ -21,15 +22,17 @@ import ( type DisappearLoop struct { br *Bridge NextCheck time.Time - stop context.CancelFunc + stop atomic.Pointer[context.CancelFunc] } const DisappearCheckInterval = 1 * time.Hour func (dl *DisappearLoop) Start() { log := dl.br.Log.With().Str("component", "disappear loop").Logger() - ctx := log.WithContext(context.Background()) - ctx, dl.stop = context.WithCancel(ctx) + ctx, stop := context.WithCancel(log.WithContext(context.Background())) + if oldStop := dl.stop.Swap(&stop); oldStop != nil { + (*oldStop)() + } log.Debug().Msg("Disappearing message loop starting") for { dl.NextCheck = time.Now().Add(DisappearCheckInterval) @@ -49,8 +52,11 @@ func (dl *DisappearLoop) Start() { } func (dl *DisappearLoop) Stop() { - if dl.stop != nil { - dl.stop() + if dl == nil { + return + } + if stop := dl.stop.Load(); stop != nil { + (*stop)() } }