From 3541a0cfe1ca1d52fa2ca60562ed4e22565f0a8e Mon Sep 17 00:00:00 2001 From: Nathaniel Filardo Date: Tue, 23 Mar 2021 16:09:23 +0000 Subject: [PATCH] SP: Allocator::large_alloc return CapPtr<> Document and suppress MSVC's confusion with CapPtr<>'s constructor (the suppression has to happen at the definition, not the use, of the constructor) in the case of never-needs-initialization Allocator-s. --- src/mem/alloc.h | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/mem/alloc.h b/src/mem/alloc.h index 8eeb19a..9dabcc4 100644 --- a/src/mem/alloc.h +++ b/src/mem/alloc.h @@ -150,7 +150,7 @@ namespace snmalloc else { handle_message_queue(); - return large_alloc(size); + return large_alloc(size).unsafe_capptr; } #endif } @@ -200,7 +200,7 @@ namespace snmalloc return medium_alloc(sizeclass, rsize, size); } - return large_alloc(size); + return large_alloc(size).unsafe_capptr; #endif } @@ -1485,14 +1485,17 @@ namespace snmalloc } template - void* large_alloc(size_t size) + CapPtr large_alloc(size_t size) { if (NeedsInitialisation(this)) { - return InitThreadAllocator([size](void* alloc) { - return reinterpret_cast(alloc)->large_alloc( - size); + // MSVC-vs-CapPtr triggering; xref CapPtr's constructor + void* ret = InitThreadAllocator([size](void* alloc) { + CapPtr ret = + reinterpret_cast(alloc)->large_alloc(size); + return ret.unsafe_capptr; }); + return CapPtr(ret); } size_t size_bits = bits::next_pow2_bits(size); @@ -1513,7 +1516,7 @@ namespace snmalloc stats().alloc_request(size); stats().large_alloc(large_class); } - return p.unsafe_capptr; + return p.as_void(); } void large_dealloc_unchecked(