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