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

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 watk@'s comments from PS4. 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
« no previous file with comments | « content/renderer/media/render_media_log.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 // For enforcing delay until it's been a second since the last ipc message was
58 const bool delayed_ipc_send_pending = 48 // sent.
59 !queued_media_events_.empty() || last_buffered_extents_changed_event_; 49 base::TimeDelta delay_for_next_ipc_send;
60 50
61 // Keep track of the latest buffered extents properties to avoid sending 51 {
62 // thousands of events over IPC. See http://crbug.com/352585 for details. 52 base::AutoLock auto_lock(lock_);
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 53
68 if (delayed_ipc_send_pending) 54 // Keep track of the latest buffered extents properties to avoid sending
69 return; 55 // thousands of events over IPC. See http://crbug.com/352585 for details.
56 if (event->type == media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED)
57 last_buffered_extents_changed_event_.swap(event);
58 else
59 queued_media_events_.push_back(*event);
70 60
71 // Delay until it's been a second since the last ipc message was sent. 61 if (ipc_send_pending_)
72 base::TimeDelta delay_for_next_ipc_send = 62 return;
73 base::TimeDelta::FromSeconds(1) - 63
74 (tick_clock_->NowTicks() - last_ipc_send_time_); 64 ipc_send_pending_ = true;
65 delay_for_next_ipc_send = base::TimeDelta::FromSeconds(1) -
66 (tick_clock_->NowTicks() - last_ipc_send_time_);
67 }
68
75 if (delay_for_next_ipc_send > base::TimeDelta()) { 69 if (delay_for_next_ipc_send > base::TimeDelta()) {
76 task_runner_->PostDelayedTask( 70 task_runner_->PostDelayedTask(
77 FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this), 71 FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this),
78 delay_for_next_ipc_send); 72 delay_for_next_ipc_send);
79 return; 73 return;
80 } 74 }
81 75
82 // It's been more than a second so send now. 76 // It's been more than a second so send ASAP.
83 SendQueuedMediaEvents(); 77 if (task_runner_->BelongsToCurrentThread()) {
78 SendQueuedMediaEvents();
79 return;
80 }
81 task_runner_->PostTask(
82 FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this));
84 } 83 }
85 84
86 void RenderMediaLog::SendQueuedMediaEvents() { 85 void RenderMediaLog::SendQueuedMediaEvents() {
87 DCHECK(task_runner_->BelongsToCurrentThread()); 86 DCHECK(task_runner_->BelongsToCurrentThread());
88 87
89 if (last_buffered_extents_changed_event_) { 88 std::vector<media::MediaLogEvent> events_to_send;
90 queued_media_events_.push_back(*last_buffered_extents_changed_event_); 89 {
91 last_buffered_extents_changed_event_.reset(); 90 base::AutoLock auto_lock(lock_);
91
92 DCHECK(ipc_send_pending_);
93 ipc_send_pending_ = false;
94
95 if (last_buffered_extents_changed_event_) {
96 queued_media_events_.push_back(*last_buffered_extents_changed_event_);
97 last_buffered_extents_changed_event_.reset();
98 }
99
100 queued_media_events_.swap(events_to_send);
101 last_ipc_send_time_ = tick_clock_->NowTicks();
92 } 102 }
93 103
94 RenderThread::Get()->Send( 104 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 } 105 }
99 106
100 RenderMediaLog::~RenderMediaLog() { 107 RenderMediaLog::~RenderMediaLog() {
101 } 108 }
102 109
103 void RenderMediaLog::SetTickClockForTesting( 110 void RenderMediaLog::SetTickClockForTesting(
104 scoped_ptr<base::TickClock> tick_clock) { 111 scoped_ptr<base::TickClock> tick_clock) {
112 base::AutoLock auto_lock(lock_);
105 tick_clock_.swap(tick_clock); 113 tick_clock_.swap(tick_clock);
106 last_ipc_send_time_ = tick_clock_->NowTicks(); 114 last_ipc_send_time_ = tick_clock_->NowTicks();
107 } 115 }
108 116
109 void RenderMediaLog::SetTaskRunnerForTesting( 117 void RenderMediaLog::SetTaskRunnerForTesting(
110 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) { 118 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
111 task_runner_ = task_runner; 119 task_runner_ = task_runner;
112 } 120 }
113 121
114 } // namespace content 122 } // namespace content
OLDNEW
« no previous file with comments | « 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