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

Unified Diff: Source/core/workers/WorkerThread.cpp

Issue 1128093003: Revert of Schedule garbage collection on worker threads using idle tasks (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 7 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
« no previous file with comments | « Source/core/workers/WorkerThread.h ('k') | Source/core/workers/WorkerThreadTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/workers/WorkerThread.cpp
diff --git a/Source/core/workers/WorkerThread.cpp b/Source/core/workers/WorkerThread.cpp
index 1293544be91344bb4fd1c23e47e37f91d117a970..5842471ba2fab4c37a5111ef05079c1ab08d6367 100644
--- a/Source/core/workers/WorkerThread.cpp
+++ b/Source/core/workers/WorkerThread.cpp
@@ -46,7 +46,6 @@
#include "platform/heap/ThreadState.h"
#include "platform/weborigin/KURL.h"
#include "public/platform/Platform.h"
-#include "public/platform/WebScheduler.h"
#include "public/platform/WebThread.h"
#include "public/platform/WebWaitableEvent.h"
#include "wtf/Noncopyable.h"
@@ -56,7 +55,8 @@
namespace blink {
namespace {
-const double kLongIdlePeriodSecs = 1.0;
+const int64_t kShortIdleHandlerDelayMs = 1000;
+const int64_t kLongIdleHandlerDelayMs = 10*1000;
} // namespace
@@ -267,7 +267,6 @@
, m_terminated(false)
, m_workerLoaderProxy(workerLoaderProxy)
, m_workerReportingProxy(workerReportingProxy)
- , m_webScheduler(nullptr)
, m_startupData(startupData)
, m_isolate(nullptr)
, m_shutdownEvent(adoptPtr(Platform::current()->createWaitableEvent()))
@@ -306,24 +305,6 @@
return 0;
return backingThread().platformThread().threadId();
}
-
-// TODO(alexclarke): Use base::Bind instead of this class when the repo's merge. Unfortunately we
-// can't use WTF::bind because the type-erasure for member function pointers with parameters is broken.
-class WorkerThreadIdleTask : public WebThread::IdleTask {
-public:
- explicit WorkerThreadIdleTask(WorkerThread* thread)
- : m_thread(thread) { }
-
- ~WorkerThreadIdleTask() override { }
-
- void run(double deadlineSeconds) override
- {
- m_thread->performIdleWork(deadlineSeconds);
- }
-
-private:
- RawPtr<WorkerThread> m_thread; // NOT OWNED
-};
void WorkerThread::initialize()
{
@@ -333,7 +314,6 @@
OwnPtr<Vector<char>> cachedMetaData = m_startupData->m_cachedMetaData.release();
V8CacheOptions v8CacheOptions = m_startupData->m_v8CacheOptions;
- m_webScheduler = backingThread().platformThread().scheduler();
{
MutexLocker lock(m_threadStateMutex);
@@ -375,7 +355,7 @@
postInitialize();
- m_webScheduler->postIdleTaskAfterWakeup(FROM_HERE, new WorkerThreadIdleTask(this));
+ postDelayedTask(FROM_HERE, createSameThreadTask(&WorkerThread::idleHandler, this), kShortIdleHandlerDelayMs);
}
void WorkerThread::shutdown()
@@ -494,27 +474,21 @@
return m_started && backingThread().isCurrentThread();
}
-void WorkerThread::performIdleWork(double deadlineSeconds)
-{
- double gcDeadlineSeconds = deadlineSeconds;
-
- // The V8 GC does some GC steps (e.g. compaction) only when the idle notification is ~1s.
- // TODO(rmcilroy): Refactor so extending the deadline like this this isn't needed.
- if (m_webScheduler->canExceedIdleDeadlineIfRequired())
- gcDeadlineSeconds = Platform::current()->monotonicallyIncreasingTime() + kLongIdlePeriodSecs;
-
- if (doIdleGc(gcDeadlineSeconds))
- m_webScheduler->postIdleTaskAfterWakeup(FROM_HERE, new WorkerThreadIdleTask(this));
- else
- m_webScheduler->postIdleTask(FROM_HERE, new WorkerThreadIdleTask(this));
-}
-
-bool WorkerThread::doIdleGc(double deadlineSeconds)
-{
- bool gcFinished = false;
- if (deadlineSeconds > Platform::current()->monotonicallyIncreasingTime())
- gcFinished = isolate()->IdleNotificationDeadline(deadlineSeconds);
- return gcFinished;
+void WorkerThread::idleHandler()
+{
+ ASSERT(m_workerGlobalScope.get());
+ int64_t delay = kLongIdleHandlerDelayMs;
+
+ // Do a script engine idle notification if the next event is distant enough.
+ const double kMinIdleTimespan = 0.3;
+ const double nextFireTime = PlatformThreadData::current().threadTimers().nextFireTime();
+ if (nextFireTime == 0.0 || nextFireTime > currentTime() + kMinIdleTimespan) {
+ bool hasMoreWork = !isolate()->IdleNotificationDeadline(Platform::current()->monotonicallyIncreasingTime() + 1.0);
+ if (hasMoreWork)
+ delay = kShortIdleHandlerDelayMs;
+ }
+
+ postDelayedTask(FROM_HERE, createSameThreadTask(&WorkerThread::idleHandler, this), delay);
}
void WorkerThread::postTask(const WebTraceLocation& location, PassOwnPtr<ExecutionContextTask> task)
« no previous file with comments | « Source/core/workers/WorkerThread.h ('k') | Source/core/workers/WorkerThreadTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698