Title: [245871] trunk/Source
Revision
245871
Author
[email protected]
Date
2019-05-29 15:07:24 -0700 (Wed, 29 May 2019)

Log Message

IndexedDatabase Server thread in com.apple.WebKit.Networking process leaks objects into an autoreleasePool that's never cleared
<https://webkit.org/b/198346>
<rdar://problem/50895658>

Reviewed by Brent Fulgham.

Source/WebCore:

* Modules/indexeddb/server/IDBServer.cpp:
(WebCore::IDBServer::IDBServer::IDBServer):
- Pass AutodrainedPoolForRunLoop::Use when creating
  CrossThreadTaskHandler to fix the bug.

Source/WTF:

* wtf/CrossThreadTaskHandler.cpp:
(WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
- Add optional second argument to enable use of an
  AutodrainedPool when running the runloop.
(WTF::CrossThreadTaskHandler::taskRunLoop):
- Create an AutodrainedPool if requested when
  CrossThreadTaskHandler was created.
* wtf/CrossThreadTaskHandler.h:
(WTF::CrossThreadTaskHandler::AutodrainedPoolForRunLoop):
- Add enum class for enabling an AutodrainedPool for
  CrossThreadTaskHandler::taskRunLoop().
(WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
- Add optional second argument to enable use of an
  AutodrainedPool when running the runloop.

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (245870 => 245871)


--- trunk/Source/WTF/ChangeLog	2019-05-29 22:04:58 UTC (rev 245870)
+++ trunk/Source/WTF/ChangeLog	2019-05-29 22:07:24 UTC (rev 245871)
@@ -1,3 +1,26 @@
+2019-05-29  David Kilzer  <[email protected]>
+
+        IndexedDatabase Server thread in com.apple.WebKit.Networking process leaks objects into an autoreleasePool that's never cleared
+        <https://webkit.org/b/198346>
+        <rdar://problem/50895658>
+
+        Reviewed by Brent Fulgham.
+
+        * wtf/CrossThreadTaskHandler.cpp:
+        (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
+        - Add optional second argument to enable use of an
+          AutodrainedPool when running the runloop.
+        (WTF::CrossThreadTaskHandler::taskRunLoop):
+        - Create an AutodrainedPool if requested when
+          CrossThreadTaskHandler was created.
+        * wtf/CrossThreadTaskHandler.h:
+        (WTF::CrossThreadTaskHandler::AutodrainedPoolForRunLoop):
+        - Add enum class for enabling an AutodrainedPool for
+          CrossThreadTaskHandler::taskRunLoop().
+        (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
+        - Add optional second argument to enable use of an
+          AutodrainedPool when running the runloop.
+
 2019-05-29  Geoffrey Garen  <[email protected]>
 
         WeakPtr breaks vtables when upcasting to base classes

Modified: trunk/Source/WTF/wtf/CrossThreadTaskHandler.cpp (245870 => 245871)


--- trunk/Source/WTF/wtf/CrossThreadTaskHandler.cpp	2019-05-29 22:04:58 UTC (rev 245870)
+++ trunk/Source/WTF/wtf/CrossThreadTaskHandler.cpp	2019-05-29 22:07:24 UTC (rev 245871)
@@ -26,9 +26,12 @@
 #include "config.h"
 #include <wtf/CrossThreadTaskHandler.h>
 
+#include <wtf/AutodrainedPool.h>
+
 namespace WTF {
 
-CrossThreadTaskHandler::CrossThreadTaskHandler(const char* threadName)
+CrossThreadTaskHandler::CrossThreadTaskHandler(const char* threadName, AutodrainedPoolForRunLoop useAutodrainedPool)
+    : m_useAutodrainedPool(useAutodrainedPool)
 {
     ASSERT(isMainThread());
     Locker<Lock> locker(m_taskThreadCreationLock);
@@ -69,8 +72,12 @@
     }
 
     while (!m_taskQueue.isKilled()) {
-        m_taskQueue.waitForMessage().performTask();
+        {
+            std::unique_ptr<AutodrainedPool> autodrainedPool = (m_useAutodrainedPool == AutodrainedPoolForRunLoop::Use) ? std::make_unique<AutodrainedPool>() : nullptr;
 
+            m_taskQueue.waitForMessage().performTask();
+        }
+
         Locker<Lock> shouldSuspendLocker(m_shouldSuspendLock);
         while (m_shouldSuspend) {
             m_suspendedLock.lock();

Modified: trunk/Source/WTF/wtf/CrossThreadTaskHandler.h (245870 => 245871)


--- trunk/Source/WTF/wtf/CrossThreadTaskHandler.h	2019-05-29 22:04:58 UTC (rev 245870)
+++ trunk/Source/WTF/wtf/CrossThreadTaskHandler.h	2019-05-29 22:07:24 UTC (rev 245871)
@@ -38,9 +38,10 @@
 class CrossThreadTaskHandler {
 public:
     WTF_EXPORT_PRIVATE virtual ~CrossThreadTaskHandler();
+    enum class AutodrainedPoolForRunLoop { DoNotUse, Use };
 
 protected:
-    WTF_EXPORT_PRIVATE CrossThreadTaskHandler(const char* threadName);
+    WTF_EXPORT_PRIVATE CrossThreadTaskHandler(const char* threadName, AutodrainedPoolForRunLoop = AutodrainedPoolForRunLoop::DoNotUse);
 
     WTF_EXPORT_PRIVATE void postTask(CrossThreadTask&&);
     WTF_EXPORT_PRIVATE void postTaskReply(CrossThreadTask&&);
@@ -51,6 +52,8 @@
     void handleTaskRepliesOnMainThread();
     void taskRunLoop();
 
+    AutodrainedPoolForRunLoop m_useAutodrainedPool { AutodrainedPoolForRunLoop::DoNotUse };
+
     Lock m_taskThreadCreationLock;
     Lock m_mainThreadReplyLock;
     bool m_mainThreadReplyScheduled { false };

Modified: trunk/Source/WebCore/ChangeLog (245870 => 245871)


--- trunk/Source/WebCore/ChangeLog	2019-05-29 22:04:58 UTC (rev 245870)
+++ trunk/Source/WebCore/ChangeLog	2019-05-29 22:07:24 UTC (rev 245871)
@@ -1,3 +1,16 @@
+2019-05-29  David Kilzer  <[email protected]>
+
+        IndexedDatabase Server thread in com.apple.WebKit.Networking process leaks objects into an autoreleasePool that's never cleared
+        <https://webkit.org/b/198346>
+        <rdar://problem/50895658>
+
+        Reviewed by Brent Fulgham.
+
+        * Modules/indexeddb/server/IDBServer.cpp:
+        (WebCore::IDBServer::IDBServer::IDBServer):
+        - Pass AutodrainedPoolForRunLoop::Use when creating
+          CrossThreadTaskHandler to fix the bug.
+
 2019-05-29  Geoffrey Garen  <[email protected]>
 
         WeakPtr breaks vtables when upcasting to base classes

Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (245870 => 245871)


--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2019-05-29 22:04:58 UTC (rev 245870)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2019-05-29 22:07:24 UTC (rev 245871)
@@ -57,7 +57,7 @@
 }
 
 IDBServer::IDBServer(PAL::SessionID sessionID, IDBBackingStoreTemporaryFileHandler& fileHandler, QuotaManagerGetter&& quotaManagerGetter)
-    : CrossThreadTaskHandler("IndexedDatabase Server")
+    : CrossThreadTaskHandler("IndexedDatabase Server", AutodrainedPoolForRunLoop::Use)
     , m_sessionID(sessionID)
     , m_backingStoreTemporaryFileHandler(fileHandler)
     , m_quotaManagerGetter(WTFMove(quotaManagerGetter))
@@ -65,7 +65,7 @@
 }
 
 IDBServer::IDBServer(PAL::SessionID sessionID, const String& databaseDirectoryPath, IDBBackingStoreTemporaryFileHandler& fileHandler, QuotaManagerGetter&& quotaManagerGetter)
-    : CrossThreadTaskHandler("IndexedDatabase Server")
+    : CrossThreadTaskHandler("IndexedDatabase Server", AutodrainedPoolForRunLoop::Use)
     , m_sessionID(sessionID)
     , m_databaseDirectoryPath(databaseDirectoryPath)
     , m_backingStoreTemporaryFileHandler(fileHandler)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to