@@ -146,6 +146,7 @@ class ObjectCache : public ObjectCacheBase<AllocatorT> {
146
146
147
147
public:
148
148
using ItemDestructor = std::function<void (ObjectCacheDestructorData)>;
149
+ using RemoveCb = std::function<void (ObjectCacheDestructorData)>;
149
150
using Key = KAllocation::Key;
150
151
using Config = ObjectCacheConfig<ObjectCache<AllocatorT>>;
151
152
using EvictionPolicyConfig = typename AllocatorT::MMType::Config;
@@ -550,34 +551,66 @@ void ObjectCache<AllocatorT>::init() {
550
551
.setDefaultAllocSizes ({l1AllocSize})
551
552
.enableItemReaperInBackground (config_.reaperInterval )
552
553
.setEventTracker (std::move (config_.eventTracker ))
553
- .setEvictionSearchLimit (config_.evictionSearchLimit )
554
- .setItemDestructor ([this ](typename AllocatorT::DestructorData data) {
555
- ObjectCacheDestructorContext ctx;
556
- if (data.context == DestructorContext::kEvictedFromRAM ) {
557
- evictions_.inc ();
558
- ctx = ObjectCacheDestructorContext::kEvicted ;
559
- } else if (data.context == DestructorContext::kRemovedFromRAM ) {
560
- ctx = ObjectCacheDestructorContext::kRemoved ;
561
- } else { // should not enter here
562
- ctx = ObjectCacheDestructorContext::kUnknown ;
563
- }
554
+ .setEvictionSearchLimit (config_.evictionSearchLimit );
555
+ if (config_.itemDestructor ) {
556
+ l1Config.setItemDestructor (
557
+ [this ](typename AllocatorT::DestructorData data) {
558
+ ObjectCacheDestructorContext ctx;
559
+ if (data.context == DestructorContext::kEvictedFromRAM ) {
560
+ evictions_.inc ();
561
+ ctx = ObjectCacheDestructorContext::kEvicted ;
562
+ } else if (data.context == DestructorContext::kRemovedFromRAM ) {
563
+ ctx = ObjectCacheDestructorContext::kRemoved ;
564
+ } else { // should not enter here
565
+ ctx = ObjectCacheDestructorContext::kUnknown ;
566
+ }
564
567
565
- auto & item = data.item ;
568
+ auto & item = data.item ;
569
+
570
+ auto itemPtr = reinterpret_cast <ObjectCacheItem*>(item.getMemory ());
571
+
572
+ SCOPE_EXIT {
573
+ if (config_.objectSizeTrackingEnabled ) {
574
+ // update total object size
575
+ totalObjectSizeBytes_.fetch_sub (itemPtr->objectSize ,
576
+ std::memory_order_relaxed);
577
+ }
578
+ // execute user defined item destructor
579
+ config_.itemDestructor (ObjectCacheDestructorData (
580
+ ctx, itemPtr->objectPtr , item.getKey (), item.getExpiryTime (),
581
+ item.getCreationTime (), item.getLastAccessTime ()));
582
+ };
583
+ });
584
+ } else {
585
+ l1Config.setRemoveCallback ([this ](typename AllocatorT::RemoveCbData data) {
586
+ ObjectCacheDestructorContext ctx;
587
+ if (data.context == RemoveContext::kEviction ) {
588
+ evictions_.inc ();
589
+ ctx = ObjectCacheDestructorContext::kEvicted ;
590
+ } else if (data.context == RemoveContext::kNormal ) {
591
+ ctx = ObjectCacheDestructorContext::kRemoved ;
592
+ } else { // should not enter here
593
+ ctx = ObjectCacheDestructorContext::kUnknown ;
594
+ }
566
595
567
- auto itemPtr = reinterpret_cast <ObjectCacheItem*>(item.getMemory ());
596
+ auto & item = data.item ;
597
+
598
+ auto itemPtr = reinterpret_cast <ObjectCacheItem*>(item.getMemory ());
599
+
600
+ SCOPE_EXIT {
601
+ if (config_.objectSizeTrackingEnabled ) {
602
+ // update total object size
603
+ totalObjectSizeBytes_.fetch_sub (itemPtr->objectSize ,
604
+ std::memory_order_relaxed);
605
+ }
606
+ // execute user defined item destructor
607
+ config_.removeCb (ObjectCacheDestructorData (
608
+ ctx, itemPtr->objectPtr , item.getKey (), item.getExpiryTime (),
609
+ item.getCreationTime (), item.getLastAccessTime ()));
610
+ };
611
+ });
612
+ }
568
613
569
- SCOPE_EXIT {
570
- if (config_.objectSizeTrackingEnabled ) {
571
- // update total object size
572
- totalObjectSizeBytes_.fetch_sub (itemPtr->objectSize ,
573
- std::memory_order_relaxed);
574
- }
575
- // execute user defined item destructor
576
- config_.itemDestructor (ObjectCacheDestructorData (
577
- ctx, itemPtr->objectPtr , item.getKey (), item.getExpiryTime (),
578
- item.getCreationTime (), item.getLastAccessTime ()));
579
- };
580
- });
581
614
if (config_.delayCacheWorkersStart ) {
582
615
l1Config.setDelayCacheWorkersStart ();
583
616
}
0 commit comments