diff options
| author | Markus Mittendrein <git@maxmitti.tk> | 2019-04-21 15:23:39 +0200 |
|---|---|---|
| committer | Markus Mittendrein <git@maxmitti.tk> | 2019-04-21 15:23:39 +0200 |
| commit | 69c6e8b4d300f99a31dcb4491557ffa2452bc243 (patch) | |
| tree | cdcf30069e178c86a1a2ef06ee1fdb37853e5b97 /src/cppc4group.cpp | |
| parent | e0a9a960f25220bebe74a109dafa079984250fa6 (diff) | |
| download | cc4group-69c6e8b4d300f99a31dcb4491557ffa2452bc243.tar.gz cc4group-69c6e8b4d300f99a31dcb4491557ffa2452bc243.zip | |
Fix catastrophic logic mistake in cppc4group's custom memory management implementation
Diffstat (limited to 'src/cppc4group.cpp')
| -rw-r--r-- | src/cppc4group.cpp | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/src/cppc4group.cpp b/src/cppc4group.cpp index b3bbd42..04f7cef 100644 --- a/src/cppc4group.cpp +++ b/src/cppc4group.cpp @@ -47,20 +47,23 @@ struct CppC4Group::MemoryManagement::Private { End end; size_t referenceCount; + size_t usageReferenceCount; static void* callStart(void* const data, size_t const size, void* const arg) { - return reinterpret_cast<CustomMemoryManagement*>(arg)->start(data, size); + auto customMemoryManagement = reinterpret_cast<CustomMemoryManagement*>(arg); + customMemoryManagement->referenceUsage(); + return customMemoryManagement->start(data, size); } static void callEndAndCleanup(void* const data, void* const arg) { auto customMemoryManagement = reinterpret_cast<CustomMemoryManagement*>(arg); customMemoryManagement->end(data); - customMemoryManagement->dereference(); + customMemoryManagement->dereferenceUsage(); } - CustomMemoryManagement(Start&& start, End&& end) : realMemoryManagement{callStart, callEndAndCleanup, static_cast<void*>(this)}, start{start}, end{end}, referenceCount{} + CustomMemoryManagement(Start&& start, End&& end) : realMemoryManagement{callStart, callEndAndCleanup, static_cast<void*>(this)}, start{start}, end{end}, referenceCount{}, usageReferenceCount{} { } @@ -72,7 +75,20 @@ struct CppC4Group::MemoryManagement::Private { void dereference() { - if(--referenceCount == 0) + if(--referenceCount == 0 && usageReferenceCount == 0) + { + delete this; + } + } + + void referenceUsage() + { + ++usageReferenceCount; + } + + void dereferenceUsage() + { + if(--usageReferenceCount == 0 && referenceCount == 0) { delete this; } @@ -119,10 +135,6 @@ CppC4Group::MemoryManagement::~MemoryManagement() CppC4Group::MemoryManagement::MemoryManagementStrategy CppC4Group::MemoryManagement::operator()() const { - if(p->customStrategyData != nullptr) - { - p->customStrategyData->reference(); - } return p->strategy; } |
