diff options
46 files changed, 345 insertions, 1264 deletions
@@ -154,16 +154,15 @@ 'resource_update_queue.cc', 'resource_update_queue.h', 'thread.h', + 'thread_impl.h', + 'thread_impl.cc', 'thread_proxy.cc', 'thread_proxy.h', - 'thread_task.h', 'tile_draw_quad.cc', 'tile_draw_quad.h', 'tiled_layer_impl.cc', 'tiled_layer_impl.h', 'time_source.h', - 'timer.cc', - 'timer.h', 'timing_function.cc', 'timing_function.h', 'video_layer_impl.cc', diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp index 1c48219..26fb00a 100644 --- a/cc/cc_tests.gyp +++ b/cc/cc_tests.gyp @@ -39,9 +39,7 @@ 'scrollbar_animation_controller_linear_fade_unittest.cc', 'solid_color_layer_impl_unittest.cc', 'resource_update_controller_unittest.cc', - 'thread_task_unittest.cc', 'tiled_layer_impl_unittest.cc', - 'timer_unittest.cc', 'content_layer_unittest.cc', 'float_quad_unittest.cc', 'layer_unittest.cc', @@ -79,7 +77,6 @@ 'test/test_common.h', 'test/tiled_layer_test_common.cc', 'test/tiled_layer_test_common.h', - 'test/web_compositor_initializer.h', ], }, 'targets': [ @@ -132,13 +129,9 @@ '../third_party/WebKit/Source/WTF/WTF.gyp/WTF.gyp:wtf', '../third_party/WebKit/Source/WebKit/chromium/WebKit.gyp:webkit_wtf_support', '../third_party/WebKit/Source/WebKit/chromium/WebKit.gyp:webkit', - '../webkit/compositor_bindings/compositor_bindings.gyp:webkit_compositor_support', - '../webkit/support/webkit_support.gyp:glue', ], 'sources': [ '<@(cc_tests_support_files)', - 'test/test_webkit_platform.cc', - 'test/test_webkit_platform.h', ], }, ], diff --git a/cc/delay_based_time_source.cc b/cc/delay_based_time_source.cc index d233410..0beb72b 100644 --- a/cc/delay_based_time_source.cc +++ b/cc/delay_based_time_source.cc @@ -11,6 +11,8 @@ #include "base/debug/trace_event.h" #include "base/logging.h" +#include "base/message_loop.h" +#include "cc/thread.h" namespace cc { @@ -40,7 +42,8 @@ DelayBasedTimeSource::DelayBasedTimeSource(base::TimeDelta interval, Thread* thr , m_currentParameters(interval, base::TimeTicks()) , m_nextParameters(interval, base::TimeTicks()) , m_state(STATE_INACTIVE) - , m_timer(thread, this) + , m_thread(thread) + , m_weakFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { } @@ -53,7 +56,7 @@ void DelayBasedTimeSource::setActive(bool active) TRACE_EVENT1("cc", "DelayBasedTimeSource::setActive", "active", active); if (!active) { m_state = STATE_INACTIVE; - m_timer.stop(); + m_weakFactory.InvalidateWeakPtrs(); return; } @@ -65,7 +68,7 @@ void DelayBasedTimeSource::setActive(bool active) // it runs, we use that to establish the timebase, become truly active, and // fire the first tick. m_state = STATE_STARTING; - m_timer.startOneShot(0); + m_thread->postTask(base::Bind(&DelayBasedTimeSource::onTimerFired, m_weakFactory.GetWeakPtr())); return; } @@ -222,7 +225,9 @@ void DelayBasedTimeSource::postNextTickTask(base::TimeTicks now) base::TimeDelta delay = newTickTarget - now; DCHECK(delay.InMillisecondsF() <= m_nextParameters.interval.InMillisecondsF() * (1.0 + doubleTickThreshold)); - m_timer.startOneShot(delay.InSecondsF()); + m_thread->postDelayedTask(base::Bind(&DelayBasedTimeSource::onTimerFired, + m_weakFactory.GetWeakPtr()), + delay.InMilliseconds()); m_nextParameters.tickTarget = newTickTarget; m_currentParameters = m_nextParameters; diff --git a/cc/delay_based_time_source.h b/cc/delay_based_time_source.h index b2944bd..a9229c3 100644 --- a/cc/delay_based_time_source.h +++ b/cc/delay_based_time_source.h @@ -5,18 +5,16 @@ #ifndef CCDelayBasedTimeSource_h #define CCDelayBasedTimeSource_h +#include "base/memory/weak_ptr.h" #include "cc/time_source.h" -#include "cc/timer.h" namespace cc { -class Thread; - // This timer implements a time source that achieves the specified interval // in face of millisecond-precision delayed callbacks and random queueing delays. -class DelayBasedTimeSource : public TimeSource, TimerClient { +class DelayBasedTimeSource : public TimeSource { public: - static scoped_refptr<DelayBasedTimeSource> create(base::TimeDelta interval, Thread*); + static scoped_refptr<DelayBasedTimeSource> create(base::TimeDelta interval, Thread* thread); virtual void setClient(TimeSourceClient* client) OVERRIDE; @@ -31,18 +29,17 @@ public: virtual base::TimeTicks lastTickTime() OVERRIDE; virtual base::TimeTicks nextTickTime() OVERRIDE; - // TimerClient implementation. - virtual void onTimerFired() OVERRIDE; // Virtual for testing. virtual base::TimeTicks now() const; protected: - DelayBasedTimeSource(base::TimeDelta interval, Thread*); + DelayBasedTimeSource(base::TimeDelta interval, Thread* thread); virtual ~DelayBasedTimeSource(); base::TimeTicks nextTickTarget(base::TimeTicks now); void postNextTickTask(base::TimeTicks now); + void onTimerFired(); enum State { STATE_INACTIVE, @@ -70,8 +67,10 @@ protected: Parameters m_nextParameters; State m_state; + Thread* m_thread; - Timer m_timer; + base::WeakPtrFactory<DelayBasedTimeSource> m_weakFactory; + DISALLOW_COPY_AND_ASSIGN(DelayBasedTimeSource); }; } // namespace cc diff --git a/cc/frame_rate_controller.cc b/cc/frame_rate_controller.cc index 46000fc..97e4a02e 100644 --- a/cc/frame_rate_controller.cc +++ b/cc/frame_rate_controller.cc @@ -10,6 +10,7 @@ #include "base/logging.h" #include "cc/delay_based_time_source.h" #include "cc/time_source.h" +#include "cc/thread.h" namespace { @@ -47,6 +48,8 @@ FrameRateController::FrameRateController(scoped_refptr<TimeSource> timer) , m_active(false) , m_swapBuffersCompleteSupported(true) , m_isTimeSourceThrottling(true) + , m_thread(0) + , m_weakFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { m_timeSourceClientAdapter = FrameRateControllerTimeSourceAdapter::create(this); m_timeSource->setClient(m_timeSourceClientAdapter.get()); @@ -59,7 +62,8 @@ FrameRateController::FrameRateController(Thread* thread) , m_active(false) , m_swapBuffersCompleteSupported(true) , m_isTimeSourceThrottling(false) - , m_manualTicker(new Timer(thread, this)) + , m_thread(thread) + , m_weakFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { } @@ -82,7 +86,7 @@ void FrameRateController::setActive(bool active) if (active) postManualTick(); else - m_manualTicker->stop(); + m_weakFactory.InvalidateWeakPtrs(); } } @@ -120,10 +124,10 @@ void FrameRateController::onTimerTick() void FrameRateController::postManualTick() { if (m_active) - m_manualTicker->startOneShot(0); + m_thread->postTask(base::Bind(&FrameRateController::manualTick, m_weakFactory.GetWeakPtr())); } -void FrameRateController::onTimerFired() +void FrameRateController::manualTick() { onTimerTick(); } diff --git a/cc/frame_rate_controller.h b/cc/frame_rate_controller.h index d13936d..231ddda 100644 --- a/cc/frame_rate_controller.h +++ b/cc/frame_rate_controller.h @@ -7,8 +7,8 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" #include "base/time.h" -#include "cc/timer.h" namespace cc { @@ -26,7 +26,7 @@ protected: class FrameRateControllerTimeSourceAdapter; -class FrameRateController : public TimerClient { +class FrameRateController { public: explicit FrameRateController(scoped_refptr<TimeSource>); // Alternate form of FrameRateController with unthrottled frame-rate. @@ -59,9 +59,7 @@ protected: void onTimerTick(); void postManualTick(); - - // TimerClient implementation (used for unthrottled frame-rate). - virtual void onTimerFired() OVERRIDE; + void manualTick(); FrameRateControllerClient* m_client; int m_numFramesPending; @@ -73,7 +71,10 @@ protected: // Members for unthrottled frame-rate. bool m_isTimeSourceThrottling; - scoped_ptr<Timer> m_manualTicker; + base::WeakPtrFactory<FrameRateController> m_weakFactory; + Thread* m_thread; + + DISALLOW_COPY_AND_ASSIGN(FrameRateController); }; } // namespace cc diff --git a/cc/gl_renderer_unittest.cc b/cc/gl_renderer_unittest.cc index f88ba6c..01b1d51 100644 --- a/cc/gl_renderer_unittest.cc +++ b/cc/gl_renderer_unittest.cc @@ -13,7 +13,6 @@ #include "cc/test/fake_web_compositor_output_surface.h" #include "cc/test/fake_web_graphics_context_3d.h" #include "cc/test/test_common.h" -#include "cc/test/web_compositor_initializer.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/khronos/GLES2/gl2.h" @@ -114,7 +113,6 @@ protected: GLRendererTest() : m_suggestHaveBackbufferYes(1, true) , m_suggestHaveBackbufferNo(1, false) - , m_compositorInitializer(0) , m_context(FakeWebCompositorOutputSurface::create(scoped_ptr<WebKit::WebGraphicsContext3D>(new FrameCountingMemoryAllocationSettingContext()))) , m_resourceProvider(ResourceProvider::create(m_context.get())) , m_renderer(&m_mockClient, m_resourceProvider.get()) @@ -136,7 +134,6 @@ protected: WebGraphicsMemoryAllocation m_suggestHaveBackbufferYes; WebGraphicsMemoryAllocation m_suggestHaveBackbufferNo; - WebCompositorInitializer m_compositorInitializer; scoped_ptr<GraphicsContext> m_context; FakeRendererClient m_mockClient; scoped_ptr<ResourceProvider> m_resourceProvider; diff --git a/cc/layer_tree_host_impl.cc b/cc/layer_tree_host_impl.cc index 289c5c7..581377e 100644 --- a/cc/layer_tree_host_impl.cc +++ b/cc/layer_tree_host_impl.cc @@ -169,11 +169,6 @@ public: virtual void onTimerTick() OVERRIDE { - // FIXME: We require that animate be called on the impl thread. This - // avoids asserts in single threaded mode. Ideally background ticking - // would be handled by the proxy/scheduler and this could be removed. - DebugScopedSetImplThread impl; - m_layerTreeHostImpl->animate(base::TimeTicks::Now(), base::Time::Now()); } diff --git a/cc/layer_tree_host_unittest.cc b/cc/layer_tree_host_unittest.cc index f91cec6..fa45580 100644 --- a/cc/layer_tree_host_unittest.cc +++ b/cc/layer_tree_host_unittest.cc @@ -22,7 +22,6 @@ #include "testing/gmock/include/gmock/gmock.h" #include "third_party/khronos/GLES2/gl2.h" #include "third_party/khronos/GLES2/gl2ext.h" -#include <public/Platform.h> #include <public/WebLayerScrollClient.h> #include <public/WebSize.h> @@ -1046,7 +1045,7 @@ public: // We request animation only once. if (!m_animationRequested) { - m_mainThreadProxy->postTask(createThreadTask(this, &LayerTreeHostTestStartPageScaleAnimation::requestStartPageScaleAnimation)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&LayerTreeHostTestStartPageScaleAnimation::requestStartPageScaleAnimation, base::Unretained(this))); m_animationRequested = true; } } @@ -2720,24 +2719,17 @@ public: postSetNeedsCommitToMainThread(); } - class EvictTexturesTask : public WebKit::WebThread::Task { - public: - EvictTexturesTask(LayerTreeHostTestEvictTextures* test) : m_test(test) { } - virtual ~EvictTexturesTask() { } - virtual void run() OVERRIDE - { - DCHECK(m_test->m_implForEvictTextures); - m_test->m_implForEvictTextures->enforceManagedMemoryPolicy(ManagedMemoryPolicy(0)); - } - - private: - LayerTreeHostTestEvictTextures* m_test; - }; - void postEvictTextures() { - DCHECK(webThread()); - webThread()->postTask(new EvictTexturesTask(this)); + DCHECK(implThread()); + implThread()->postTask(base::Bind(&LayerTreeHostTestEvictTextures::evictTexturesOnImplThread, + base::Unretained(this))); + } + + void evictTexturesOnImplThread() + { + DCHECK(m_implForEvictTextures); + m_implForEvictTextures->enforceManagedMemoryPolicy(ManagedMemoryPolicy(0)); } // Commit 1: Just commit and draw normally, then post an eviction at the end @@ -2860,24 +2852,12 @@ public: postSetNeedsCommitToMainThread(); } - class EvictTexturesTask : public WebKit::WebThread::Task { - public: - EvictTexturesTask(LayerTreeHostTestLostContextAfterEvictTextures* test) : m_test(test) { } - virtual ~EvictTexturesTask() { } - virtual void run() OVERRIDE - { - m_test->evictTexturesOnImplThread(); - } - - private: - LayerTreeHostTestLostContextAfterEvictTextures* m_test; - }; - void postEvictTextures() { - if (webThread()) - webThread()->postTask(new EvictTexturesTask(this)); - else { + if (implThread()) { + implThread()->postTask(base::Bind(&LayerTreeHostTestLostContextAfterEvictTextures::evictTexturesOnImplThread, + base::Unretained(this))); + } else { DebugScopedSetImplThread impl; evictTexturesOnImplThread(); } diff --git a/cc/layer_unittest.cc b/cc/layer_unittest.cc index 60a0539..33f37e7 100644 --- a/cc/layer_unittest.cc +++ b/cc/layer_unittest.cc @@ -15,7 +15,6 @@ #include "cc/test/fake_layer_tree_host_client.h" #include "cc/test/geometry_test_utils.h" #include "cc/test/test_common.h" -#include "cc/test/web_compositor_initializer.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include <public/WebTransformationMatrix.h> @@ -59,7 +58,6 @@ public: class LayerTest : public testing::Test { public: LayerTest() - : m_compositorInitializer(0) { } @@ -135,7 +133,6 @@ protected: scoped_ptr<MockLayerImplTreeHost> m_layerTreeHost; scoped_refptr<Layer> m_parent, m_child1, m_child2, m_child3, m_grandChild1, m_grandChild2, m_grandChild3; - WebCompositorInitializer m_compositorInitializer; }; TEST_F(LayerTest, basicCreateAndDestroy) @@ -638,7 +635,6 @@ void assertLayerTreeHostMatchesForSubtree(Layer* layer, LayerTreeHost* host) TEST(LayerLayerTreeHostTest, enteringTree) { - WebCompositorInitializer compositorInitializer(0); scoped_refptr<Layer> parent = Layer::create(); scoped_refptr<Layer> child = Layer::create(); scoped_refptr<Layer> mask = Layer::create(); @@ -667,7 +663,6 @@ TEST(LayerLayerTreeHostTest, enteringTree) TEST(LayerLayerTreeHostTest, addingLayerSubtree) { - WebCompositorInitializer compositorInitializer(0); scoped_refptr<Layer> parent = Layer::create(); scoped_ptr<FakeLayerImplTreeHost> layerTreeHost(FakeLayerImplTreeHost::create()); @@ -696,7 +691,6 @@ TEST(LayerLayerTreeHostTest, addingLayerSubtree) TEST(LayerLayerTreeHostTest, changeHost) { - WebCompositorInitializer compositorInitializer(0); scoped_refptr<Layer> parent = Layer::create(); scoped_refptr<Layer> child = Layer::create(); scoped_refptr<Layer> mask = Layer::create(); @@ -726,7 +720,6 @@ TEST(LayerLayerTreeHostTest, changeHost) TEST(LayerLayerTreeHostTest, changeHostInSubtree) { - WebCompositorInitializer compositorInitializer(0); scoped_refptr<Layer> firstParent = Layer::create(); scoped_refptr<Layer> firstChild = Layer::create(); scoped_refptr<Layer> secondParent = Layer::create(); @@ -760,7 +753,6 @@ TEST(LayerLayerTreeHostTest, changeHostInSubtree) TEST(LayerLayerTreeHostTest, replaceMaskAndReplicaLayer) { - WebCompositorInitializer compositorInitializer(0); scoped_refptr<Layer> parent = Layer::create(); scoped_refptr<Layer> mask = Layer::create(); scoped_refptr<Layer> replica = Layer::create(); @@ -795,7 +787,6 @@ TEST(LayerLayerTreeHostTest, replaceMaskAndReplicaLayer) TEST(LayerLayerTreeHostTest, destroyHostWithNonNullRootLayer) { - WebCompositorInitializer compositorInitializer(0); scoped_refptr<Layer> root = Layer::create(); scoped_refptr<Layer> child = Layer::create(); root->addChild(child); @@ -823,7 +814,6 @@ TEST(LayerLayerTreeHostTest, shouldNotAddAnimationWithoutLayerTreeHost) ScopedSettings scopedSettings; Settings::setAcceleratedAnimationEnabled(true); - WebCompositorInitializer compositorInitializer(0); scoped_refptr<Layer> layer = Layer::create(); // Case 1: without a layerTreeHost, the animation should not be accepted. diff --git a/cc/prioritized_texture_unittest.cc b/cc/prioritized_texture_unittest.cc index 3bf0f42..50d0356 100644 --- a/cc/prioritized_texture_unittest.cc +++ b/cc/prioritized_texture_unittest.cc @@ -10,7 +10,6 @@ #include "cc/single_thread_proxy.h" // For DebugScopedSetImplThread #include "cc/test/fake_graphics_context.h" #include "cc/test/tiled_layer_test_common.h" -#include "cc/test/web_compositor_initializer.h" #include "cc/texture.h" #include "testing/gtest/include/gtest/gtest.h" @@ -24,7 +23,6 @@ public: PrioritizedTextureTest() : m_textureSize(256, 256) , m_textureFormat(GL_RGBA) - , m_compositorInitializer(0) , m_context(WebKit::createFakeGraphicsContext()) { DebugScopedSetImplThread implThread; @@ -93,7 +91,6 @@ public: protected: const IntSize m_textureSize; const GLenum m_textureFormat; - WebCompositorInitializer m_compositorInitializer; scoped_ptr<GraphicsContext> m_context; scoped_ptr<ResourceProvider> m_resourceProvider; }; diff --git a/cc/proxy.cc b/cc/proxy.cc index 317499c37..7b738aa 100644 --- a/cc/proxy.cc +++ b/cc/proxy.cc @@ -6,7 +6,7 @@ #include "cc/proxy.h" -#include "cc/thread_task.h" +#include "cc/thread.h" namespace cc { @@ -14,7 +14,6 @@ namespace { #ifndef NDEBUG bool implThreadIsOverridden = false; bool s_isMainThreadBlocked = false; -base::PlatformThreadId threadIDOverridenToBeImplThread; #endif Thread* s_mainThread = 0; Thread* s_implThread = 0; @@ -47,10 +46,9 @@ Thread* Proxy::implThread() Thread* Proxy::currentThread() { - base::PlatformThreadId currentThreadIdentifier = base::PlatformThread::CurrentId(); - if (s_mainThread && s_mainThread->threadID() == currentThreadIdentifier) + if (s_mainThread && s_mainThread->belongsToCurrentThread()) return s_mainThread; - if (s_implThread && s_implThread->threadID() == currentThreadIdentifier) + if (s_implThread && s_implThread->belongsToCurrentThread()) return s_implThread; return 0; } @@ -59,9 +57,9 @@ bool Proxy::isMainThread() { #ifndef NDEBUG DCHECK(s_mainThread); - if (implThreadIsOverridden && base::PlatformThread::CurrentId() == threadIDOverridenToBeImplThread) + if (implThreadIsOverridden) return false; - return base::PlatformThread::CurrentId() == s_mainThread->threadID(); + return s_mainThread->belongsToCurrentThread(); #else return true; #endif @@ -70,10 +68,9 @@ bool Proxy::isMainThread() bool Proxy::isImplThread() { #ifndef NDEBUG - base::PlatformThreadId implThreadID = s_implThread ? s_implThread->threadID() : 0; - if (implThreadIsOverridden && base::PlatformThread::CurrentId() == threadIDOverridenToBeImplThread) + if (implThreadIsOverridden) return true; - return base::PlatformThread::CurrentId() == implThreadID; + return s_implThread && s_implThread->belongsToCurrentThread(); #else return true; #endif @@ -83,8 +80,6 @@ bool Proxy::isImplThread() void Proxy::setCurrentThreadIsImplThread(bool isImplThread) { implThreadIsOverridden = isImplThread; - if (isImplThread) - threadIDOverridenToBeImplThread = base::PlatformThread::CurrentId(); } #endif diff --git a/cc/rate_limiter.cc b/cc/rate_limiter.cc index 5d9cf81..fab541e 100644 --- a/cc/rate_limiter.cc +++ b/cc/rate_limiter.cc @@ -13,29 +13,6 @@ namespace cc { -class RateLimiter::Task : public Thread::Task { -public: - static PassOwnPtr<Task> create(RateLimiter* rateLimiter) - { - return adoptPtr(new Task(rateLimiter)); - } - virtual ~Task() { } - -private: - explicit Task(RateLimiter* rateLimiter) - : Thread::Task(this) - , m_rateLimiter(rateLimiter) - { - } - - virtual void performTask() OVERRIDE - { - m_rateLimiter->rateLimitContext(); - } - - scoped_refptr<RateLimiter> m_rateLimiter; -}; - scoped_refptr<RateLimiter> RateLimiter::create(WebKit::WebGraphicsContext3D* context, RateLimiterClient *client) { return make_scoped_refptr(new RateLimiter(context, client)); @@ -60,7 +37,7 @@ void RateLimiter::start() TRACE_EVENT0("cc", "RateLimiter::start"); m_active = true; - Proxy::mainThread()->postTask(RateLimiter::Task::create(this)); + Proxy::mainThread()->postTask(base::Bind(&RateLimiter::rateLimitContext, this)); } void RateLimiter::stop() diff --git a/cc/resource_update_controller.cc b/cc/resource_update_controller.cc index 498f884..b3133c9 100644 --- a/cc/resource_update_controller.cc +++ b/cc/resource_update_controller.cc @@ -11,6 +11,7 @@ #include "cc/proxy.h" #include "cc/resource_provider.h" #include "cc/texture_copier.h" +#include "cc/thread.h" #include "third_party/khronos/GLES2/gl2.h" #include "third_party/skia/include/gpu/SkGpuDevice.h" #include <limits> @@ -71,11 +72,13 @@ size_t ResourceUpdateController::maxFullUpdatesPerTick( ResourceUpdateController::ResourceUpdateController(ResourceUpdateControllerClient* client, Thread* thread, scoped_ptr<ResourceUpdateQueue> queue, ResourceProvider* resourceProvider) : m_client(client) - , m_timer(new Timer(thread, this)) , m_queue(queue.Pass()) , m_resourceProvider(resourceProvider) , m_textureUpdatesPerTick(maxFullUpdatesPerTick(resourceProvider)) , m_firstUpdateAttempt(true) + , m_thread(thread) + , m_weakFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this)) + , m_taskPosted(false) { } @@ -89,7 +92,7 @@ void ResourceUpdateController::performMoreUpdates( m_timeLimit = timeLimit; // Update already in progress. - if (m_timer->isActive()) + if (m_taskPosted) return; // Call updateMoreTexturesNow() directly unless it's the first update @@ -98,8 +101,11 @@ void ResourceUpdateController::performMoreUpdates( if (m_firstUpdateAttempt) { // Post a 0-delay task when no updates were left. When it runs, // readyToFinalizeTextureUpdates() will be called. - if (!updateMoreTexturesIfEnoughTimeRemaining()) - m_timer->startOneShot(0); + if (!updateMoreTexturesIfEnoughTimeRemaining()) { + m_taskPosted = true; + m_thread->postTask(base::Bind(&ResourceUpdateController::onTimerFired, + m_weakFactory.GetWeakPtr())); + } m_firstUpdateAttempt = false; } else @@ -222,6 +228,7 @@ void ResourceUpdateController::finalize() void ResourceUpdateController::onTimerFired() { + m_taskPosted = false; ResourceProvider::debugNotifyEnterZone(0xB000000); if (!updateMoreTexturesIfEnoughTimeRemaining()) m_client->readyToFinalizeTextureUpdates(); @@ -254,7 +261,10 @@ bool ResourceUpdateController::updateMoreTexturesIfEnoughTimeRemaining() // time estimate. We use a different timeout here to prevent unnecessary // amounts of idle time when blocking uploads have reached the max. if (m_resourceProvider->numBlockingUploads() >= maxBlockingUpdates()) { - m_timer->startOneShot(uploaderBusyTickRate); + m_taskPosted = true; + m_thread->postDelayedTask(base::Bind(&ResourceUpdateController::onTimerFired, + m_weakFactory.GetWeakPtr()), + uploaderBusyTickRate * 1000); return true; } @@ -273,9 +283,10 @@ void ResourceUpdateController::updateMoreTexturesNow() { size_t uploads = std::min( m_queue->fullUploadSize(), updateMoreTexturesSize()); - m_timer->startOneShot( - updateMoreTexturesTime().InSecondsF() / updateMoreTexturesSize() * - uploads); + m_taskPosted = true; + m_thread->postDelayedTask(base::Bind(&ResourceUpdateController::onTimerFired, + m_weakFactory.GetWeakPtr()), + updateMoreTexturesTime().InSecondsF() / updateMoreTexturesSize() * uploads * 1000); if (!uploads) return; diff --git a/cc/resource_update_controller.h b/cc/resource_update_controller.h index a77c93b..7405149 100644 --- a/cc/resource_update_controller.h +++ b/cc/resource_update_controller.h @@ -7,13 +7,14 @@ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" #include "base/time.h" #include "cc/resource_update_queue.h" -#include "cc/timer.h" namespace cc { class ResourceProvider; +class Thread; class ResourceUpdateControllerClient { public: @@ -23,7 +24,7 @@ protected: virtual ~ResourceUpdateControllerClient() { } }; -class ResourceUpdateController : public TimerClient { +class ResourceUpdateController { public: static scoped_ptr<ResourceUpdateController> create(ResourceUpdateControllerClient* client, Thread* thread, scoped_ptr<ResourceUpdateQueue> queue, ResourceProvider* resourceProvider) { @@ -39,8 +40,6 @@ public: void performMoreUpdates(base::TimeTicks timeLimit); void finalize(); - // TimerClient implementation. - virtual void onTimerFired() OVERRIDE; // Virtual for testing. virtual base::TimeTicks now() const; @@ -50,6 +49,7 @@ public: protected: ResourceUpdateController(ResourceUpdateControllerClient*, Thread*, scoped_ptr<ResourceUpdateQueue>, ResourceProvider*); +private: static size_t maxFullUpdatesPerTick(ResourceProvider*); size_t maxBlockingUpdates() const; @@ -59,17 +59,19 @@ protected: // This returns true when there were textures left to update. bool updateMoreTexturesIfEnoughTimeRemaining(); void updateMoreTexturesNow(); + void onTimerFired(); ResourceUpdateControllerClient* m_client; - scoped_ptr<Timer> m_timer; scoped_ptr<ResourceUpdateQueue> m_queue; bool m_contentsTexturesPurged; ResourceProvider* m_resourceProvider; base::TimeTicks m_timeLimit; size_t m_textureUpdatesPerTick; bool m_firstUpdateAttempt; + Thread* m_thread; + base::WeakPtrFactory<ResourceUpdateController> m_weakFactory; + bool m_taskPosted; -private: DISALLOW_COPY_AND_ASSIGN(ResourceUpdateController); }; diff --git a/cc/resource_update_controller_unittest.cc b/cc/resource_update_controller_unittest.cc index 850581a..ca3c3b8 100644 --- a/cc/resource_update_controller_unittest.cc +++ b/cc/resource_update_controller_unittest.cc @@ -11,7 +11,6 @@ #include "cc/test/fake_web_graphics_context_3d.h" #include "cc/test/scheduler_test_common.h" #include "cc/test/tiled_layer_test_common.h" -#include "cc/test/web_compositor_initializer.h" #include "testing/gtest/include/gtest/gtest.h" #include <public/WebThread.h> @@ -66,7 +65,6 @@ public: ResourceUpdateControllerTest() : m_queue(make_scoped_ptr(new ResourceUpdateQueue)) , m_textureManager(PrioritizedTextureManager::create(60*1024*1024, 1024, Renderer::ContentPool)) - , m_compositorInitializer(m_thread.get()) , m_fullUploadCountExpected(0) , m_partialCountExpected(0) , m_totalUploadCountExpected(0) @@ -188,7 +186,6 @@ protected: scoped_ptr<ResourceUpdateQueue> m_queue; scoped_ptr<PrioritizedTexture> m_textures[4]; scoped_ptr<WebThread> m_thread; - WebCompositorInitializer m_compositorInitializer; scoped_ptr<PrioritizedTextureManager> m_textureManager; SkBitmap m_bitmap; diff --git a/cc/scoped_thread_proxy.cc b/cc/scoped_thread_proxy.cc index a181270..9391e3b 100644 --- a/cc/scoped_thread_proxy.cc +++ b/cc/scoped_thread_proxy.cc @@ -6,9 +6,11 @@ #include "cc/scoped_thread_proxy.h" +#include "base/bind.h" + namespace cc { -ScopedThreadProxy::ScopedThreadProxy(Thread* targetThread) +ScopedThreadProxy::ScopedThreadProxy(cc::Thread* targetThread) : m_targetThread(targetThread) , m_shutdown(false) { @@ -18,4 +20,27 @@ ScopedThreadProxy::~ScopedThreadProxy() { } +void ScopedThreadProxy::postTask(const tracked_objects::Location& location, base::Closure cb) +{ + m_targetThread->postTask(base::Bind(&ScopedThreadProxy::runTaskIfNotShutdown, this, cb)); +} + +void ScopedThreadProxy::shutdown() +{ + DCHECK(m_targetThread->belongsToCurrentThread()); + DCHECK(!m_shutdown); + m_shutdown = true; +} + +void ScopedThreadProxy::runTaskIfNotShutdown(base::Closure cb) +{ + // If our shutdown flag is set, it's possible that m_targetThread has already been destroyed so don't + // touch it. + if (m_shutdown) { + return; + } + DCHECK(m_targetThread->belongsToCurrentThread()); + cb.Run(); +} + } diff --git a/cc/scoped_thread_proxy.h b/cc/scoped_thread_proxy.h index 023eaba..b48f276 100644 --- a/cc/scoped_thread_proxy.h +++ b/cc/scoped_thread_proxy.h @@ -5,12 +5,11 @@ #ifndef CCScopedThreadProxy_h #define CCScopedThreadProxy_h -#include "base/logging.h" #include "base/memory/ref_counted.h" -#include "base/threading/platform_thread.h" -#include "cc/thread_task.h" -#include <wtf/OwnPtr.h> -#include <wtf/PassOwnPtr.h> +#include "base/callback.h" +#include "cc/thread.h" +#include "base/location.h" +#include "base/logging.h" namespace cc { @@ -26,49 +25,26 @@ namespace cc { // list of outstanding tasks. class ScopedThreadProxy : public base::RefCountedThreadSafe<ScopedThreadProxy> { public: - static scoped_refptr<ScopedThreadProxy> create(Thread* targetThread) + static scoped_refptr<ScopedThreadProxy> create(cc::Thread* targetThread) { - DCHECK(base::PlatformThread::CurrentId() == targetThread->threadID()); + DCHECK(targetThread->belongsToCurrentThread()); return make_scoped_refptr(new ScopedThreadProxy(targetThread)); } - // Can be called from any thread. Posts a task to the target thread that runs unless // shutdown() is called before it runs. - void postTask(PassOwnPtr<Thread::Task> task) - { - AddRef(); - m_targetThread->postTask(createThreadTask(this, &ScopedThreadProxy::runTaskIfNotShutdown, task)); - } + void postTask(const tracked_objects::Location& location, base::Closure cb); - void shutdown() - { - DCHECK(base::PlatformThread::CurrentId() == m_targetThread->threadID()); - DCHECK(!m_shutdown); - m_shutdown = true; - } + void shutdown(); private: + explicit ScopedThreadProxy(cc::Thread* targetThread); friend class base::RefCountedThreadSafe<ScopedThreadProxy>; ~ScopedThreadProxy(); - explicit ScopedThreadProxy(Thread* targetThread); - - void runTaskIfNotShutdown(PassOwnPtr<Thread::Task> popTask) - { - OwnPtr<Thread::Task> task = popTask; - // If our shutdown flag is set, it's possible that m_targetThread has already been destroyed so don't - // touch it. - if (m_shutdown) { - Release(); - return; - } - DCHECK(base::PlatformThread::CurrentId() == m_targetThread->threadID()); - task->performTask(); - Release(); - } + void runTaskIfNotShutdown(base::Closure cb); - Thread* m_targetThread; + cc::Thread* m_targetThread; bool m_shutdown; // Only accessed on the target thread }; diff --git a/cc/single_thread_proxy.cc b/cc/single_thread_proxy.cc index 0cfecccc..6c63c3d 100644 --- a/cc/single_thread_proxy.cc +++ b/cc/single_thread_proxy.cc @@ -11,7 +11,6 @@ #include "cc/graphics_context.h" #include "cc/layer_tree_host.h" #include "cc/resource_update_controller.h" -#include "cc/timer.h" namespace cc { diff --git a/cc/test/layer_tree_test_common.cc b/cc/test/layer_tree_test_common.cc index 0d77c67..da3f430 100644 --- a/cc/test/layer_tree_test_common.cc +++ b/cc/test/layer_tree_test_common.cc @@ -17,17 +17,15 @@ #include "cc/scoped_thread_proxy.h" #include "cc/settings.h" #include "cc/single_thread_proxy.h" +#include "cc/thread_impl.h" #include "cc/test/animation_test_common.h" #include "cc/test/fake_web_compositor_output_surface.h" #include "cc/test/fake_web_graphics_context_3d.h" #include "cc/test/occlusion_tracker_test_common.h" #include "cc/test/test_common.h" #include "cc/test/tiled_layer_test_common.h" -#include "cc/thread_task.h" #include "cc/timing_function.h" #include "testing/gmock/include/gmock/gmock.h" -#include <public/Platform.h> -#include <public/WebCompositorSupport.h> #include <public/WebFilterOperation.h> #include <public/WebFilterOperations.h> #include <public/WebThread.h> @@ -270,50 +268,6 @@ private: TestHooks* m_testHooks; }; -class TimeoutTask : public WebThread::Task { -public: - explicit TimeoutTask(ThreadedTest* test) - : m_test(test) - { - } - - void clearTest() - { - m_test = 0; - } - - virtual ~TimeoutTask() - { - if (m_test) - m_test->clearTimeout(); - } - - virtual void run() - { - if (m_test) - m_test->timeout(); - } - -private: - ThreadedTest* m_test; -}; - -class BeginTask : public WebThread::Task { -public: - explicit BeginTask(ThreadedTest* test) - : m_test(test) - { - } - - virtual ~BeginTask() { } - virtual void run() - { - m_test->doBeginTest(); - } -private: - ThreadedTest* m_test; -}; - ThreadedTest::ThreadedTest() : m_beginning(false) , m_endWhenBeginReturns(false) @@ -337,57 +291,57 @@ void ThreadedTest::endTest() if (m_beginning) m_endWhenBeginReturns = true; else - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadedTest::realEndTest)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::realEndTest, base::Unretained(this))); } void ThreadedTest::endTestAfterDelay(int delayMilliseconds) { - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadedTest::endTest)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::endTest, base::Unretained(this))); } void ThreadedTest::postSetNeedsAnimateToMainThread() { - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadedTest::dispatchSetNeedsAnimate)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchSetNeedsAnimate, base::Unretained(this))); } void ThreadedTest::postAddAnimationToMainThread(Layer* layerToReceiveAnimation) { - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadedTest::dispatchAddAnimation, layerToReceiveAnimation)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchAddAnimation, base::Unretained(this), base::Unretained(layerToReceiveAnimation))); } void ThreadedTest::postAddInstantAnimationToMainThread() { - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadedTest::dispatchAddInstantAnimation)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchAddInstantAnimation, base::Unretained(this))); } void ThreadedTest::postSetNeedsCommitToMainThread() { - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadedTest::dispatchSetNeedsCommit)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchSetNeedsCommit, base::Unretained(this))); } void ThreadedTest::postAcquireLayerTextures() { - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadedTest::dispatchAcquireLayerTextures)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchAcquireLayerTextures, base::Unretained(this))); } void ThreadedTest::postSetNeedsRedrawToMainThread() { - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadedTest::dispatchSetNeedsRedraw)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchSetNeedsRedraw, base::Unretained(this))); } void ThreadedTest::postSetNeedsAnimateAndCommitToMainThread() { - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadedTest::dispatchSetNeedsAnimateAndCommit)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchSetNeedsAnimateAndCommit, base::Unretained(this))); } void ThreadedTest::postSetVisibleToMainThread(bool visible) { - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadedTest::dispatchSetVisible, visible)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchSetVisible, base::Unretained(this), visible)); } void ThreadedTest::postDidAddAnimationToMainThread() { - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadedTest::dispatchDidAddAnimation)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchDidAddAnimation, base::Unretained(this))); } void ThreadedTest::doBeginTest() @@ -425,13 +379,13 @@ void ThreadedTest::scheduleComposite() if (!m_started || m_scheduled || m_finished) return; m_scheduled = true; - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadedTest::dispatchComposite)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchComposite, base::Unretained(this))); } void ThreadedTest::realEndTest() { DCHECK(Proxy::isMainThread()); - WebKit::Platform::current()->currentThread()->exitRunLoop(); + MessageLoop::current()->Quit(); } void ThreadedTest::dispatchSetNeedsAnimate() @@ -549,38 +503,36 @@ void ThreadedTest::runTest(bool threaded) Settings::setAcceleratedAnimationEnabled(true); if (threaded) { - m_webThread.reset(WebKit::Platform::current()->createThread("ThreadedTest")); - Platform::current()->compositorSupport()->initialize(m_webThread.get()); - } else - Platform::current()->compositorSupport()->initialize(0); + m_implThread.reset(new base::Thread("ThreadedTest")); + ASSERT_TRUE(m_implThread->Start()); + m_implCCThread = cc::ThreadImpl::createForDifferentThread(m_implThread->message_loop_proxy()); + cc::Proxy::setImplThread(m_implCCThread.get()); + } DCHECK(Proxy::isMainThread()); m_mainThreadProxy = ScopedThreadProxy::create(Proxy::mainThread()); initializeSettings(m_settings); - m_beginTask = new BeginTask(this); - WebKit::Platform::current()->currentThread()->postDelayedTask(m_beginTask, 0); // postDelayedTask takes ownership of the task - m_timeoutTask = new TimeoutTask(this); - WebKit::Platform::current()->currentThread()->postDelayedTask(m_timeoutTask, 5000); - WebKit::Platform::current()->currentThread()->enterRunLoop(); - + cc::Proxy::mainThread()->postTask(base::Bind(&ThreadedTest::doBeginTest, base::Unretained(this))); + m_timeout.Reset(base::Bind(&ThreadedTest::timeout, base::Unretained(this))); + cc::Proxy::mainThread()->postDelayedTask(m_timeout.callback(), 5000); + MessageLoop::current()->Run(); if (m_layerTreeHost.get() && m_layerTreeHost->rootLayer()) m_layerTreeHost->rootLayer()->setLayerTreeHost(0); m_layerTreeHost.reset(); - if (m_timeoutTask) - m_timeoutTask->clearTest(); + cc::Proxy::setImplThread(0); + + m_timeout.Cancel(); ASSERT_FALSE(m_layerTreeHost.get()); m_client.reset(); if (m_timedOut) { FAIL() << "Test timed out"; - Platform::current()->compositorSupport()->shutdown(); return; } afterTest(); - Platform::current()->compositorSupport()->shutdown(); } } // namespace WebKitTests diff --git a/cc/test/layer_tree_test_common.h b/cc/test/layer_tree_test_common.h index c8d1c36..962764a 100644 --- a/cc/test/layer_tree_test_common.h +++ b/cc/test/layer_tree_test_common.h @@ -7,19 +7,20 @@ #include "base/hash_tables.h" #include "base/memory/ref_counted.h" +#include "base/threading/thread.h" #include "cc/layer_tree_host.h" #include "cc/layer_tree_host_impl.h" #include "cc/scoped_thread_proxy.h" #include "cc/test/compositor_fake_web_graphics_context_3d.h" #include "testing/gtest/include/gtest/gtest.h" #include <public/WebAnimationDelegate.h> -#include <public/WebThread.h> namespace cc { class LayerImpl; class LayerTreeHost; class LayerTreeHostClient; class LayerTreeHostImpl; +class Thread; } namespace WebKitTests { @@ -89,8 +90,6 @@ public: void doBeginTest(); void timeout(); - void clearTimeout() { m_timeoutTask = 0; } - cc::LayerTreeHost* layerTreeHost() { return m_layerTreeHost.get(); } protected: @@ -114,7 +113,8 @@ protected: void dispatchDidAddAnimation(); virtual void runTest(bool threaded); - WebKit::WebThread* webThread() const { return m_webThread.get(); } + + cc::Thread* implThread() { return m_implCCThread.get(); } cc::LayerTreeSettings m_settings; scoped_ptr<MockLayerImplTreeHostClient> m_client; @@ -131,9 +131,10 @@ private: bool m_scheduled; bool m_started; - scoped_ptr<WebKit::WebThread> m_webThread; - TimeoutTask* m_timeoutTask; - BeginTask* m_beginTask; + scoped_ptr<cc::Thread> m_mainCCThread; + scoped_ptr<cc::Thread> m_implCCThread; + scoped_ptr<base::Thread> m_implThread; + base::CancelableClosure m_timeout; }; class ThreadedTestThreadOnly : public ThreadedTest { diff --git a/cc/test/run_all_unittests.cc b/cc/test/run_all_unittests.cc index 9132bab..d0fddbc 100644 --- a/cc/test/run_all_unittests.cc +++ b/cc/test/run_all_unittests.cc @@ -4,18 +4,17 @@ #include "base/message_loop.h" #include "base/test/test_suite.h" -#include "cc/test/test_webkit_platform.h" +#include "cc/thread_impl.h" +#include "cc/proxy.h" #include "testing/gmock/include/gmock/gmock.h" -#include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" int main(int argc, char** argv) { ::testing::InitGoogleMock(&argc, argv); TestSuite test_suite(argc, argv); - cc::TestWebKitPlatform platform; MessageLoop message_loop; - WebKit::Platform::initialize(&platform); + scoped_ptr<cc::Thread> mainCCThread = cc::ThreadImpl::createForCurrentThread(); + cc::Proxy::setMainThread(mainCCThread.get()); int result = test_suite.Run(); - WebKit::Platform::shutdown(); return result; } diff --git a/cc/test/scheduler_test_common.cc b/cc/test/scheduler_test_common.cc index b2bedd8..4d2c13c 100644 --- a/cc/test/scheduler_test_common.cc +++ b/cc/test/scheduler_test_common.cc @@ -24,24 +24,31 @@ FakeThread::~FakeThread() { } -void FakeThread::postTask(PassOwnPtr<Task>) +void FakeThread::runPendingTask() { - NOTREACHED(); + ASSERT_TRUE(m_pendingTask); + scoped_ptr<base::Closure> task = m_pendingTask.Pass(); + task->Run(); } -void FakeThread::postDelayedTask(PassOwnPtr<Task> task, long long delay) +void FakeThread::postTask(base::Closure cb) +{ + postDelayedTask(cb, 0); +} + +void FakeThread::postDelayedTask(base::Closure cb, long long delay) { if (m_runPendingTaskOnOverwrite && hasPendingTask()) runPendingTask(); - EXPECT_TRUE(!hasPendingTask()); - m_pendingTask = task; + ASSERT_FALSE(hasPendingTask()); + m_pendingTask.reset(new base::Closure(cb)); m_pendingTaskDelay = delay; } -base::PlatformThreadId FakeThread::threadID() const +bool FakeThread::belongsToCurrentThread() const { - return 0; + return true; } void FakeTimeSource::setClient(cc::TimeSourceClient* client) diff --git a/cc/test/scheduler_test_common.h b/cc/test/scheduler_test_common.h index a586150..e43e4b8 100644 --- a/cc/test/scheduler_test_common.h +++ b/cc/test/scheduler_test_common.h @@ -5,12 +5,11 @@ #ifndef CCSchedulerTestCommon_h #define CCSchedulerTestCommon_h -#include "base/threading/platform_thread.h" +#include "base/memory/scoped_ptr.h" #include "cc/delay_based_time_source.h" #include "cc/frame_rate_controller.h" #include "cc/thread.h" #include "testing/gtest/include/gtest/gtest.h" -#include <wtf/OwnPtr.h> namespace WebKitTests { @@ -34,7 +33,7 @@ public: void reset() { m_pendingTaskDelay = 0; - m_pendingTask.clear(); + m_pendingTask.reset(); m_runPendingTaskOnOverwrite = false; } @@ -44,12 +43,7 @@ public: } bool hasPendingTask() const { return m_pendingTask; } - void runPendingTask() - { - ASSERT_TRUE(m_pendingTask); - OwnPtr<Task> task = m_pendingTask.release(); - task->performTask(); - } + void runPendingTask(); long long pendingDelayMs() const { @@ -57,12 +51,12 @@ public: return m_pendingTaskDelay; } - virtual void postTask(PassOwnPtr<Task>) OVERRIDE; - virtual void postDelayedTask(PassOwnPtr<Task> task, long long delay) OVERRIDE; - virtual base::PlatformThreadId threadID() const OVERRIDE; + virtual void postTask(base::Closure cb) OVERRIDE; + virtual void postDelayedTask(base::Closure cb, long long delay) OVERRIDE; + virtual bool belongsToCurrentThread() const OVERRIDE; protected: - OwnPtr<Task> m_pendingTask; + scoped_ptr<base::Closure> m_pendingTask; long long m_pendingTaskDelay; bool m_runPendingTaskOnOverwrite; }; diff --git a/cc/test/test_webkit_platform.cc b/cc/test/test_webkit_platform.cc deleted file mode 100644 index 403ba61..0000000 --- a/cc/test/test_webkit_platform.cc +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "cc/test/test_webkit_platform.h" - -namespace cc { - -TestWebKitPlatform::TestWebKitPlatform() { -} - -TestWebKitPlatform::~TestWebKitPlatform() { -} - -WebKit::WebCompositorSupport* TestWebKitPlatform::compositorSupport() { - return &compositor_support_; -} - -void TestWebKitPlatform::cryptographicallyRandomValues( - unsigned char* buffer, size_t length) { - base::RandBytes(buffer, length); -} - -WebKit::WebThread* TestWebKitPlatform::createThread(const char* name) { - return new webkit_glue::WebThreadImpl(name); -} - -WebKit::WebThread* TestWebKitPlatform::currentThread() { - webkit_glue::WebThreadImplForMessageLoop* thread = - static_cast<WebThreadImplForMessageLoop*>(current_thread_slot_.Get()); - if (thread) - return (thread); - - scoped_refptr<base::MessageLoopProxy> message_loop = - base::MessageLoopProxy::current(); - if (!message_loop) - return NULL; - - thread = new WebThreadImplForMessageLoop(message_loop); - current_thread_slot_.Set(thread); - return thread; -} - -double TestWebKitPlatform::currentTime() { - return base::Time::Now().ToDoubleT(); -} - -double TestWebKitPlatform::monotonicallyIncreasingTime() { - return base::TimeTicks::Now().ToInternalValue() / - static_cast<double>(base::Time::kMicrosecondsPerSecond); -} - -} diff --git a/cc/test/test_webkit_platform.h b/cc/test/test_webkit_platform.h deleted file mode 100644 index ee7cfa6..0000000 --- a/cc/test/test_webkit_platform.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CC_TEST_TEST_WEBKIT_PLATFORM_H_ -#define CC_TEST_TEST_WEBKIT_PLATFORM_H_ - -#include "base/rand_util.h" -#include "base/threading/thread_local_storage.h" -#include "cc/test/test_webkit_platform.h" -#include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" -#include "webkit/compositor_bindings/web_compositor_support_impl.h" -#include "webkit/glue/webthread_impl.h" - -using webkit_glue::WebThreadImplForMessageLoop; - -namespace cc { - -class TestWebKitPlatform : public WebKit::Platform { - public: - TestWebKitPlatform(); - virtual ~TestWebKitPlatform(); - - virtual WebKit::WebCompositorSupport* compositorSupport(); - - virtual void cryptographicallyRandomValues( - unsigned char* buffer, size_t length); - - virtual WebKit::WebThread* createThread(const char* name); - - virtual WebKit::WebThread* currentThread(); - - virtual double currentTime(); - - virtual double monotonicallyIncreasingTime(); - - private: - base::ThreadLocalStorage::Slot current_thread_slot_; - webkit::WebCompositorSupportImpl compositor_support_; -}; - -} // namespace cc - -#endif // CC_TEST_TEST_WEBKIT_PLATFORM_H_ diff --git a/cc/test/web_compositor_initializer.h b/cc/test/web_compositor_initializer.h deleted file mode 100644 index f6203b1..0000000 --- a/cc/test/web_compositor_initializer.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WebCompositorInitializer_h -#define WebCompositorInitializer_h - -#include "base/basictypes.h" -#include <public/Platform.h> -#include <public/WebCompositorSupport.h> - -namespace WebKit { -class WebThread; -} - -namespace WebKitTests { - -class WebCompositorInitializer { -public: - explicit WebCompositorInitializer(WebKit::WebThread* thread) - { - WebKit::Platform::current()->compositorSupport()->initialize(thread); - } - - ~WebCompositorInitializer() - { - WebKit::Platform::current()->compositorSupport()->shutdown(); - } - -private: - DISALLOW_COPY_AND_ASSIGN(WebCompositorInitializer); -}; - -} - -#endif // WebCompositorInitializer_h diff --git a/cc/texture_layer_unittest.cc b/cc/texture_layer_unittest.cc index ad44d21..67ba102 100644 --- a/cc/texture_layer_unittest.cc +++ b/cc/texture_layer_unittest.cc @@ -10,7 +10,6 @@ #include "cc/single_thread_proxy.h" #include "cc/texture_layer_impl.h" #include "cc/test/fake_layer_tree_host_client.h" -#include "cc/test/web_compositor_initializer.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -41,7 +40,6 @@ private: class TextureLayerTest : public testing::Test { public: TextureLayerTest() - : m_compositorInitializer(0) { } @@ -63,7 +61,6 @@ protected: scoped_ptr<MockLayerImplTreeHost> m_layerTreeHost; private: - WebKitTests::WebCompositorInitializer m_compositorInitializer; }; TEST_F(TextureLayerTest, syncImplWhenChangingTextureId) diff --git a/cc/thread.h b/cc/thread.h index 341b2db..a017c42 100644 --- a/cc/thread.h +++ b/cc/thread.h @@ -5,9 +5,8 @@ #ifndef CCThread_h #define CCThread_h +#include "base/callback.h" #include "base/basictypes.h" -#include "base/threading/platform_thread.h" -#include <wtf/PassOwnPtr.h> namespace cc { @@ -17,25 +16,13 @@ class Thread { public: virtual ~Thread() { } - class Task { - public: - virtual ~Task() { } - virtual void performTask() = 0; - void* instance() const { return m_instance; } - protected: - Task(void* instance) : m_instance(instance) { } - void* m_instance; - private: - DISALLOW_COPY_AND_ASSIGN(Task); - }; - - // Executes the task on context's thread asynchronously. - virtual void postTask(PassOwnPtr<Task>) = 0; + // Executes the callback on context's thread asynchronously. + virtual void postTask(base::Closure cb) = 0; // Executes the task after the specified delay. - virtual void postDelayedTask(PassOwnPtr<Task>, long long delayMs) = 0; + virtual void postDelayedTask(base::Closure cb, long long delayMs) = 0; - virtual base::PlatformThreadId threadID() const = 0; + virtual bool belongsToCurrentThread() const = 0; }; } diff --git a/cc/thread_impl.cc b/cc/thread_impl.cc new file mode 100644 index 0000000..6d68a4c --- /dev/null +++ b/cc/thread_impl.cc @@ -0,0 +1,45 @@ +// Copyright 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cc/thread_impl.h" + +#include "base/message_loop.h" + +namespace cc { + +scoped_ptr<Thread> ThreadImpl::createForCurrentThread() +{ + return scoped_ptr<Thread>(new ThreadImpl(base::MessageLoopProxy::current())).Pass(); +} + +scoped_ptr<Thread> ThreadImpl::createForDifferentThread(scoped_refptr<base::MessageLoopProxy> thread) +{ + return scoped_ptr<Thread>(new ThreadImpl(thread)).Pass(); +} + +ThreadImpl::~ThreadImpl() +{ +} + +void ThreadImpl::postTask(base::Closure cb) +{ + m_thread->PostTask(FROM_HERE, cb); +} + +void ThreadImpl::postDelayedTask(base::Closure cb, long long delayMs) +{ + m_thread->PostDelayedTask(FROM_HERE, cb, base::TimeDelta::FromMilliseconds(delayMs)); +} + +bool ThreadImpl::belongsToCurrentThread() const +{ + return m_thread->BelongsToCurrentThread(); +} + +ThreadImpl::ThreadImpl(scoped_refptr<base::MessageLoopProxy> thread) + : m_thread(thread) +{ +} + +} // namespace cc diff --git a/cc/thread_impl.h b/cc/thread_impl.h new file mode 100644 index 0000000..9dfcd88 --- /dev/null +++ b/cc/thread_impl.h @@ -0,0 +1,39 @@ +// Copyright 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_THREAD_IMPL_H_ +#define CC_THREAD_IMPL_H_ + +#include "base/callback.h" +#include "base/memory/scoped_ptr.h" +#include "base/message_loop_proxy.h" +#include "cc/thread.h" + +namespace cc { + +// Implements cc::Thread in terms of base::MessageLoopProxy. +class ThreadImpl : public Thread { +public: + // Creates a ThreadImpl wrapping the current thread. + static scoped_ptr<cc::Thread> createForCurrentThread(); + + // Creates a Thread wrapping a non-current thread. + static scoped_ptr<cc::Thread> createForDifferentThread(scoped_refptr<base::MessageLoopProxy> thread); + + virtual ~ThreadImpl(); + + // cc::Thread implementation + virtual void postTask(base::Closure cb) OVERRIDE; + virtual void postDelayedTask(base::Closure cb, long long delayMs) OVERRIDE; + virtual bool belongsToCurrentThread() const OVERRIDE; + +private: + explicit ThreadImpl(scoped_refptr<base::MessageLoopProxy> thread); + + scoped_refptr<base::MessageLoopProxy> m_thread; +}; + +} // namespace cc + +#endif // CC_THREAD_IMPL_H_ diff --git a/cc/thread_proxy.cc b/cc/thread_proxy.cc index 023aad0..688d1e3 100644 --- a/cc/thread_proxy.cc +++ b/cc/thread_proxy.cc @@ -6,6 +6,7 @@ #include "cc/thread_proxy.h" +#include "base/bind.h" #include "base/debug/trace_event.h" #include "cc/delay_based_time_source.h" #include "cc/draw_quad.h" @@ -15,7 +16,6 @@ #include "cc/layer_tree_host.h" #include "cc/scheduler.h" #include "cc/scoped_thread_proxy.h" -#include "cc/thread_task.h" #include <public/WebSharedGraphicsContext3D.h> using WebKit::WebSharedGraphicsContext3D; @@ -83,7 +83,7 @@ bool ThreadProxy::compositeAndReadback(void *pixels, const IntRect& rect) { DebugScopedSetMainThreadBlocked mainThreadBlocked; CompletionEvent beginFrameCompletion; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::forceBeginFrameOnImplThread, &beginFrameCompletion)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::forceBeginFrameOnImplThread, base::Unretained(this), &beginFrameCompletion)); beginFrameCompletion.wait(); } m_inCompositeAndReadback = true; @@ -96,7 +96,7 @@ bool ThreadProxy::compositeAndReadback(void *pixels, const IntRect& rect) request.pixels = pixels; { DebugScopedSetMainThreadBlocked mainThreadBlocked; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::requestReadbackOnImplThread, &request)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::requestReadbackOnImplThread, base::Unretained(this), &request)); request.completion.wait(); } return request.success; @@ -120,7 +120,7 @@ void ThreadProxy::requestReadbackOnImplThread(ReadbackRequest* request) void ThreadProxy::startPageScaleAnimation(const IntSize& targetPosition, bool useAnchor, float scale, base::TimeDelta duration) { DCHECK(Proxy::isMainThread()); - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::requestStartPageScaleAnimationOnImplThread, targetPosition, useAnchor, scale, duration)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::requestStartPageScaleAnimationOnImplThread, base::Unretained(this), targetPosition, useAnchor, scale, duration)); } void ThreadProxy::requestStartPageScaleAnimationOnImplThread(IntSize targetPosition, bool useAnchor, float scale, base::TimeDelta duration) @@ -138,7 +138,7 @@ void ThreadProxy::finishAllRendering() // Make sure all GL drawing is finished on the impl thread. DebugScopedSetMainThreadBlocked mainThreadBlocked; CompletionEvent completion; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::finishAllRenderingOnImplThread, &completion)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::finishAllRenderingOnImplThread, base::Unretained(this), &completion)); completion.wait(); } @@ -155,15 +155,14 @@ bool ThreadProxy::initializeContext() if (!context.get()) return false; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::initializeContextOnImplThread, - context.release())); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::initializeContextOnImplThread, base::Unretained(this), context.release())); return true; } void ThreadProxy::setSurfaceReady() { TRACE_EVENT0("cc", "ThreadProxy::setSurfaceReady"); - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::setSurfaceReadyOnImplThread)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::setSurfaceReadyOnImplThread, base::Unretained(this))); } void ThreadProxy::setSurfaceReadyOnImplThread() @@ -177,7 +176,7 @@ void ThreadProxy::setVisible(bool visible) TRACE_EVENT0("cc", "ThreadProxy::setVisible"); DebugScopedSetMainThreadBlocked mainThreadBlocked; CompletionEvent completion; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::setVisibleOnImplThread, &completion, visible)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::setVisibleOnImplThread, base::Unretained(this), &completion, visible)); completion.wait(); } @@ -198,10 +197,11 @@ bool ThreadProxy::initializeRenderer() bool initializeSucceeded = false; RendererCapabilities capabilities; DebugScopedSetMainThreadBlocked mainThreadBlocked; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::initializeRendererOnImplThread, - &completion, - &initializeSucceeded, - &capabilities)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::initializeRendererOnImplThread, + base::Unretained(this), + &completion, + &initializeSucceeded, + &capabilities)); completion.wait(); if (initializeSucceeded) { @@ -231,11 +231,12 @@ bool ThreadProxy::recreateContext() bool recreateSucceeded = false; RendererCapabilities capabilities; DebugScopedSetMainThreadBlocked mainThreadBlocked; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::recreateContextOnImplThread, - &completion, - context.release(), - &recreateSucceeded, - &capabilities)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::recreateContextOnImplThread, + base::Unretained(this), + &completion, + context.release(), + &recreateSucceeded, + &capabilities)); completion.wait(); if (recreateSucceeded) @@ -249,9 +250,8 @@ void ThreadProxy::renderingStats(RenderingStats* stats) DebugScopedSetMainThreadBlocked mainThreadBlocked; CompletionEvent completion; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::renderingStatsOnImplThread, - &completion, - stats)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::renderingStatsOnImplThread, + base::Unretained(this), &completion, stats)); stats->totalCommitTimeInSeconds = m_totalCommitTime.InSecondsF(); stats->totalCommitCount = m_totalCommitCount; @@ -266,7 +266,7 @@ const RendererCapabilities& ThreadProxy::rendererCapabilities() const void ThreadProxy::loseContext() { - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::didLoseContextOnImplThread)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::didLoseContextOnImplThread, base::Unretained(this))); } void ThreadProxy::setNeedsAnimate() @@ -281,7 +281,7 @@ void ThreadProxy::setNeedsAnimate() if (m_commitRequestSentToImplThread) return; m_commitRequestSentToImplThread = true; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::setNeedsCommitOnImplThread)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::setNeedsCommitOnImplThread, base::Unretained(this))); } void ThreadProxy::setNeedsCommit() @@ -295,7 +295,7 @@ void ThreadProxy::setNeedsCommit() if (m_commitRequestSentToImplThread) return; m_commitRequestSentToImplThread = true; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::setNeedsCommitOnImplThread)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::setNeedsCommitOnImplThread, base::Unretained(this))); } void ThreadProxy::didLoseContextOnImplThread() @@ -310,7 +310,7 @@ void ThreadProxy::onSwapBuffersCompleteOnImplThread() DCHECK(isImplThread()); TRACE_EVENT0("cc", "ThreadProxy::onSwapBuffersCompleteOnImplThread"); m_schedulerOnImplThread->didSwapBuffersComplete(); - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadProxy::didCompleteSwapBuffers)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadProxy::didCompleteSwapBuffers, base::Unretained(this))); } void ThreadProxy::onVSyncParametersChanged(base::TimeTicks timebase, base::TimeDelta interval) @@ -346,7 +346,7 @@ void ThreadProxy::postAnimationEventsToMainThreadOnImplThread(scoped_ptr<Animati { DCHECK(isImplThread()); TRACE_EVENT0("cc", "ThreadProxy::postAnimationEventsToMainThreadOnImplThread"); - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadProxy::setAnimationEvents, events.release(), wallClockTime)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadProxy::setAnimationEvents, base::Unretained(this), events.release(), wallClockTime)); } bool ThreadProxy::reduceContentsTextureMemoryOnImplThread(size_t limitBytes, int priorityCutoff) @@ -389,8 +389,8 @@ void ThreadProxy::setNeedsRedraw() { DCHECK(isMainThread()); TRACE_EVENT0("cc", "ThreadProxy::setNeedsRedraw"); - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::setFullRootLayerDamageOnImplThread)); - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::setNeedsRedrawOnImplThread)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::setFullRootLayerDamageOnImplThread, base::Unretained(this))); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::setNeedsRedrawOnImplThread, base::Unretained(this))); } void ThreadProxy::setDeferCommits(bool deferCommits) @@ -406,7 +406,7 @@ void ThreadProxy::setDeferCommits(bool deferCommits) if (!m_deferCommits && m_deferredCommitPending) { m_deferredCommitPending = false; - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadProxy::beginFrame)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadProxy::beginFrame, base::Unretained(this))); } } @@ -431,7 +431,7 @@ void ThreadProxy::start() DebugScopedSetMainThreadBlocked mainThreadBlocked; CompletionEvent completion; scoped_ptr<InputHandler> handler = m_layerTreeHost->createInputHandler(); - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::initializeImplOnImplThread, &completion, handler.release())); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::initializeImplOnImplThread, base::Unretained(this), &completion, handler.release())); completion.wait(); m_started = true; @@ -448,7 +448,7 @@ void ThreadProxy::stop() DebugScopedSetMainThreadBlocked mainThreadBlocked; CompletionEvent completion; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::layerTreeHostClosedOnImplThread, &completion)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::layerTreeHostClosedOnImplThread, base::Unretained(this), &completion)); completion.wait(); } @@ -463,7 +463,7 @@ void ThreadProxy::forceSerializeOnSwapBuffers() { DebugScopedSetMainThreadBlocked mainThreadBlocked; CompletionEvent completion; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::forceSerializeOnSwapBuffersOnImplThread, &completion)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::forceSerializeOnSwapBuffersOnImplThread, base::Unretained(this), &completion)); completion.wait(); } @@ -509,7 +509,7 @@ void ThreadProxy::scheduledActionBeginFrame() if (m_layerTreeHost->contentsTextureManager()) m_layerTreeHost->contentsTextureManager()->getEvictedBackings(m_pendingBeginFrameRequest->evictedContentsTexturesBackings); - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadProxy::beginFrame)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadProxy::beginFrame, base::Unretained(this))); if (m_beginFrameCompletionEventOnImplThread) { m_beginFrameCompletionEventOnImplThread->signal(); @@ -565,7 +565,7 @@ void ThreadProxy::beginFrame() m_forcedCommitRequested = false; TRACE_EVENT0("cc", "EarlyOut_NotVisible"); - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::beginFrameAbortedOnImplThread)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::beginFrameAbortedOnImplThread, base::Unretained(this))); return; } @@ -618,7 +618,7 @@ void ThreadProxy::beginFrame() base::TimeTicks startTime = base::TimeTicks::HighResNow(); CompletionEvent completion; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::beginFrameCompleteOnImplThread, &completion, queue.release())); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::beginFrameCompleteOnImplThread, base::Unretained(this), &completion, queue.release())); completion.wait(); base::TimeTicks endTime = base::TimeTicks::HighResNow(); @@ -716,7 +716,7 @@ void ThreadProxy::scheduledActionCommit() void ThreadProxy::scheduledActionBeginContextRecreation() { DCHECK(isImplThread()); - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadProxy::beginContextRecreation)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadProxy::beginContextRecreation, base::Unretained(this))); } ScheduledActionDrawAndSwapResult ThreadProxy::scheduledActionDrawAndSwapInternal(bool forcedDraw) @@ -776,7 +776,7 @@ ScheduledActionDrawAndSwapResult ThreadProxy::scheduledActionDrawAndSwapInternal // Tell the main thread that the the newly-commited frame was drawn. if (m_nextFrameIsNewlyCommittedFrameOnImplThread) { m_nextFrameIsNewlyCommittedFrameOnImplThread = false; - m_mainThreadProxy->postTask(createThreadTask(this, &ThreadProxy::didCommitAndDrawFrame)); + m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadProxy::didCommitAndDrawFrame, base::Unretained(this))); } return result; @@ -797,7 +797,7 @@ void ThreadProxy::acquireLayerTextures() TRACE_EVENT0("cc", "ThreadProxy::acquireLayerTextures"); DebugScopedSetMainThreadBlocked mainThreadBlocked; CompletionEvent completion; - Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::acquireLayerTexturesForMainThreadOnImplThread, &completion)); + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::acquireLayerTexturesForMainThreadOnImplThread, base::Unretained(this), &completion)); completion.wait(); // Block until it is safe to write to layer textures from the main thread. m_texturesAcquired = true; @@ -872,33 +872,13 @@ void ThreadProxy::setAnimationEvents(AnimationEventsVector* passed_events, base: m_layerTreeHost->setAnimationEvents(events.Pass(), wallClockTime); } -class ThreadProxyContextRecreationTimer : public Timer, TimerClient { -public: - static scoped_ptr<ThreadProxyContextRecreationTimer> create(ThreadProxy* proxy) { return make_scoped_ptr(new ThreadProxyContextRecreationTimer(proxy)); } - - virtual void onTimerFired() OVERRIDE - { - m_proxy->tryToRecreateContext(); - } - -private: - explicit ThreadProxyContextRecreationTimer(ThreadProxy* proxy) - : Timer(Proxy::mainThread(), this) - , m_proxy(proxy) - { - } - - ThreadProxy* m_proxy; -}; - void ThreadProxy::beginContextRecreation() { TRACE_EVENT0("cc", "ThreadProxy::beginContextRecreation"); DCHECK(isMainThread()); - DCHECK(!m_contextRecreationTimer); - m_contextRecreationTimer = ThreadProxyContextRecreationTimer::create(this); m_layerTreeHost->didLoseContext(); - m_contextRecreationTimer->startOneShot(contextRecreationTickRate); + m_contextRecreationCallback.Reset(base::Bind(&ThreadProxy::tryToRecreateContext, base::Unretained(this))); + Proxy::mainThread()->postTask(m_contextRecreationCallback.callback()); } void ThreadProxy::tryToRecreateContext() @@ -907,9 +887,9 @@ void ThreadProxy::tryToRecreateContext() DCHECK(m_layerTreeHost); LayerTreeHost::RecreateResult result = m_layerTreeHost->recreateContext(); if (result == LayerTreeHost::RecreateFailedButTryAgain) - m_contextRecreationTimer->startOneShot(contextRecreationTickRate); + Proxy::mainThread()->postTask(m_contextRecreationCallback.callback()); else if (result == LayerTreeHost::RecreateSucceeded) - m_contextRecreationTimer.reset(); + m_contextRecreationCallback.Cancel(); } void ThreadProxy::initializeImplOnImplThread(CompletionEvent* completion, InputHandler* handler) diff --git a/cc/thread_proxy.h b/cc/thread_proxy.h index 1c57dfb..721bb68 100644 --- a/cc/thread_proxy.h +++ b/cc/thread_proxy.h @@ -21,7 +21,6 @@ class ResourceUpdateQueue; class Scheduler; class ScopedThreadProxy; class Thread; -class ThreadProxyContextRecreationTimer; class ThreadProxy : public Proxy, LayerTreeHostImplClient, SchedulerClient, ResourceUpdateControllerClient { public: @@ -79,7 +78,6 @@ public: private: explicit ThreadProxy(LayerTreeHost*); - friend class ThreadProxyContextRecreationTimer; // Set on impl thread, read on main thread. struct BeginFrameAndCommitState { @@ -134,7 +132,7 @@ private: bool m_commitRequested; // Set only when setNeedsCommit is called. bool m_commitRequestSentToImplThread; // Set by setNeedsCommit and setNeedsAnimate. bool m_forcedCommitRequested; - scoped_ptr<ThreadProxyContextRecreationTimer> m_contextRecreationTimer; + base::CancelableClosure m_contextRecreationCallback; LayerTreeHost* m_layerTreeHost; bool m_rendererInitialized; RendererCapabilities m_RendererCapabilitiesMainThreadCopy; diff --git a/cc/thread_task.h b/cc/thread_task.h deleted file mode 100644 index 05bd171..0000000 --- a/cc/thread_task.h +++ /dev/null @@ -1,305 +0,0 @@ -// Copyright 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CCThreadTask_h -#define CCThreadTask_h - -#include "cc/thread.h" -#include <wtf/PassOwnPtr.h> - -namespace cc { - -template<typename T> -class ThreadTask0 : public Thread::Task { -public: - typedef void (T::*Method)(); - typedef ThreadTask0<T> ThreadTaskImpl; - - static PassOwnPtr<ThreadTaskImpl> create(T* instance, Method method) - { - return adoptPtr(new ThreadTaskImpl(instance, method)); - } - -private: - ThreadTask0(T* instance, Method method) - : Thread::Task(instance) - , m_method(method) - { - } - - virtual void performTask() OVERRIDE - { - (*static_cast<T*>(instance()).*m_method)(); - } - -private: - Method m_method; -}; - -template<typename T, typename P1, typename MP1> -class ThreadTask1 : public Thread::Task { -public: - typedef void (T::*Method)(MP1); - typedef ThreadTask1<T, P1, MP1> ThreadTaskImpl; - - static PassOwnPtr<ThreadTaskImpl> create(T* instance, Method method, P1 parameter1) - { - return adoptPtr(new ThreadTaskImpl(instance, method, parameter1)); - } - -private: - ThreadTask1(T* instance, Method method, P1 parameter1) - : Thread::Task(instance) - , m_method(method) - , m_parameter1(parameter1) - { - } - - virtual void performTask() OVERRIDE - { - (*static_cast<T*>(instance()).*m_method)(m_parameter1); - } - -private: - Method m_method; - P1 m_parameter1; -}; - -template<typename T, typename P1, typename MP1, typename P2, typename MP2> -class ThreadTask2 : public Thread::Task { -public: - typedef void (T::*Method)(MP1, MP2); - typedef ThreadTask2<T, P1, MP1, P2, MP2> ThreadTaskImpl; - - static PassOwnPtr<ThreadTaskImpl> create(T* instance, Method method, P1 parameter1, P2 parameter2) - { - return adoptPtr(new ThreadTaskImpl(instance, method, parameter1, parameter2)); - } - -private: - ThreadTask2(T* instance, Method method, P1 parameter1, P2 parameter2) - : Thread::Task(instance) - , m_method(method) - , m_parameter1(parameter1) - , m_parameter2(parameter2) - { - } - - virtual void performTask() OVERRIDE - { - (*static_cast<T*>(instance()).*m_method)(m_parameter1, m_parameter2); - } - -private: - Method m_method; - P1 m_parameter1; - P2 m_parameter2; -}; - -template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3> -class ThreadTask3 : public Thread::Task { -public: - typedef void (T::*Method)(MP1, MP2, MP3); - typedef ThreadTask3<T, P1, MP1, P2, MP2, P3, MP3> ThreadTaskImpl; - - static PassOwnPtr<ThreadTaskImpl> create(T* instance, Method method, P1 parameter1, P2 parameter2, P3 parameter3) - { - return adoptPtr(new ThreadTaskImpl(instance, method, parameter1, parameter2, parameter3)); - } - -private: - ThreadTask3(T* instance, Method method, P1 parameter1, P2 parameter2, P3 parameter3) - : Thread::Task(instance) - , m_method(method) - , m_parameter1(parameter1) - , m_parameter2(parameter2) - , m_parameter3(parameter3) - { - } - - virtual void performTask() OVERRIDE - { - (*static_cast<T*>(instance()).*m_method)(m_parameter1, m_parameter2, m_parameter3); - } - -private: - Method m_method; - P1 m_parameter1; - P2 m_parameter2; - P3 m_parameter3; -}; - - -template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4> -class ThreadTask4 : public Thread::Task { -public: - typedef void (T::*Method)(MP1, MP2, MP3, MP4); - typedef ThreadTask4<T, P1, MP1, P2, MP2, P3, MP3, P4, MP4> ThreadTaskImpl; - - static PassOwnPtr<ThreadTaskImpl> create(T* instance, Method method, P1 parameter1, P2 parameter2, P3 parameter3, P4 parameter4) - { - return adoptPtr(new ThreadTaskImpl(instance, method, parameter1, parameter2, parameter3, parameter4)); - } - -private: - ThreadTask4(T* instance, Method method, P1 parameter1, P2 parameter2, P3 parameter3, P4 parameter4) - : Thread::Task(instance) - , m_method(method) - , m_parameter1(parameter1) - , m_parameter2(parameter2) - , m_parameter3(parameter3) - , m_parameter4(parameter4) - { - } - - virtual void performTask() OVERRIDE - { - (*static_cast<T*>(instance()).*m_method)(m_parameter1, m_parameter2, m_parameter3, m_parameter4); - } - -private: - Method m_method; - P1 m_parameter1; - P2 m_parameter2; - P3 m_parameter3; - P4 m_parameter4; -}; - -template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5> -class ThreadTask5 : public Thread::Task { -public: - typedef void (T::*Method)(MP1, MP2, MP3, MP4, MP5); - typedef ThreadTask5<T, P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5> ThreadTaskImpl; - - static PassOwnPtr<ThreadTaskImpl> create(T* instance, Method method, P1 parameter1, P2 parameter2, P3 parameter3, P4 parameter4, P5 parameter5) - { - return adoptPtr(new ThreadTaskImpl(instance, method, parameter1, parameter2, parameter3, parameter4, parameter5)); - } - -private: - ThreadTask5(T* instance, Method method, P1 parameter1, P2 parameter2, P3 parameter3, P4 parameter4, P5 parameter5) - : Thread::Task(instance) - , m_method(method) - , m_parameter1(parameter1) - , m_parameter2(parameter2) - , m_parameter3(parameter3) - , m_parameter4(parameter4) - , m_parameter5(parameter5) - { - } - - virtual void performTask() OVERRIDE - { - (*static_cast<T*>(instance()).*m_method)(m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5); - } - -private: - Method m_method; - P1 m_parameter1; - P2 m_parameter2; - P3 m_parameter3; - P4 m_parameter4; - P5 m_parameter5; -}; - -template<typename T> -PassOwnPtr<Thread::Task> createThreadTask( - T* const callee, - void (T::*method)()); - -template<typename T> -PassOwnPtr<Thread::Task> createThreadTask( - T* const callee, - void (T::*method)()) -{ - return ThreadTask0<T>::create( - callee, - method); -} - -template<typename T, typename P1, typename MP1> -PassOwnPtr<Thread::Task> createThreadTask( - T* const callee, - void (T::*method)(MP1), - const P1& parameter1) -{ - return ThreadTask1<T, P1, MP1>::create( - callee, - method, - parameter1); -} - -template<typename T, typename P1, typename MP1, typename P2, typename MP2> -PassOwnPtr<Thread::Task> createThreadTask( - T* const callee, - void (T::*method)(MP1, MP2), - const P1& parameter1, - const P2& parameter2) -{ - return ThreadTask2<T, P1, MP1, P2, MP2>::create( - callee, - method, - parameter1, - parameter2); -} - -template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3> -PassOwnPtr<Thread::Task> createThreadTask( - T* const callee, - void (T::*method)(MP1, MP2, MP3), - const P1& parameter1, - const P2& parameter2, - const P3& parameter3) -{ - return ThreadTask3<T, P1, MP1, P2, MP2, P3, MP3>::create( - callee, - method, - parameter1, - parameter2, - parameter3); -} - -template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4> -PassOwnPtr<Thread::Task> createThreadTask( - T* const callee, - void (T::*method)(MP1, MP2, MP3, MP4), - const P1& parameter1, - const P2& parameter2, - const P3& parameter3, - const P4& parameter4) -{ - return ThreadTask4<T, P1, MP1, P2, MP2, P3, MP3, P4, MP4>::create( - callee, - method, - parameter1, - parameter2, - parameter3, - parameter4); - -} - -template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5> -PassOwnPtr<Thread::Task> createThreadTask( - T* const callee, - void (T::*method)(MP1, MP2, MP3, MP4, MP5), - const P1& parameter1, - const P2& parameter2, - const P3& parameter3, - const P4& parameter4, - const P5& parameter5) -{ - return ThreadTask5<T, P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5>::create( - callee, - method, - parameter1, - parameter2, - parameter3, - parameter4, - parameter5); - -} - -} // namespace cc - -#endif // CCThreadTask_h diff --git a/cc/thread_task_unittest.cc b/cc/thread_task_unittest.cc deleted file mode 100644 index da674b0..0000000 --- a/cc/thread_task_unittest.cc +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "config.h" - -#include "cc/thread_task.h" - -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace cc { - -class Mock { -public: - MOCK_METHOD0(method0, void()); - MOCK_METHOD1(method1, void(int a1)); - MOCK_METHOD2(method2, void(int a1, int a2)); - MOCK_METHOD3(method3, void(int a1, int a2, int a3)); - MOCK_METHOD4(method4, void(int a1, int a2, int a3, int a4)); - MOCK_METHOD5(method5, void(int a1, int a2, int a3, int a4, int a5)); -}; - -TEST(ThreadTaskTest, runnableMethods) -{ - Mock mock; - EXPECT_CALL(mock, method0()).Times(1); - EXPECT_CALL(mock, method1(9)).Times(1); - EXPECT_CALL(mock, method2(9, 8)).Times(1); - EXPECT_CALL(mock, method3(9, 8, 7)).Times(1); - EXPECT_CALL(mock, method4(9, 8, 7, 6)).Times(1); - EXPECT_CALL(mock, method5(9, 8, 7, 6, 5)).Times(1); - - createThreadTask(&mock, &Mock::method0)->performTask(); - createThreadTask(&mock, &Mock::method1, 9)->performTask(); - createThreadTask(&mock, &Mock::method2, 9, 8)->performTask(); - createThreadTask(&mock, &Mock::method3, 9, 8, 7)->performTask(); - createThreadTask(&mock, &Mock::method4, 9, 8, 7, 6)->performTask(); - createThreadTask(&mock, &Mock::method5, 9, 8, 7, 6, 5)->performTask(); -} - -} // namespace cc diff --git a/cc/tiled_layer_unittest.cc b/cc/tiled_layer_unittest.cc index 2cd3430..4bc3ff0 100644 --- a/cc/tiled_layer_unittest.cc +++ b/cc/tiled_layer_unittest.cc @@ -17,7 +17,6 @@ #include "cc/test/fake_layer_tree_host_client.h" #include "cc/test/geometry_test_utils.h" #include "cc/test/tiled_layer_test_common.h" -#include "cc/test/web_compositor_initializer.h" #include "testing/gtest/include/gtest/gtest.h" #include <public/WebTransformationMatrix.h> @@ -49,8 +48,7 @@ private: class TiledLayerTest : public testing::Test { public: TiledLayerTest() - : m_compositorInitializer(0) - , m_context(WebKit::createFakeGraphicsContext()) + : m_context(WebKit::createFakeGraphicsContext()) , m_queue(make_scoped_ptr(new ResourceUpdateQueue)) , m_textureManager(PrioritizedTextureManager::create(60*1024*1024, 1024, Renderer::ContentPool)) , m_occlusion(0) @@ -157,7 +155,6 @@ public: } public: - WebKitTests::WebCompositorInitializer m_compositorInitializer; scoped_ptr<GraphicsContext> m_context; scoped_ptr<ResourceProvider> m_resourceProvider; scoped_ptr<ResourceUpdateQueue> m_queue; diff --git a/cc/timer.cc b/cc/timer.cc deleted file mode 100644 index 364020d..0000000 --- a/cc/timer.cc +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "config.h" - -#include "cc/timer.h" - -#include "base/compiler_specific.h" -#include "base/logging.h" -#include "cc/thread.h" - -namespace cc { - -class TimerTask : public Thread::Task { -public: - explicit TimerTask(Timer* timer) - : Thread::Task(0) - , m_timer(timer) - { - } - - virtual ~TimerTask() - { - if (!m_timer) - return; - - DCHECK(m_timer->m_task == this); - m_timer->stop(); - } - - virtual void performTask() OVERRIDE - { - if (!m_timer) - return; - - TimerClient* client = m_timer->m_client; - - m_timer->stop(); - if (client) - client->onTimerFired(); - } - -private: - friend class Timer; - - Timer* m_timer; // null if cancelled -}; - -Timer::Timer(Thread* thread, TimerClient* client) - : m_client(client) - , m_thread(thread) - , m_task(0) -{ -} - -Timer::~Timer() -{ - stop(); -} - -void Timer::startOneShot(double intervalSeconds) -{ - stop(); - - m_task = new TimerTask(this); - - // The thread expects delays in milliseconds. - m_thread->postDelayedTask(adoptPtr(m_task), intervalSeconds * 1000.0); -} - -void Timer::stop() -{ - if (!m_task) - return; - - m_task->m_timer = 0; - m_task = 0; -} - -} // namespace cc diff --git a/cc/timer.h b/cc/timer.h deleted file mode 100644 index d18580f..0000000 --- a/cc/timer.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CCTimer_h -#define CCTimer_h - -namespace cc { - -class Thread; -class TimerTask; - -class TimerClient { -public: - virtual ~TimerClient() { } - - virtual void onTimerFired() = 0; -}; - -class Timer { -public: - Timer(Thread*, TimerClient*); - ~Timer(); - - // If a previous task is pending, it will be replaced with the new one. - void startOneShot(double intervalSeconds); - void stop(); - - bool isActive() const { return m_task; } - -private: - friend class TimerTask; - - TimerClient* m_client; - Thread* m_thread; - TimerTask* m_task; // weak pointer -}; - -} // namespace cc - -#endif diff --git a/cc/timer_unittest.cc b/cc/timer_unittest.cc deleted file mode 100644 index 9a540c1..0000000 --- a/cc/timer_unittest.cc +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "config.h" - -#include "cc/timer.h" - -#include "cc/test/scheduler_test_common.h" -#include "testing/gtest/include/gtest/gtest.h" - -using namespace cc; -using namespace WebKitTests; - -namespace { - -class TimerTest : public testing::Test, public TimerClient { -public: - TimerTest() : m_flag(false) { } - - void onTimerFired() { m_flag = true; } - -protected: - FakeThread m_thread; - bool m_flag; -}; - -TEST_F(TimerTest, OneShot) -{ - Timer timer(&m_thread, this); - timer.startOneShot(0.001); - EXPECT_TRUE(timer.isActive()); - m_thread.runPendingTask(); - EXPECT_FALSE(timer.isActive()); - EXPECT_TRUE(m_flag); - EXPECT_FALSE(m_thread.hasPendingTask()); -} - -TEST_F(TimerTest, StopManually) -{ - Timer timer(&m_thread, this); - timer.startOneShot(0.001); - EXPECT_TRUE(timer.isActive()); - timer.stop(); - EXPECT_FALSE(timer.isActive()); - - m_thread.runPendingTask(); - EXPECT_FALSE(m_flag); - EXPECT_FALSE(m_thread.hasPendingTask()); -} - -TEST_F(TimerTest, StopByScope) -{ - { - Timer timer(&m_thread, this); - timer.startOneShot(0.001); - } - - m_thread.runPendingTask(); - EXPECT_FALSE(m_flag); -} - -} diff --git a/webkit/compositor_bindings/ccthread_impl.cc b/webkit/compositor_bindings/ccthread_impl.cc deleted file mode 100644 index 2df53518..0000000 --- a/webkit/compositor_bindings/ccthread_impl.cc +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "config.h" -#include "ccthread_impl.h" - -#include "cc/completion_event.h" -#include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebThread.h" - -using cc::Thread; -using cc::CompletionEvent; - -namespace WebKit { - -// Task that, when runs, places the current thread ID into the provided -// pointer and signals a completion event. -// -// Does not provide a PassOwnPtr<GetThreadIDTask>::create method because -// the resulting object is always handed into a WebThread, which does not understand -// PassOwnPtrs. -class GetThreadIDTask : public WebThread::Task { -public: - GetThreadIDTask(base::PlatformThreadId* result, CompletionEvent* completion) - : m_completion(completion) - , m_result(result) { } - - virtual ~GetThreadIDTask() { } - - virtual void run() - { - *m_result = base::PlatformThread::CurrentId(); - m_completion->signal(); - } - -private: - CompletionEvent* m_completion; - base::PlatformThreadId* m_result; -}; - -// General adapter from a Thread::Task to a WebThread::Task. -class ThreadTaskAdapter : public WebThread::Task { -public: - explicit ThreadTaskAdapter(PassOwnPtr<Thread::Task> task) : m_task(task) { } - - virtual ~ThreadTaskAdapter() { } - - virtual void run() - { - m_task->performTask(); - } - -private: - OwnPtr<Thread::Task> m_task; -}; - -scoped_ptr<Thread> CCThreadImpl::createForCurrentThread() -{ - return scoped_ptr<Thread>(new CCThreadImpl(Platform::current()->currentThread(), true)).Pass(); -} - -scoped_ptr<Thread> CCThreadImpl::createForDifferentThread(WebThread* thread) -{ - return scoped_ptr<Thread>(new CCThreadImpl(thread, false)).Pass(); -} - -CCThreadImpl::~CCThreadImpl() -{ -} - -void CCThreadImpl::postTask(PassOwnPtr<Thread::Task> task) -{ - m_thread->postTask(new ThreadTaskAdapter(task)); -} - -void CCThreadImpl::postDelayedTask(PassOwnPtr<Thread::Task> task, long long delayMs) -{ - m_thread->postDelayedTask(new ThreadTaskAdapter(task), delayMs); -} - -base::PlatformThreadId CCThreadImpl::threadID() const -{ - return m_threadID; -} - -CCThreadImpl::CCThreadImpl(WebThread* thread, bool currentThread) - : m_thread(thread) -{ - if (currentThread) { - m_threadID = base::PlatformThread::CurrentId(); - return; - } - - // Get the threadId for the newly-created thread by running a task - // on that thread, blocking on the result. - CompletionEvent completion; - m_thread->postTask(new GetThreadIDTask(&m_threadID, &completion)); - completion.wait(); -} - -} // namespace WebKit diff --git a/webkit/compositor_bindings/ccthread_impl.h b/webkit/compositor_bindings/ccthread_impl.h deleted file mode 100644 index 259ca4a..0000000 --- a/webkit/compositor_bindings/ccthread_impl.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/memory/scoped_ptr.h" -#include "base/threading/platform_thread.h" -#include "cc/thread.h" -#include <wtf/OwnPtr.h> -#include <wtf/PassOwnPtr.h> - -#ifndef CCThreadImpl_h -#define CCThreadImpl_h - -namespace WebKit { - -class WebThread; - -// Implements Thread in terms of WebThread. -class CCThreadImpl : public cc::Thread { -public: - // Creates a CCThreadImpl wrapping the current thread. - static scoped_ptr<cc::Thread> createForCurrentThread(); - - // Creates a Thread wrapping a non-current WebThread. - static scoped_ptr<cc::Thread> createForDifferentThread(WebThread*); - - virtual ~CCThreadImpl(); - virtual void postTask(PassOwnPtr<cc::Thread::Task>); - virtual void postDelayedTask(PassOwnPtr<cc::Thread::Task>, long long delayMs); - base::PlatformThreadId threadID() const; - -private: - CCThreadImpl(WebThread*, bool currentThread); - - WebThread* m_thread; - base::PlatformThreadId m_threadID; -}; - -} // namespace WebKit - -#endif diff --git a/webkit/compositor_bindings/compositor_bindings.gyp b/webkit/compositor_bindings/compositor_bindings.gyp index ad734c3..309a984 100644 --- a/webkit/compositor_bindings/compositor_bindings.gyp +++ b/webkit/compositor_bindings/compositor_bindings.gyp @@ -5,8 +5,6 @@ { 'variables': { 'webkit_compositor_bindings_sources': [ - 'ccthread_impl.cc', - 'ccthread_impl.h', 'web_animation_curve_common.cc', 'web_animation_curve_common.h', 'web_animation_impl.cc', diff --git a/webkit/compositor_bindings/test/run_all_unittests.cc b/webkit/compositor_bindings/test/run_all_unittests.cc index a8a5cbd..818c008 100644 --- a/webkit/compositor_bindings/test/run_all_unittests.cc +++ b/webkit/compositor_bindings/test/run_all_unittests.cc @@ -4,16 +4,16 @@ #include "base/message_loop.h" #include "base/test/test_suite.h" -#include "cc/test/test_webkit_platform.h" -#include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" +#include "cc/proxy.h" +#include "cc/thread_impl.h" #include <gmock/gmock.h> int main(int argc, char** argv) { ::testing::InitGoogleMock(&argc, argv); TestSuite testSuite(argc, argv); - cc::TestWebKitPlatform platform; MessageLoop message_loop; - WebKit::Platform::initialize(&platform); + scoped_ptr<cc::Thread> mainCCThread = cc::ThreadImpl::createForCurrentThread(); + cc::Proxy::setMainThread(mainCCThread.get()); int result = testSuite.Run(); return result; diff --git a/webkit/compositor_bindings/web_compositor_impl.cc b/webkit/compositor_bindings/web_compositor_impl.cc index 5d0a2e9..dcf5ec3 100644 --- a/webkit/compositor_bindings/web_compositor_impl.cc +++ b/webkit/compositor_bindings/web_compositor_impl.cc @@ -13,7 +13,7 @@ #include "cc/layer_tree_host.h" #include "cc/proxy.h" #include "cc/settings.h" -#include "ccthread_impl.h" +#include "cc/thread_impl.h" #include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" #include "webkit/glue/webthread_impl.h" @@ -45,10 +45,12 @@ void WebCompositorImpl::initialize(WebThread* implThread) ASSERT(!s_initialized); s_initialized = true; - s_mainThread = CCThreadImpl::createForCurrentThread().release(); + s_mainThread = cc::ThreadImpl::createForCurrentThread().release(); Proxy::setMainThread(s_mainThread); if (implThread) { - s_implThread = CCThreadImpl::createForDifferentThread(implThread).release(); + webkit_glue::WebThreadImpl* webThreadImpl = static_cast<webkit_glue::WebThreadImpl*>(implThread); + MessageLoop* implMessageLoop = webThreadImpl->message_loop(); + s_implThread = cc::ThreadImpl::createForDifferentThread(implMessageLoop->message_loop_proxy()).release(); Proxy::setImplThread(s_implThread); } else Proxy::setImplThread(0); diff --git a/webkit/compositor_bindings/web_layer_tree_view_unittest.cc b/webkit/compositor_bindings/web_layer_tree_view_unittest.cc index 6fc3df0..3d40bde 100644 --- a/webkit/compositor_bindings/web_layer_tree_view_unittest.cc +++ b/webkit/compositor_bindings/web_layer_tree_view_unittest.cc @@ -4,19 +4,21 @@ #include "config.h" +#include "base/cancelable_callback.h" #include "base/memory/ref_counted.h" +#include "base/threading/thread.h" +#include "cc/proxy.h" +#include "cc/thread_impl.h" #include "cc/test/compositor_fake_web_graphics_context_3d.h" #include "cc/test/fake_web_compositor_output_surface.h" #include "testing/gmock/include/gmock/gmock.h" -#include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebCompositorSupport.h" #include "third_party/WebKit/Source/Platform/chromium/public/WebLayer.h" #include "third_party/WebKit/Source/Platform/chromium/public/WebLayerTreeViewClient.h" #include "third_party/WebKit/Source/Platform/chromium/public/WebLayerTreeView.h" #include "third_party/WebKit/Source/Platform/chromium/public/WebThread.h" -#include "web_layer_impl.h" -#include "web_layer_tree_view_impl.h" -#include "web_layer_tree_view_test_common.h" +#include "webkit/compositor_bindings/test/web_layer_tree_view_test_common.h" +#include "webkit/compositor_bindings/web_layer_impl.h" +#include "webkit/compositor_bindings/web_layer_tree_view_impl.h" using namespace WebKit; using testing::Mock; @@ -28,7 +30,7 @@ class MockWebLayerTreeViewClientForThreadedTests : public MockWebLayerTreeViewCl public: virtual void didBeginFrame() OVERRIDE { - WebKit::Platform::current()->currentThread()->exitRunLoop(); + MessageLoop::current()->Quit(); MockWebLayerTreeViewClient::didBeginFrame(); } }; @@ -55,7 +57,6 @@ public: m_rootLayer.reset(); m_view.reset(); - WebKit::Platform::current()->compositorSupport()->shutdown(); } protected: @@ -72,7 +73,6 @@ protected: virtual void initializeCompositor() OVERRIDE { - WebKit::Platform::current()->compositorSupport()->initialize(0); } virtual WebLayerTreeViewClient* client() OVERRIDE @@ -83,78 +83,30 @@ protected: MockWebLayerTreeViewClient m_client; }; -class CancelableTaskWrapper : public base::RefCounted<CancelableTaskWrapper> { - class Task : public WebThread::Task { - public: - Task(CancelableTaskWrapper* cancelableTask) - : m_cancelableTask(cancelableTask) - { - } - - private: - virtual void run() OVERRIDE - { - m_cancelableTask->runIfNotCanceled(); - } - - scoped_refptr<CancelableTaskWrapper> m_cancelableTask; - }; - -public: - CancelableTaskWrapper(scoped_ptr<WebThread::Task> task) - : m_task(task.Pass()) - { - } - - void cancel() - { - m_task.reset(); - } - - WebThread::Task* createTask() - { - ASSERT(m_task); - return new Task(this); - } - - void runIfNotCanceled() - { - if (!m_task) - return; - m_task->run(); - m_task.reset(); - } - -private: - friend class base::RefCounted<CancelableTaskWrapper>; - ~CancelableTaskWrapper() { } - - scoped_ptr<WebThread::Task> m_task; -}; - class WebLayerTreeViewThreadedTest : public WebLayerTreeViewTestBase { protected: - class TimeoutTask : public WebThread::Task { - virtual void run() OVERRIDE - { - WebKit::Platform::current()->currentThread()->exitRunLoop(); - } - }; + virtual ~WebLayerTreeViewThreadedTest() + { + cc::Proxy::setImplThread(0); + } void composite() { m_view->setNeedsRedraw(); - scoped_refptr<CancelableTaskWrapper> timeoutTask(new CancelableTaskWrapper(scoped_ptr<WebThread::Task>(new TimeoutTask()))); - WebKit::Platform::current()->currentThread()->postDelayedTask(timeoutTask->createTask(), 5000); - WebKit::Platform::current()->currentThread()->enterRunLoop(); - timeoutTask->cancel(); + base::CancelableClosure timeout(base::Bind(&MessageLoop::Quit, base::Unretained(MessageLoop::current()))); + MessageLoop::current()->PostDelayedTask(FROM_HERE, + timeout.callback(), + base::TimeDelta::FromSeconds(5)); + MessageLoop::current()->Run(); m_view->finishAllRendering(); } virtual void initializeCompositor() OVERRIDE { - m_webThread.reset(WebKit::Platform::current()->createThread("WebLayerTreeViewTest")); - WebKit::Platform::current()->compositorSupport()->initialize(m_webThread.get()); + m_implThread.reset(new base::Thread("ThreadedTest")); + ASSERT_TRUE(m_implThread->Start()); + m_implCCThread = cc::ThreadImpl::createForDifferentThread(m_implThread->message_loop_proxy()); + cc::Proxy::setImplThread(m_implCCThread.get()); } virtual WebLayerTreeViewClient* client() OVERRIDE @@ -163,7 +115,9 @@ protected: } MockWebLayerTreeViewClientForThreadedTests m_client; - scoped_ptr<WebThread> m_webThread; + scoped_ptr<base::Thread> m_implThread; + scoped_ptr<cc::Thread> m_implCCThread; + base::CancelableClosure m_timeout; }; TEST_F(WebLayerTreeViewSingleThreadTest, InstrumentationCallbacks) diff --git a/webkit/compositor_bindings/web_layer_unittest.cc b/webkit/compositor_bindings/web_layer_unittest.cc index 3eae029..b432c50 100644 --- a/webkit/compositor_bindings/web_layer_unittest.cc +++ b/webkit/compositor_bindings/web_layer_unittest.cc @@ -6,7 +6,6 @@ #include <public/WebLayer.h> #include "cc/test/compositor_fake_web_graphics_context_3d.h" -#include "cc/test/web_compositor_initializer.h" #include "web_layer_impl.h" #include "web_layer_tree_view_test_common.h" #include <public/WebContentLayer.h> @@ -40,7 +39,6 @@ public: class WebLayerTest : public Test { public: WebLayerTest() - : m_compositorInitializer(0) { } @@ -62,7 +60,6 @@ public: } protected: - WebKitTests::WebCompositorInitializer m_compositorInitializer; MockWebLayerTreeViewClient m_client; scoped_ptr<WebLayer> m_rootLayer; scoped_ptr<WebLayerTreeView> m_view; |