| 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)
|
|
|