From d19d8bd5c3ae80674c6b08cc6b76427d6a6132c9 Mon Sep 17 00:00:00 2001 From: zijiren233 Date: Thu, 26 Oct 2023 19:53:08 +0800 Subject: [PATCH] Fix: use comp and del --- internal/op/users.go | 3 +-- utils/syncCache/cache.go | 14 +++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/internal/op/users.go b/internal/op/users.go index 7eab1b7..47e2d98 100644 --- a/internal/op/users.go +++ b/internal/op/users.go @@ -82,8 +82,7 @@ func DeleteUserByID(userID uint) error { roomCache.Range(func(key uint, value *synccache.Entry[*Room]) bool { v := value.Value() if v.CreatorID == userID { - roomCache.Delete(key) - v.close() + roomCache.CompareAndDelete(key, value) } return true }) diff --git a/utils/syncCache/cache.go b/utils/syncCache/cache.go index 2b4d25f..de9e524 100644 --- a/utils/syncCache/cache.go +++ b/utils/syncCache/cache.go @@ -43,9 +43,9 @@ func (sc *SyncCache[K, V]) Releases() { func (sc *SyncCache[K, V]) trim() { sc.cache.Range(func(key K, value *Entry[V]) bool { if value.IsExpired() { - e, loaded := sc.cache.LoadAndDelete(key) - if loaded && sc.deletedCallback != nil { - sc.deletedCallback(e.value) + sc.cache.CompareAndDelete(key, value) + if sc.deletedCallback != nil { + sc.deletedCallback(value.value) } } return true @@ -100,6 +100,14 @@ func (sc *SyncCache[K, V]) LoadAndDelete(key K) (value *Entry[V], loaded bool) { return } +func (sc *SyncCache[K, V]) CompareAndDelete(key K, oldEntry *Entry[V]) (success bool) { + b := sc.cache.CompareAndDelete(key, oldEntry) + if b && sc.deletedCallback != nil { + sc.deletedCallback(oldEntry.value) + } + return b +} + func (sc *SyncCache[K, V]) Clear() { sc.cache.Clear() }