aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/cache/cachedisklayer.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-10-05 11:30:52 +0200
committerGitHub <[email protected]>2023-10-05 11:30:52 +0200
commita6c0facba83398d74e1f6d1b04a3641731af73b0 (patch)
treeb7935f2c4d25083b8171424f1142d128ccc15185 /src/zenserver/cache/cachedisklayer.cpp
parent0.2.26-pre2 (diff)
downloadzen-a6c0facba83398d74e1f6d1b04a3641731af73b0.tar.xz
zen-a6c0facba83398d74e1f6d1b04a3641731af73b0.zip
reduce lock in disklayer (#447)
* Don't block all write access to all buckets when doing GatherReferences/CollectGarbage
Diffstat (limited to 'src/zenserver/cache/cachedisklayer.cpp')
-rw-r--r--src/zenserver/cache/cachedisklayer.cpp32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/zenserver/cache/cachedisklayer.cpp b/src/zenserver/cache/cachedisklayer.cpp
index 7ce713de9..fafc6bbee 100644
--- a/src/zenserver/cache/cachedisklayer.cpp
+++ b/src/zenserver/cache/cachedisklayer.cpp
@@ -1805,12 +1805,18 @@ ZenCacheDiskLayer::CollectGarbage(GcContext& GcCtx)
{
ZEN_TRACE_CPU("Z$::Disk::CollectGarbage");
- RwLock::SharedLockScope _(m_Lock);
-
- for (auto& Kv : m_Buckets)
+ std::vector<CacheBucket*> Buckets;
+ {
+ RwLock::SharedLockScope _(m_Lock);
+ Buckets.reserve(m_Buckets.size());
+ for (auto& Kv : m_Buckets)
+ {
+ Buckets.push_back(Kv.second.get());
+ }
+ }
+ for (CacheBucket* Bucket : Buckets)
{
- CacheBucket& Bucket = *Kv.second;
- Bucket.CollectGarbage(GcCtx);
+ Bucket->CollectGarbage(GcCtx);
}
}
@@ -2261,12 +2267,18 @@ ZenCacheDiskLayer::GatherReferences(GcContext& GcCtx)
{
ZEN_TRACE_CPU("Z$::Disk::GatherReferences");
- RwLock::SharedLockScope _(m_Lock);
-
- for (auto& Kv : m_Buckets)
+ std::vector<CacheBucket*> Buckets;
+ {
+ RwLock::SharedLockScope _(m_Lock);
+ Buckets.reserve(m_Buckets.size());
+ for (auto& Kv : m_Buckets)
+ {
+ Buckets.push_back(Kv.second.get());
+ }
+ }
+ for (CacheBucket* Bucket : Buckets)
{
- CacheBucket& Bucket = *Kv.second;
- Bucket.GatherReferences(GcCtx);
+ Bucket->GatherReferences(GcCtx);
}
}