Skip to content
Snippets Groups Projects
Commit 24d5cc6b authored by sergeyu@chromium.org's avatar sergeyu@chromium.org
Browse files

Fix crash in JingleThread caused by non-nestable tasks.

BUG=None
TEST=Unittests

Review URL: http://codereview.chromium.org/6003003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@70115 0039d316-1c4b-4281-b951-d872f2087c98
parent 49b60d92
No related branches found
No related tags found
No related merge requests found
...@@ -42,12 +42,6 @@ class JingleThread::JingleMessagePump : public base::MessagePump, ...@@ -42,12 +42,6 @@ class JingleThread::JingleMessagePump : public base::MessagePump,
// TODO(sergeyu): Remove it when JingleThread moved on Chromium's // TODO(sergeyu): Remove it when JingleThread moved on Chromium's
// base::Thread. // base::Thread.
base::MessagePump::Delegate* delegate = thread_->message_loop(); base::MessagePump::Delegate* delegate = thread_->message_loop();
// Loop until we run out of work.
while (true) {
if (!delegate->DoWork())
break;
}
// Process all pending tasks. // Process all pending tasks.
while (true) { while (true) {
if (delegate->DoWork()) if (delegate->DoWork())
...@@ -61,7 +55,6 @@ class JingleThread::JingleMessagePump : public base::MessagePump, ...@@ -61,7 +55,6 @@ class JingleThread::JingleMessagePump : public base::MessagePump,
} }
private: private:
void ScheduleNextDelayedTask() { void ScheduleNextDelayedTask() {
DCHECK_EQ(thread_->message_loop(), MessageLoop::current()); DCHECK_EQ(thread_->message_loop(), MessageLoop::current());
...@@ -86,6 +79,16 @@ class JingleThread::JingleMessageLoop : public MessageLoop { ...@@ -86,6 +79,16 @@ class JingleThread::JingleMessageLoop : public MessageLoop {
: MessageLoop(MessageLoop::TYPE_IO) { : MessageLoop(MessageLoop::TYPE_IO) {
pump_ = new JingleMessagePump(thread); pump_ = new JingleMessagePump(thread);
} }
void Initialize() {
jingle_message_loop_state_.reset(new AutoRunState(this));
}
private:
// AutoRunState sets |state_| for this message loop. It needs to be
// created here because we never call Run() or RunAllPending() for
// the thread.
scoped_ptr<AutoRunState> jingle_message_loop_state_;
}; };
TaskPump::TaskPump() { TaskPump::TaskPump() {
...@@ -119,6 +122,7 @@ void JingleThread::Start() { ...@@ -119,6 +122,7 @@ void JingleThread::Start() {
void JingleThread::Run() { void JingleThread::Run() {
JingleMessageLoop message_loop(this); JingleMessageLoop message_loop(this);
message_loop.Initialize();
message_loop_ = &message_loop; message_loop_ = &message_loop;
TaskPump task_pump; TaskPump task_pump;
......
...@@ -33,6 +33,16 @@ TEST(JingleThreadTest, PostTask) { ...@@ -33,6 +33,16 @@ TEST(JingleThreadTest, PostTask) {
thread.Stop(); thread.Stop();
} }
TEST(JingleThreadTest, PostNonNestableTask) {
JingleThread thread;
MockTask* task = new MockTask();
EXPECT_CALL(*task, Run());
thread.Start();
thread.message_loop()->PostNonNestableTask(FROM_HERE, task);
thread.Stop();
}
ACTION_P(SignalEvent, event) { ACTION_P(SignalEvent, event) {
event->Signal(); event->Signal();
} }
...@@ -53,4 +63,20 @@ TEST(JingleThreadTest, PostDelayedTask) { ...@@ -53,4 +63,20 @@ TEST(JingleThreadTest, PostDelayedTask) {
EXPECT_GE((end - start).InMillisecondsRoundedUp(), kDelayMs); EXPECT_GE((end - start).InMillisecondsRoundedUp(), kDelayMs);
} }
TEST(JingleThreadTest, PostNonNestableDelayedTask) {
JingleThread thread;
MockTask* task = new MockTask();
base::WaitableEvent event(true, false);
EXPECT_CALL(*task, Run()).WillOnce(SignalEvent(&event));
thread.Start();
base::Time start = base::Time::Now();
thread.message_loop()->PostNonNestableDelayedTask(FROM_HERE, task, kDelayMs);
event.TimedWait(base::TimeDelta::FromMilliseconds(kDelayTimeoutMs));
base::Time end = base::Time::Now();
thread.Stop();
EXPECT_GE((end - start).InMillisecondsRoundedUp(), kDelayMs);
}
} // namespace remoting } // namespace remoting
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment