sim: Fix resource leak in BaseGlobalEvent
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>
Tue, 9 Sep 2014 08:36:32 +0000 (04:36 -0400)
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>
Tue, 9 Sep 2014 08:36:32 +0000 (04:36 -0400)
Static analysis revealed that BaseGlobalEvent::barrier was never
deallocated. This changeset solves this leak by making the barrier
allocation a part of the BaseGlobalEvent instead of storing a pointer
to a separate heap-allocated barrier.

src/sim/global_event.cc
src/sim/global_event.hh

index fedee351f534e63d17e7b57b3d8b802f13d97522..f01df51d00fe8c9fc2cbc5c76cf291fdff1ed3af 100644 (file)
@@ -34,9 +34,9 @@
 std::mutex BaseGlobalEvent::globalQMutex;
 
 BaseGlobalEvent::BaseGlobalEvent(Priority p, Flags f)
+    : barrier(numMainEventQueues),
+      barrierEvent(numMainEventQueues, NULL)
 {
-    barrierEvent.resize(numMainEventQueues);
-    barrier = new Barrier(numMainEventQueues);
 }
 
 
index 3a5297e7848c524f6e454777a37d3ad65fe393d0..88981b52aed6f4b066046876fd5091a65e81ea62 100644 (file)
@@ -100,7 +100,7 @@ class BaseGlobalEvent : public EventBase
             // while waiting on the barrier to prevent deadlocks if
             // another thread wants to lock the event queue.
             EventQueue::ScopedRelease release(curEventQueue());
-            return _globalEvent->barrier->wait();
+            return _globalEvent->barrier.wait();
         }
 
       public:
@@ -109,7 +109,7 @@ class BaseGlobalEvent : public EventBase
 
     //! The barrier that all threads wait on before performing the
     //! global event.
-    Barrier *barrier;
+    Barrier barrier;
 
     //! The individual local event instances (one per thread/event queue).
     std::vector<BarrierEvent *> barrierEvent;