@@ -68,6 +68,10 @@ void TransferCache::Init(size_t cl) {
6868 // We need at least 2 slots to store list head and tail.
6969 ASSERT (kMinObjectsToMove >= 2 );
7070
71+ // Cache this value, for performance.
72+ arbitrary_transfer_ =
73+ IsExperimentActive (Experiment::TCMALLOC_ARBITRARY_TRANSFER_CACHE);
74+
7175 slots_ = nullptr ;
7276 max_capacity_ = 0 ;
7377 SizeInfo info = {0 , 0 };
@@ -140,6 +144,7 @@ bool TransferCache::ShrinkCache() {
140144 absl::base_internal::SpinLockHolder h (&lock_);
141145 auto info = slot_info_.load (std::memory_order_relaxed);
142146 if (info.capacity == 0 ) return false ;
147+ if (!arbitrary_transfer_ && info.capacity < N) return false ;
143148
144149 N = std::min (N, info.capacity );
145150 int unused = info.capacity - info.used ;
@@ -181,7 +186,7 @@ void TransferCache::InsertRange(absl::Span<void *> batch, int N) {
181186 tracking::Report (kTCInsertHit , size_class (), 1 );
182187 return ;
183188 }
184- } else {
189+ } else if (arbitrary_transfer_) {
185190 absl::base_internal::SpinLockHolder h (&lock_);
186191 MakeCacheSpace (N);
187192 // MakeCacheSpace can drop the lock, so refetch
@@ -220,7 +225,6 @@ void TransferCache::InsertRange(absl::Span<void *> batch, int N) {
220225 }
221226#endif
222227 }
223- // We don't need to hold the lock here, so release it earlier.
224228 }
225229 tracking::Report (kTCInsertMiss , size_class (), 1 );
226230 freelist ().InsertRange (batch.data (), N);
@@ -243,7 +247,7 @@ int TransferCache::RemoveRange(void **batch, int N) {
243247 tracking::Report (kTCRemoveHit , size_class (), 1 );
244248 return N;
245249 }
246- } else if (info.used >= 0 ) {
250+ } else if (arbitrary_transfer_ && info.used >= 0 ) {
247251 absl::base_internal::SpinLockHolder h (&lock_);
248252 // Refetch with the lock
249253 info = slot_info_.load (std::memory_order_relaxed);
@@ -255,7 +259,6 @@ int TransferCache::RemoveRange(void **batch, int N) {
255259 memcpy (batch, entry, sizeof (void *) * fetch);
256260 tracking::Report (kTCRemoveHit , size_class (), 1 );
257261 if (fetch == N) return N;
258- // We don't need to hold the lock here, so release it earlier.
259262 }
260263 tracking::Report (kTCRemoveMiss , size_class (), 1 );
261264 return freelist ().RemoveRange (batch + fetch, N - fetch) + fetch;
0 commit comments