summaryrefslogtreecommitdiffstats
path: root/src/cppc4group.cpp
diff options
context:
space:
mode:
authorMarkus Mittendrein <git@maxmitti.tk>2019-04-21 15:23:39 +0200
committerMarkus Mittendrein <git@maxmitti.tk>2019-04-21 15:23:39 +0200
commit69c6e8b4d300f99a31dcb4491557ffa2452bc243 (patch)
treecdcf30069e178c86a1a2ef06ee1fdb37853e5b97 /src/cppc4group.cpp
parente0a9a960f25220bebe74a109dafa079984250fa6 (diff)
downloadcc4group-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.cpp28
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;
}