@@ -67,6 +67,7 @@ class slab_pool {
6767 void *realloc (void *pointer, size_t new_length);
6868 void free (void *pointer);
6969 void deallocate (void *pointer, size_t size);
70+ size_t get_size (void *pointer);
7071
7172 size_t numUsedPages () {
7273 return _usedPages;
@@ -608,6 +609,26 @@ void slab_pool<Policy, Mutex>::deallocate(void *p, size_t size) {
608609 _verify_integrity ();
609610}
610611
612+ template <typename Policy, typename Mutex>
613+ size_t slab_pool<Policy, Mutex>::get_size(void *p) {
614+ if (enable_checking)
615+ _verify_integrity ();
616+
617+ if (!p)
618+ return 0 ;
619+
620+ auto address = reinterpret_cast <uintptr_t >(p);
621+ auto sup = reinterpret_cast <frame *>((address - 1 ) & ~(sb_size - 1 ));
622+
623+ if (sup->type == frame_type::slab) {
624+ auto slb = static_cast <slab_frame *>(sup);
625+ return bucket_to_size (slb->index );
626+ }
627+
628+ FRG_ASSERT (sup->type == frame_type::large);
629+ return sup->length ;
630+ }
631+
611632
612633template <typename Policy, typename Mutex>
613634auto slab_pool<Policy, Mutex>::_construct_slab(int index)
@@ -803,6 +824,10 @@ class slab_allocator {
803824 return pool_->realloc (pointer, new_size);
804825 }
805826
827+ size_t get_size (void *pointer) {
828+ return pool_->get_size (pointer);
829+ }
830+
806831private:
807832 slab_pool<Policy, Mutex> *pool_;
808833};
0 commit comments