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

Side by Side Diff: content/renderer/media/render_media_log.cc

Issue 1846913004: MediaLog: Replace task posting in AddEvent with lock (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Initializes |ipc_send_pending_|. Comment clean-ups. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/render_media_log.h" 5 #include "content/renderer/media/render_media_log.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
(...skipping 17 matching lines...) Expand all
28 } 28 }
29 } 29 }
30 30
31 } // namespace 31 } // namespace
32 32
33 namespace content { 33 namespace content {
34 34
35 RenderMediaLog::RenderMediaLog() 35 RenderMediaLog::RenderMediaLog()
36 : task_runner_(base::ThreadTaskRunnerHandle::Get()), 36 : task_runner_(base::ThreadTaskRunnerHandle::Get()),
37 tick_clock_(new base::DefaultTickClock()), 37 tick_clock_(new base::DefaultTickClock()),
38 last_ipc_send_time_(tick_clock_->NowTicks()) { 38 last_ipc_send_time_(tick_clock_->NowTicks()),
39 ipc_send_pending_(false) {
39 DCHECK(RenderThread::Get()) 40 DCHECK(RenderThread::Get())
40 << "RenderMediaLog must be constructed on the render thread"; 41 << "RenderMediaLog must be constructed on the render thread";
41 } 42 }
42 43
43 void RenderMediaLog::AddEvent(scoped_ptr<media::MediaLogEvent> event) { 44 void RenderMediaLog::AddEvent(scoped_ptr<media::MediaLogEvent> event) {
44 // Always post to preserve the correct order of events. 45 {
45 // TODO(xhwang): Consider using sorted containers to keep the order and 46 base::AutoLock auto_lock(lock_);
46 // avoid extra posting.
47 task_runner_->PostTask(FROM_HERE,
48 base::Bind(&RenderMediaLog::AddEventInternal, this,
49 base::Passed(&event)));
50 }
51 47
52 void RenderMediaLog::AddEventInternal(scoped_ptr<media::MediaLogEvent> event) { 48 Log(event.get());
xhwang 2016/04/01 05:42:55 nit: This can be outside of the lock.
wolenetz 2016/04/04 18:30:32 Done.
53 DCHECK(task_runner_->BelongsToCurrentThread());
54 49
55 Log(event.get()); 50 // Keep track of the latest buffered extents properties to avoid sending
51 // thousands of events over IPC. See http://crbug.com/352585 for details.
52 if (event->type == media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED)
53 last_buffered_extents_changed_event_.swap(event);
54 else
55 queued_media_events_.push_back(*event);
56 56
57 // If there is an event waiting to be sent, there must be a send task pending. 57 if (ipc_send_pending_)
58 const bool delayed_ipc_send_pending = 58 return;
59 !queued_media_events_.empty() || last_buffered_extents_changed_event_;
60 59
61 // Keep track of the latest buffered extents properties to avoid sending 60 ipc_send_pending_ = true;
62 // thousands of events over IPC. See http://crbug.com/352585 for details.
63 if (event->type == media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED)
64 last_buffered_extents_changed_event_.swap(event);
65 else
66 queued_media_events_.push_back(*event);
67 61
68 if (delayed_ipc_send_pending) 62 // Delay until it's been a second since the last ipc message was sent.
69 return; 63 base::TimeDelta delay_for_next_ipc_send =
70 64 base::TimeDelta::FromSeconds(1) -
71 // Delay until it's been a second since the last ipc message was sent. 65 (tick_clock_->NowTicks() - last_ipc_send_time_);
72 base::TimeDelta delay_for_next_ipc_send = 66 if (delay_for_next_ipc_send > base::TimeDelta()) {
73 base::TimeDelta::FromSeconds(1) - 67 task_runner_->PostDelayedTask(
74 (tick_clock_->NowTicks() - last_ipc_send_time_); 68 FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this),
75 if (delay_for_next_ipc_send > base::TimeDelta()) { 69 delay_for_next_ipc_send);
76 task_runner_->PostDelayedTask( 70 return;
77 FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this), 71 }
78 delay_for_next_ipc_send);
79 return;
80 } 72 }
81 73
82 // It's been more than a second so send now. 74 // It's been more than a second so send ASAP.
83 SendQueuedMediaEvents(); 75 if (task_runner_->BelongsToCurrentThread())
76 SendQueuedMediaEvents();
77 else
78 task_runner_->PostTask(
79 FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this));
84 } 80 }
85 81
86 void RenderMediaLog::SendQueuedMediaEvents() { 82 void RenderMediaLog::SendQueuedMediaEvents() {
87 DCHECK(task_runner_->BelongsToCurrentThread()); 83 DCHECK(task_runner_->BelongsToCurrentThread());
84 base::AutoLock auto_lock(lock_);
85
86 DCHECK(ipc_send_pending_);
87 ipc_send_pending_ = false;
88 88
89 if (last_buffered_extents_changed_event_) { 89 if (last_buffered_extents_changed_event_) {
90 queued_media_events_.push_back(*last_buffered_extents_changed_event_); 90 queued_media_events_.push_back(*last_buffered_extents_changed_event_);
91 last_buffered_extents_changed_event_.reset(); 91 last_buffered_extents_changed_event_.reset();
92 } 92 }
93 93
94 RenderThread::Get()->Send( 94 RenderThread::Get()->Send(
95 new ViewHostMsg_MediaLogEvents(queued_media_events_)); 95 new ViewHostMsg_MediaLogEvents(queued_media_events_));
96 queued_media_events_.clear(); 96 queued_media_events_.clear();
97 last_ipc_send_time_ = tick_clock_->NowTicks(); 97 last_ipc_send_time_ = tick_clock_->NowTicks();
xhwang 2016/04/01 05:42:55 nit: Send involves serialization and could be slow
wolenetz 2016/04/04 18:30:32 Good idea. Note that if Send() becomes severely sl
98 } 98 }
99 99
100 RenderMediaLog::~RenderMediaLog() { 100 RenderMediaLog::~RenderMediaLog() {
101 } 101 }
102 102
103 void RenderMediaLog::SetTickClockForTesting( 103 void RenderMediaLog::SetTickClockForTesting(
104 scoped_ptr<base::TickClock> tick_clock) { 104 scoped_ptr<base::TickClock> tick_clock) {
105 base::AutoLock auto_lock(lock_);
105 tick_clock_.swap(tick_clock); 106 tick_clock_.swap(tick_clock);
106 last_ipc_send_time_ = tick_clock_->NowTicks(); 107 last_ipc_send_time_ = tick_clock_->NowTicks();
107 } 108 }
108 109
109 void RenderMediaLog::SetTaskRunnerForTesting( 110 void RenderMediaLog::SetTaskRunnerForTesting(
110 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) { 111 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
112 base::AutoLock auto_lock(lock_);
xhwang 2016/04/01 05:42:55 It seems odd the protect the task runner especiall
wolenetz 2016/04/04 18:30:32 Yeah. This does seem odd. I'll not lock in this me
111 task_runner_ = task_runner; 113 task_runner_ = task_runner;
112 } 114 }
113 115
114 } // namespace content 116 } // namespace content
OLDNEW
« content/renderer/media/render_media_log.h ('K') | « content/renderer/media/render_media_log.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698