Index: content/renderer/render_thread_impl.cc |
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
index 99cb1a1c1a2d79079fe38ccedce61dd2064c0fed..671e14c612a762ffc3aa64f889530e1f03495064 100644 |
--- a/content/renderer/render_thread_impl.cc |
+++ b/content/renderer/render_thread_impl.cc |
@@ -669,7 +669,18 @@ void RenderThreadImpl::EnsureWebKitInitialized() { |
#endif |
if (!compositor_message_loop_proxy_.get()) { |
compositor_thread_.reset(new base::Thread("Compositor")); |
+#if defined(OS_POSIX) |
+ // Workaround for crbug.com/293736 |
+ // On Posix, MessagePumpDefault uses system time, so delayed tasks (for |
+ // compositor scheduling) work incorrectly across system time changes |
+ // (e.g. tlsdate). So instead, use an IO loop, which uses libevent, that |
+ // uses monotonic time (immune to these problems). |
+ base::Thread::Options options; |
+ options.message_loop_type = base::MessageLoop::TYPE_IO; |
+ compositor_thread_->StartWithOptions(options); |
+#else |
compositor_thread_->Start(); |
+#endif |
#if defined(OS_ANDROID) |
compositor_thread_->SetPriority(base::kThreadPriority_Display); |
#endif |
@@ -1294,7 +1305,18 @@ RenderThreadImpl::GetMediaThreadMessageLoopProxy() { |
DCHECK(message_loop() == base::MessageLoop::current()); |
if (!media_thread_) { |
media_thread_.reset(new base::Thread("Media")); |
+#if defined(OS_POSIX) |
+ // Workaround for crbug.com/293736 |
+ // On Posix, MessagePumpDefault uses system time, so delayed tasks (for |
+ // compositor scheduling) work incorrectly across system time changes |
+ // (e.g. tlsdate). So instead, use an IO loop, which uses libevent, that |
+ // uses monotonic time (immune to these problems). |
+ base::Thread::Options options; |
+ options.message_loop_type = base::MessageLoop::TYPE_IO; |
+ media_thread_->StartWithOptions(options); |
+#else |
media_thread_->Start(); |
+#endif |
} |
return media_thread_->message_loop_proxy(); |
} |