Use SingleThreadTaskRunner instead of MessageLoopProxy in remoting/host.
Also includes various cleanups. E.g. main_thread was renamed to capture_thread to reflect what the thread is used for.
Review URL: https://chromiumcodereview.appspot.com/10572005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@145227 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/remoting/host/screen_recorder.cc b/remoting/host/screen_recorder.cc
index e7b414c9..20b305a9 100644
--- a/remoting/host/screen_recorder.cc
+++ b/remoting/host/screen_recorder.cc
@@ -32,14 +32,14 @@
static const int kMaxRecordings = 2;
ScreenRecorder::ScreenRecorder(
- MessageLoop* capture_loop,
- MessageLoop* encode_loop,
- base::MessageLoopProxy* network_loop,
+ scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner,
+ scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner,
+ scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
Capturer* capturer,
Encoder* encoder)
- : capture_loop_(capture_loop),
- encode_loop_(encode_loop),
- network_loop_(network_loop),
+ : capture_task_runner_(capture_task_runner),
+ encode_task_runner_(encode_task_runner),
+ network_task_runner_(network_task_runner),
capturer_(capturer),
encoder_(encoder),
network_stopped_(false),
@@ -48,21 +48,21 @@
recordings_(0),
frame_skipped_(false),
sequence_number_(0) {
- DCHECK(capture_loop_);
- DCHECK(encode_loop_);
- DCHECK(network_loop_);
+ DCHECK(capture_task_runner_);
+ DCHECK(encode_task_runner_);
+ DCHECK(network_task_runner_);
}
// Public methods --------------------------------------------------------------
void ScreenRecorder::Start() {
- capture_loop_->PostTask(
+ capture_task_runner_->PostTask(
FROM_HERE, base::Bind(&ScreenRecorder::DoStart, this));
}
void ScreenRecorder::Stop(const base::Closure& done_task) {
- if (MessageLoop::current() != capture_loop_) {
- capture_loop_->PostTask(FROM_HERE, base::Bind(
+ if (!capture_task_runner_->BelongsToCurrentThread()) {
+ capture_task_runner_->PostTask(FROM_HERE, base::Bind(
&ScreenRecorder::Stop, this, done_task));
return;
}
@@ -72,20 +72,20 @@
capturer()->Stop();
capture_timer_.reset();
- network_loop_->PostTask(FROM_HERE, base::Bind(
+ network_task_runner_->PostTask(FROM_HERE, base::Bind(
&ScreenRecorder::DoStopOnNetworkThread, this, done_task));
}
void ScreenRecorder::AddConnection(ConnectionToClient* connection) {
- DCHECK(network_loop_->BelongsToCurrentThread());
+ DCHECK(network_task_runner_->BelongsToCurrentThread());
connections_.push_back(connection);
- capture_loop_->PostTask(
+ capture_task_runner_->PostTask(
FROM_HERE, base::Bind(&ScreenRecorder::DoInvalidateFullScreen, this));
}
void ScreenRecorder::RemoveConnection(ConnectionToClient* connection) {
- DCHECK(network_loop_->BelongsToCurrentThread());
+ DCHECK(network_task_runner_->BelongsToCurrentThread());
ConnectionToClientList::iterator it =
std::find(connections_.begin(), connections_.end(), connection);
@@ -95,14 +95,14 @@
}
void ScreenRecorder::RemoveAllConnections() {
- DCHECK(network_loop_->BelongsToCurrentThread());
+ DCHECK(network_task_runner_->BelongsToCurrentThread());
connections_.clear();
}
void ScreenRecorder::UpdateSequenceNumber(int64 sequence_number) {
// Sequence number is used and written only on the capture thread.
- if (MessageLoop::current() != capture_loop_) {
- capture_loop_->PostTask(
+ if (!capture_task_runner_->BelongsToCurrentThread()) {
+ capture_task_runner_->PostTask(
FROM_HERE, base::Bind(&ScreenRecorder::UpdateSequenceNumber,
this, sequence_number));
return;
@@ -117,26 +117,26 @@
}
Capturer* ScreenRecorder::capturer() {
- DCHECK_EQ(capture_loop_, MessageLoop::current());
+ DCHECK(capture_task_runner_->BelongsToCurrentThread());
DCHECK(capturer_);
return capturer_;
}
Encoder* ScreenRecorder::encoder() {
- DCHECK_EQ(encode_loop_, MessageLoop::current());
+ DCHECK(encode_task_runner_->BelongsToCurrentThread());
DCHECK(encoder_.get());
return encoder_.get();
}
bool ScreenRecorder::is_recording() {
- DCHECK_EQ(capture_loop_, MessageLoop::current());
+ DCHECK(capture_task_runner_->BelongsToCurrentThread());
return capture_timer_.get() != NULL;
}
// Capturer thread -------------------------------------------------------------
void ScreenRecorder::DoStart() {
- DCHECK_EQ(capture_loop_, MessageLoop::current());
+ DCHECK(capture_task_runner_->BelongsToCurrentThread());
if (is_recording()) {
NOTREACHED() << "Record session already started.";
@@ -153,7 +153,7 @@
}
void ScreenRecorder::StartCaptureTimer() {
- DCHECK_EQ(capture_loop_, MessageLoop::current());
+ DCHECK(capture_task_runner_->BelongsToCurrentThread());
capture_timer_->Start(FROM_HERE,
scheduler_.NextCaptureDelay(),
@@ -162,7 +162,7 @@
}
void ScreenRecorder::DoCapture() {
- DCHECK_EQ(capture_loop_, MessageLoop::current());
+ DCHECK(capture_task_runner_->BelongsToCurrentThread());
// Make sure we have at most two oustanding recordings. We can simply return
// if we can't make a capture now, the next capture will be started by the
// end of an encode operation.
@@ -193,7 +193,7 @@
void ScreenRecorder::CaptureDoneCallback(
scoped_refptr<CaptureData> capture_data) {
- DCHECK_EQ(capture_loop_, MessageLoop::current());
+ DCHECK(capture_task_runner_->BelongsToCurrentThread());
if (!is_recording())
return;
@@ -213,24 +213,24 @@
capture_data->set_client_sequence_number(sequence_number_);
}
- encode_loop_->PostTask(
+ encode_task_runner_->PostTask(
FROM_HERE, base::Bind(&ScreenRecorder::DoEncode, this, capture_data));
}
void ScreenRecorder::CursorShapeChangedCallback(
scoped_ptr<protocol::CursorShapeInfo> cursor_shape) {
- DCHECK_EQ(capture_loop_, MessageLoop::current());
+ DCHECK(capture_task_runner_->BelongsToCurrentThread());
if (!is_recording())
return;
- network_loop_->PostTask(
+ network_task_runner_->PostTask(
FROM_HERE, base::Bind(&ScreenRecorder::DoSendCursorShape, this,
base::Passed(cursor_shape.Pass())));
}
void ScreenRecorder::DoFinishOneRecording() {
- DCHECK_EQ(capture_loop_, MessageLoop::current());
+ DCHECK(capture_task_runner_->BelongsToCurrentThread());
if (!is_recording())
return;
@@ -247,7 +247,7 @@
}
void ScreenRecorder::DoInvalidateFullScreen() {
- DCHECK_EQ(capture_loop_, MessageLoop::current());
+ DCHECK(capture_task_runner_->BelongsToCurrentThread());
capturer_->InvalidateFullScreen();
}
@@ -255,7 +255,7 @@
// Network thread --------------------------------------------------------------
void ScreenRecorder::DoSendVideoPacket(scoped_ptr<VideoPacket> packet) {
- DCHECK(network_loop_->BelongsToCurrentThread());
+ DCHECK(network_task_runner_->BelongsToCurrentThread());
if (network_stopped_ || connections_.empty())
return;
@@ -271,17 +271,17 @@
}
void ScreenRecorder::VideoFrameSentCallback() {
- DCHECK(network_loop_->BelongsToCurrentThread());
+ DCHECK(network_task_runner_->BelongsToCurrentThread());
if (network_stopped_)
return;
- capture_loop_->PostTask(
+ capture_task_runner_->PostTask(
FROM_HERE, base::Bind(&ScreenRecorder::DoFinishOneRecording, this));
}
void ScreenRecorder::DoStopOnNetworkThread(const base::Closure& done_task) {
- DCHECK(network_loop_->BelongsToCurrentThread());
+ DCHECK(network_task_runner_->BelongsToCurrentThread());
// There could be tasks on the network thread when this method is being
// executed. By setting the flag we'll not post anymore tasks from network
@@ -291,14 +291,14 @@
// sequence.
network_stopped_ = true;
- encode_loop_->PostTask(
+ encode_task_runner_->PostTask(
FROM_HERE, base::Bind(&ScreenRecorder::DoStopOnEncodeThread,
this, done_task));
}
void ScreenRecorder::DoSendCursorShape(
scoped_ptr<protocol::CursorShapeInfo> cursor_shape) {
- DCHECK(network_loop_->BelongsToCurrentThread());
+ DCHECK(network_task_runner_->BelongsToCurrentThread());
if (network_stopped_ || connections_.empty())
return;
@@ -312,7 +312,7 @@
void ScreenRecorder::DoEncode(
scoped_refptr<CaptureData> capture_data) {
- DCHECK_EQ(encode_loop_, MessageLoop::current());
+ DCHECK(encode_task_runner_->BelongsToCurrentThread());
if (encoder_stopped_)
return;
@@ -322,7 +322,7 @@
// Send an empty video packet to keep network active.
scoped_ptr<VideoPacket> packet(new VideoPacket());
packet->set_flags(VideoPacket::LAST_PARTITION);
- network_loop_->PostTask(
+ network_task_runner_->PostTask(
FROM_HERE, base::Bind(&ScreenRecorder::DoSendVideoPacket,
this, base::Passed(packet.Pass())));
return;
@@ -335,19 +335,19 @@
}
void ScreenRecorder::DoStopOnEncodeThread(const base::Closure& done_task) {
- DCHECK_EQ(encode_loop_, MessageLoop::current());
+ DCHECK(encode_task_runner_->BelongsToCurrentThread());
encoder_stopped_ = true;
// When this method is being executed there are no more tasks on encode thread
// for this object. We can then post a task to capture thread to finish the
// stop sequence.
- capture_loop_->PostTask(FROM_HERE, done_task);
+ capture_task_runner_->PostTask(FROM_HERE, done_task);
}
void ScreenRecorder::EncodedDataAvailableCallback(
scoped_ptr<VideoPacket> packet) {
- DCHECK_EQ(encode_loop_, MessageLoop::current());
+ DCHECK(encode_task_runner_->BelongsToCurrentThread());
if (encoder_stopped_)
return;
@@ -361,7 +361,7 @@
scheduler_.RecordEncodeTime(encode_time);
}
- network_loop_->PostTask(
+ network_task_runner_->PostTask(
FROM_HERE, base::Bind(&ScreenRecorder::DoSendVideoPacket, this,
base::Passed(packet.Pass())));
}