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

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: Addresses all comments so far. 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 // TODO(xhwang): Consider using sorted containers to keep the order and
46 // avoid extra posting.
47 task_runner_->PostTask(FROM_HERE,
48 base::Bind(&RenderMediaLog::AddEventInternal, this,
49 base::Passed(&event)));
50 }
51
52 void RenderMediaLog::AddEventInternal(scoped_ptr<media::MediaLogEvent> event) {
53 DCHECK(task_runner_->BelongsToCurrentThread());
54
55 Log(event.get()); 45 Log(event.get());
56 46
57 // If there is an event waiting to be sent, there must be a send task pending. 47 {
58 const bool delayed_ipc_send_pending = 48 base::AutoLock auto_lock(lock_);
59 !queued_media_events_.empty() || last_buffered_extents_changed_event_;
60 49
61 // Keep track of the latest buffered extents properties to avoid sending 50 // Keep track of the latest buffered extents properties to avoid sending
62 // thousands of events over IPC. See http://crbug.com/352585 for details. 51 // thousands of events over IPC. See http://crbug.com/352585 for details.
63 if (event->type == media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED) 52 if (event->type == media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED)
64 last_buffered_extents_changed_event_.swap(event); 53 last_buffered_extents_changed_event_.swap(event);
65 else 54 else
66 queued_media_events_.push_back(*event); 55 queued_media_events_.push_back(*event);
67 56
68 if (delayed_ipc_send_pending) 57 if (ipc_send_pending_)
69 return; 58 return;
70 59
71 // Delay until it's been a second since the last ipc message was sent. 60 ipc_send_pending_ = true;
72 base::TimeDelta delay_for_next_ipc_send = 61
73 base::TimeDelta::FromSeconds(1) - 62 // Delay until it's been a second since the last ipc message was sent.
74 (tick_clock_->NowTicks() - last_ipc_send_time_); 63 base::TimeDelta delay_for_next_ipc_send =
75 if (delay_for_next_ipc_send > base::TimeDelta()) { 64 base::TimeDelta::FromSeconds(1) -
76 task_runner_->PostDelayedTask( 65 (tick_clock_->NowTicks() - last_ipc_send_time_);
77 FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this), 66 if (delay_for_next_ipc_send > base::TimeDelta()) {
78 delay_for_next_ipc_send); 67 task_runner_->PostDelayedTask(
watk 2016/04/04 20:32:21 Looks like this doesn't necessarily have to be don
wolenetz 2016/04/04 20:47:55 Moved outside the lock.
79 return; 68 FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this),
69 delay_for_next_ipc_send);
70 return;
71 }
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));
watk 2016/04/04 20:32:21 braces for multi-line statement
wolenetz 2016/04/04 20:47:55 Good catch. git cl format split the line but didn'
84 } 80 }
85 81
86 void RenderMediaLog::SendQueuedMediaEvents() { 82 void RenderMediaLog::SendQueuedMediaEvents() {
87 DCHECK(task_runner_->BelongsToCurrentThread()); 83 DCHECK(task_runner_->BelongsToCurrentThread());
88 84
89 if (last_buffered_extents_changed_event_) { 85 std::vector<media::MediaLogEvent> events_to_send;
90 queued_media_events_.push_back(*last_buffered_extents_changed_event_); 86 {
91 last_buffered_extents_changed_event_.reset(); 87 base::AutoLock auto_lock(lock_);
88
89 DCHECK(ipc_send_pending_);
90 ipc_send_pending_ = false;
91
92 if (last_buffered_extents_changed_event_) {
93 queued_media_events_.push_back(*last_buffered_extents_changed_event_);
94 last_buffered_extents_changed_event_.reset();
95 }
96
97 queued_media_events_.swap(events_to_send);
98 last_ipc_send_time_ = tick_clock_->NowTicks();
92 } 99 }
93 100
94 RenderThread::Get()->Send( 101 RenderThread::Get()->Send(new ViewHostMsg_MediaLogEvents(events_to_send));
95 new ViewHostMsg_MediaLogEvents(queued_media_events_));
96 queued_media_events_.clear();
97 last_ipc_send_time_ = tick_clock_->NowTicks();
98 } 102 }
99 103
100 RenderMediaLog::~RenderMediaLog() { 104 RenderMediaLog::~RenderMediaLog() {
101 } 105 }
102 106
103 void RenderMediaLog::SetTickClockForTesting( 107 void RenderMediaLog::SetTickClockForTesting(
104 scoped_ptr<base::TickClock> tick_clock) { 108 scoped_ptr<base::TickClock> tick_clock) {
109 base::AutoLock auto_lock(lock_);
105 tick_clock_.swap(tick_clock); 110 tick_clock_.swap(tick_clock);
106 last_ipc_send_time_ = tick_clock_->NowTicks(); 111 last_ipc_send_time_ = tick_clock_->NowTicks();
107 } 112 }
108 113
109 void RenderMediaLog::SetTaskRunnerForTesting( 114 void RenderMediaLog::SetTaskRunnerForTesting(
110 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) { 115 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
111 task_runner_ = task_runner; 116 task_runner_ = task_runner;
112 } 117 }
113 118
114 } // namespace content 119 } // 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