Title: [215818] trunk/Source/WTF
Revision
215818
Author
[email protected]
Date
2017-04-26 11:46:52 -0700 (Wed, 26 Apr 2017)

Log Message

LocklessBag needs a destructor
https://bugs.webkit.org/show_bug.cgi?id=171334

Reviewed by Mark Lam.

Currently, if the bag is destructed any remaining nodes in the bag will
be leaked.

* wtf/LocklessBag.h:
(WTF::LocklessBag::consumeAll):
(WTF::LocklessBag::~LocklessBag):
* wtf/threads/Signals.cpp:
(WTF::jscSignalHandler):
(WTF::installSignalHandler):

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (215817 => 215818)


--- trunk/Source/WTF/ChangeLog	2017-04-26 18:28:01 UTC (rev 215817)
+++ trunk/Source/WTF/ChangeLog	2017-04-26 18:46:52 UTC (rev 215818)
@@ -1,3 +1,20 @@
+2017-04-26  Keith Miller  <[email protected]>
+
+        LocklessBag needs a destructor
+        https://bugs.webkit.org/show_bug.cgi?id=171334
+
+        Reviewed by Mark Lam.
+
+        Currently, if the bag is destructed any remaining nodes in the bag will
+        be leaked.
+
+        * wtf/LocklessBag.h:
+        (WTF::LocklessBag::consumeAll):
+        (WTF::LocklessBag::~LocklessBag):
+        * wtf/threads/Signals.cpp:
+        (WTF::jscSignalHandler):
+        (WTF::installSignalHandler):
+
 2017-04-26  Don Olmstead  <[email protected]>
 
         [ARM] Enable GCC visibility

Modified: trunk/Source/WTF/wtf/LocklessBag.h (215817 => 215818)


--- trunk/Source/WTF/wtf/LocklessBag.h	2017-04-26 18:28:01 UTC (rev 215817)
+++ trunk/Source/WTF/wtf/LocklessBag.h	2017-04-26 18:46:52 UTC (rev 215818)
@@ -81,13 +81,10 @@
     template<typename Functor>
     void consumeAll(const Functor& func)
     {
-        Node* node = m_head.exchange(nullptr);
-        while (node) {
-            func(WTFMove(node->data));
-            Node* oldNode = node;
-            node = node->next;
-            delete oldNode;
-        }
+        consumeAllWithNode([&] (T&& data, Node* node) {
+            func(WTFMove(data));
+            delete node;
+        });
     }
 
     template<typename Functor>
@@ -101,6 +98,11 @@
         }
     }
 
+    ~LocklessBag()
+    {
+        consumeAll([] (T&&) { });
+    }
+
 private:
     Atomic<Node*> m_head;
 };

Modified: trunk/Source/WTF/wtf/threads/Signals.cpp (215817 => 215818)


--- trunk/Source/WTF/wtf/threads/Signals.cpp	2017-04-26 18:28:01 UTC (rev 215817)
+++ trunk/Source/WTF/wtf/threads/Signals.cpp	2017-04-26 18:46:52 UTC (rev 215818)
@@ -34,10 +34,11 @@
 #include <wtf/Atomics.h>
 #include <wtf/DataLog.h>
 #include <wtf/LocklessBag.h>
+#include <wtf/NeverDestroyed.h>
 
 namespace WTF {
 
-static LocklessBag<SignalHandler> handlers[static_cast<size_t>(Signal::NumberOfSignals)] = { };
+static LazyNeverDestroyed<LocklessBag<SignalHandler>> handlers[static_cast<size_t>(Signal::NumberOfSignals)] = { };
 static struct sigaction oldActions[static_cast<size_t>(Signal::NumberOfSignals)];
 static std::once_flag initializeOnceFlags[static_cast<size_t>(Signal::NumberOfSignals)];
 
@@ -63,7 +64,7 @@
 
     bool didHandle = false;
     bool restoreDefaultHandler = false;
-    handlers[static_cast<size_t>(signal)].iterate([&] (const SignalHandler& handler) {
+    handlers[static_cast<size_t>(signal)]->iterate([&] (const SignalHandler& handler) {
         switch (handler(sig, info, mcontext)) {
         case SignalAction::Handled:
             didHandle = true;
@@ -102,9 +103,9 @@
 void installSignalHandler(Signal signal, SignalHandler&& handler)
 {
     ASSERT(signal < Signal::Unknown);
-    handlers[static_cast<size_t>(signal)].add(WTFMove(handler));
+    std::call_once(initializeOnceFlags[static_cast<size_t>(signal)], [&] {
+        handlers[static_cast<size_t>(signal)].construct();
 
-    std::call_once(initializeOnceFlags[static_cast<size_t>(signal)], [&] {
         struct sigaction action;
         action.sa_sigaction = jscSignalHandler;
         auto result = sigfillset(&action.sa_mask);
@@ -113,6 +114,8 @@
         result = sigaction(toSystemSignal(signal), &action, &oldActions[static_cast<size_t>(signal)]);
         RELEASE_ASSERT(!result);
     });
+
+    handlers[static_cast<size_t>(signal)]->add(WTFMove(handler));
 }
 
 } // namespace WTF
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to