Fixes #19. Add destructor to ConditionBank.
authorMatt Weiss <mdw55189@gmail.com>
Mon, 16 Jan 2017 16:26:10 +0000 (10:26 -0600)
committerMatt Weiss <mdw55189@gmail.com>
Mon, 16 Jan 2017 16:26:10 +0000 (10:26 -0600)
Added a destructor to the ConditionBank class to deallocate the m_pair array.
Valgrind was used to test the shutdown of samples/MallocTest was clean.

Additional changes were needed in MallocTest to register with and update QSBR
so the table migration would be cleaned up.

junction/striped/ConditionBank.cpp
junction/striped/ConditionBank.h
samples/MallocTest/MallocTest.cpp

index 30aec87..5fda216 100644 (file)
@@ -1,6 +1,6 @@
 /*------------------------------------------------------------------------
   Junction: Concurrent data structures in C++
-  Copyright (c) 2016 Jeff Preshing
+  Copyright (c) 2016-2017 Jeff Preshing
 
   Distributed under the Simplified BSD License.
   Original location: https://github.com/preshing/junction
@@ -20,6 +20,13 @@ namespace striped {
 
 ConditionBank DefaultConditionBank;
 
+ConditionBank::~ConditionBank() {
+    m_initSpinLock.lock();
+    ConditionPair* pairs = m_pairs.exchange(nullptr, turf::ConsumeRelease);
+    delete [] pairs;
+    m_initSpinLock.unlock();
+}
+
 ConditionPair* ConditionBank::initialize() {
     m_initSpinLock.lock();
     ConditionPair* pairs = m_pairs.loadNonatomic();
index 2556637..163bc31 100644 (file)
@@ -1,6 +1,6 @@
 /*------------------------------------------------------------------------
   Junction: Concurrent data structures in C++
-  Copyright (c) 2016 Jeff Preshing
+  Copyright (c) 2016-2017 Jeff Preshing
 
   Distributed under the Simplified BSD License.
   Original location: https://github.com/preshing/junction
@@ -36,6 +36,8 @@ private:
     ConditionPair* initialize();
 
 public:
+    ~ConditionBank();
+
     ConditionPair& get(void* ptr) {
         ConditionPair* pairs = m_pairs.load(turf::Consume);
         if (!pairs) {
index c0e18cf..3aba8f0 100644 (file)
@@ -1,6 +1,6 @@
 /*------------------------------------------------------------------------
   Junction: Concurrent data structures in C++
-  Copyright (c) 2016 Jeff Preshing
+  Copyright (c) 2016-2017 Jeff Preshing
 
   Distributed under the Simplified BSD License.
   Original location: https://github.com/preshing/junction
@@ -22,6 +22,8 @@ int main() {
     junction::extra::MapAdapter::ThreadContext context(adapter, 0);
     junction::extra::MapAdapter::Map map(65536);
 
+    context.registerThread();
+
     ureg population = 0;
     for (ureg i = 0; i < 100; i++) {
 #if TURF_USE_DLMALLOC && TURF_DLMALLOC_FAST_STATS
@@ -31,5 +33,8 @@ int main() {
             map.assign(population + 1, (void*) ((population << 2) | 3));
     }
 
+    context.update();
+    context.unregisterThread();
+
     return 0;
 }