Skip to content

Commit cd20c20

Browse files
authored
Merge pull request #59 from no92/slab-get-size
2 parents b3ac959 + ff1c89d commit cd20c20

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

include/frg/slab.hpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

612633
template<typename Policy, typename Mutex>
613634
auto 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+
806831
private:
807832
slab_pool<Policy, Mutex> *pool_;
808833
};

0 commit comments

Comments
 (0)