summaryrefslogtreecommitdiffhomepage
path: root/compat/borrowed-ptr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'compat/borrowed-ptr.cpp')
-rw-r--r--compat/borrowed-ptr.cpp28
1 files changed, 25 insertions, 3 deletions
diff --git a/compat/borrowed-ptr.cpp b/compat/borrowed-ptr.cpp
index f6f098fa..3048e48a 100644
--- a/compat/borrowed-ptr.cpp
+++ b/compat/borrowed-ptr.cpp
@@ -4,15 +4,37 @@ namespace floormat::detail_bptr {
void control_block::decrement(control_block*& blk) noexcept
{
- auto c = --blk->_count;
+ auto c2 = --blk->_hard_count;
+ fm_bptr_assert(c2 != (uint32_t)-1);
+ if (c2 == 0)
+ {
+ delete blk->_ptr;
+ blk->_ptr = nullptr;
+ }
+
+ auto c = --blk->_soft_count;
fm_bptr_assert(c != (uint32_t)-1);
if (c == 0)
{
- delete blk->_ptr;
+ fm_bptr_assert(!blk->_ptr);
+ delete blk;
+ }
+ blk = nullptr;
+}
+
+void control_block::weak_decrement(control_block*& blk) noexcept
+{
+ if (!blk)
+ return;
+ fm_bptr_assert(blk->_hard_count < blk->_soft_count);
+ auto c = --blk->_soft_count;
+ //fm_bptr_assert(c != (uint32_t)-1);
+ if (c == 0)
+ {
+ fm_bptr_assert(!blk->_ptr);
delete blk;
}
blk = nullptr;
- //blk = (control_block*)-1;
}
} // namespace floormat::detail_bptr