Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Unified Diff: third_party/WebKit/Source/platform/heap/GCTaskRunner.h

Issue 1419513007: Oilpan: Introduce GCTaskRunner (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/heap/GCTaskRunner.h
diff --git a/third_party/WebKit/Source/platform/heap/MessageLoopInterruptor.h b/third_party/WebKit/Source/platform/heap/GCTaskRunner.h
similarity index 60%
rename from third_party/WebKit/Source/platform/heap/MessageLoopInterruptor.h
rename to third_party/WebKit/Source/platform/heap/GCTaskRunner.h
index 67d6d2053f202ab1542c2ab9e1e0b902fe46af73..1e7b904bc49dc88d0ce5b0d020681c591be99247 100644
--- a/third_party/WebKit/Source/platform/heap/MessageLoopInterruptor.h
+++ b/third_party/WebKit/Source/platform/heap/GCTaskRunner.h
@@ -28,16 +28,17 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef MessageLoopInterruptor_h
-#define MessageLoopInterruptor_h
+#ifndef GCTaskRunner_h
+#define GCTaskRunner_h
-#include "platform/heap/BlinkGCInterruptor.h"
+#include "platform/heap/ThreadState.h"
#include "public/platform/WebTaskRunner.h"
+#include "public/platform/WebThread.h"
#include "public/platform/WebTraceLocation.h"
namespace blink {
-class MessageLoopInterruptor : public BlinkGCInterruptor {
+class MessageLoopInterruptor final : public BlinkGCInterruptor {
public:
explicit MessageLoopInterruptor(WebTaskRunner* taskRunner) : m_taskRunner(taskRunner) { }
@@ -45,7 +46,7 @@ public:
{
// GCTask has an empty run() method. Its only purpose is to guarantee
// that MessageLoop will have a task to process which will result
- // in PendingGCRunner::didProcessTask being executed.
+ // in GCTaskRunner::didProcessTask being executed.
m_taskRunner->postTask(BLINK_FROM_HERE, new GCTask);
}
@@ -57,7 +58,7 @@ private:
void run() override
{
// Don't do anything here because we don't know if this is
- // a nested event loop or not. PendingGCRunner::didProcessTask
+ // a nested event loop or not. GCTaskRunner::didProcessTask
// will enter correct safepoint for us.
// We are not calling onInterrupted() because that always
// conservatively enters safepoint with pointers on stack.
@@ -67,6 +68,57 @@ private:
WebTaskRunner* m_taskRunner;
};
+class GCTaskObserver final : public WebThread::TaskObserver {
+public:
+ GCTaskObserver() : m_nesting(0) { }
+
+ ~GCTaskObserver()
+ {
+ // m_nesting can be 1 if this was unregistered in a task and
+ // didProcessTask was not called.
+ ASSERT(!m_nesting || m_nesting == 1);
+ }
+
+ virtual void willProcessTask()
+ {
+ m_nesting++;
+ }
+
+ virtual void didProcessTask()
+ {
+ // In the production code WebKit::initialize is called from inside the
+ // message loop so we can get didProcessTask() without corresponding
+ // willProcessTask once. This is benign.
+ if (m_nesting)
+ m_nesting--;
+
+ ThreadState::current()->safePoint(m_nesting ? BlinkGC::HeapPointersOnStack : BlinkGC::NoHeapPointersOnStack);
+ }
+
+private:
+ int m_nesting;
+};
+
+class GCTaskRunner final {
+public:
+ explicit GCTaskRunner(WebThread* thread)
+ : m_gcTaskObserver(adoptPtr(new GCTaskObserver))
+ , m_thread(thread)
+ {
+ m_thread->addTaskObserver(m_gcTaskObserver.get());
+ ThreadState::current()->addInterruptor(adoptPtr(new MessageLoopInterruptor(thread->taskRunner())));
+ }
+
+ ~GCTaskRunner()
+ {
+ m_thread->removeTaskObserver(m_gcTaskObserver.get());
+ }
+
+private:
+ OwnPtr<GCTaskObserver> m_gcTaskObserver;
+ WebThread* m_thread;
+};
+
} // namespace blink
#endif
« no previous file with comments | « third_party/WebKit/Source/platform/heap/BUILD.gn ('k') | third_party/WebKit/Source/platform/heap/MessageLoopInterruptor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698