diff --git a/CMakeLists.txt b/CMakeLists.txt index 2512b18..88716a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.20) include(cmake/color.cmake) -set(BLT_VERSION 0.18.38) +set(BLT_VERSION 0.18.39) set(BLT_TEST_VERSION 0.0.1) set(BLT_TARGET BLT) diff --git a/include/blt/std/atomic_allocator.h b/include/blt/std/atomic_allocator.h index 81dad83..07d323c 100644 --- a/include/blt/std/atomic_allocator.h +++ b/include/blt/std/atomic_allocator.h @@ -36,89 +36,89 @@ namespace blt { - template - class atomic_bump_allocator - { - private: - struct block - { - struct block_metadata_t - { - const blt::size_t size = 0; - std::atomic allocated_objects = 0; - std::atomic next = nullptr; - std::atomic prev = nullptr; - std::atomic offset = nullptr; - } metadata; - blt::u8 buffer[8]{}; - - explicit block(blt::size_t size) - { - metadata.size = size; - metadata.offset = buffer; - } - - [[nodiscard]] blt::ptrdiff_t storage_size() const noexcept - { - return static_cast(metadata.size - sizeof(typename block::block_metadata_t)); - } - - [[nodiscard]] blt::ptrdiff_t used_bytes_in_block() const noexcept - { - return static_cast(metadata.offset - buffer); - } - - [[nodiscard]] blt::ptrdiff_t remaining_bytes_in_block() const noexcept - { - return storage_size() - used_bytes_in_block(); - } - }; - - public: - void* allocate(blt::size_t bytes) - { - auto head_ptr = head.load(std::memory_order_relaxed); - auto new_head = head_ptr; - do - { - if (head_ptr->remaining_bytes_in_block() < bytes) - { - - } - } while (!head.compare_exchange_weak(head_ptr, new_head, std::memory_order_release, std::memory_order_acquire)); - } - - void deallocate(void* ptr) - { - auto blk = to_block(ptr); - --blk.metadata.allocated_objects; - if (blk.metadata.allocated_objects == 0) - { - if (blk->metadata.prev != nullptr) - blk->metadata.prev->metadata.next = blk->metadata.next; - if (blk->metadata.next != nullptr) - blk->metadata.next->metadata.prev = blk->metadata.prev; - alloc.deallocate(blk, blk.metadata.size); - } - } - - private: - static inline block* to_block(void* p) - { - return reinterpret_cast(reinterpret_cast(p) & static_cast(~(BLT_2MB_SIZE - 1))); - } - - inline block* allocate_block(blt::size_t bytes) - { - auto size = align_size_to(bytes, BLT_2MB_SIZE); - auto ptr = static_cast(alloc.allocate(size)); - new(ptr) block{size}; - return ptr; - } - - std::atomic head = nullptr; - Alloc alloc; - }; +// template +// class atomic_bump_allocator +// { +// private: +// struct block +// { +// struct block_metadata_t +// { +// const blt::size_t size = 0; +// std::atomic allocated_objects = 0; +// std::atomic next = nullptr; +// std::atomic prev = nullptr; +// std::atomic offset = nullptr; +// } metadata; +// blt::u8 buffer[8]{}; +// +// explicit block(blt::size_t size) +// { +// metadata.size = size; +// metadata.offset = buffer; +// } +// +// [[nodiscard]] blt::ptrdiff_t storage_size() const noexcept +// { +// return static_cast(metadata.size - sizeof(typename block::block_metadata_t)); +// } +// +// [[nodiscard]] blt::ptrdiff_t used_bytes_in_block() const noexcept +// { +// return static_cast(metadata.offset - buffer); +// } +// +// [[nodiscard]] blt::ptrdiff_t remaining_bytes_in_block() const noexcept +// { +// return storage_size() - used_bytes_in_block(); +// } +// }; +// +// public: +// void* allocate(blt::size_t bytes) +// { +// auto head_ptr = head.load(std::memory_order_relaxed); +// auto new_head = head_ptr; +// do +// { +// if (head_ptr->remaining_bytes_in_block() < bytes) +// { +// +// } +// } while (!head.compare_exchange_weak(head_ptr, new_head, std::memory_order_release, std::memory_order_acquire)); +// } +// +// void deallocate(void* ptr) +// { +// auto blk = to_block(ptr); +// --blk.metadata.allocated_objects; +// if (blk.metadata.allocated_objects == 0) +// { +// if (blk->metadata.prev != nullptr) +// blk->metadata.prev->metadata.next = blk->metadata.next; +// if (blk->metadata.next != nullptr) +// blk->metadata.next->metadata.prev = blk->metadata.prev; +// alloc.deallocate(blk, blk.metadata.size); +// } +// } +// +// private: +// static inline block* to_block(void* p) +// { +// return reinterpret_cast(reinterpret_cast(p) & static_cast(~(BLT_2MB_SIZE - 1))); +// } +// +// inline block* allocate_block(blt::size_t bytes) +// { +// auto size = align_size_to(bytes, BLT_2MB_SIZE); +// auto ptr = static_cast(alloc.allocate(size)); +// new(ptr) block{size}; +// return ptr; +// } +// +// std::atomic head = nullptr; +// Alloc alloc; +// }; } diff --git a/libraries/parallel-hashmap b/libraries/parallel-hashmap index 8a889d3..d88c5e1 160000 --- a/libraries/parallel-hashmap +++ b/libraries/parallel-hashmap @@ -1 +1 @@ -Subproject commit 8a889d3699b3c09ade435641fb034427f3fd12b6 +Subproject commit d88c5e15079047777b418132ece5879e7c9aaa2b