Index: jingle/glue/thread_wrapper.cc |
diff --git a/jingle/glue/thread_wrapper.cc b/jingle/glue/thread_wrapper.cc |
index c63f89a7ed79476acd9891d8056df0fb4f5cf65f..3c0635f87032840c28c120f619ac4880c0782dab 100644 |
--- a/jingle/glue/thread_wrapper.cc |
+++ b/jingle/glue/thread_wrapper.cc |
@@ -29,10 +29,12 @@ base::LazyInstance<base::ThreadLocalPointer<JingleThreadWrapper> > |
g_jingle_thread_wrapper = LAZY_INSTANCE_INITIALIZER; |
// static |
-void JingleThreadWrapper::EnsureForCurrentThread() { |
+void JingleThreadWrapper::EnsureForCurrentMessageLoop() { |
if (JingleThreadWrapper::current() == NULL) { |
- g_jingle_thread_wrapper.Get().Set( |
- new JingleThreadWrapper(MessageLoop::current())); |
+ MessageLoop* message_loop = MessageLoop::current(); |
+ g_jingle_thread_wrapper.Get().Set(new JingleThreadWrapper( |
+ message_loop->message_loop_proxy())); |
+ message_loop->AddDestructionObserver(current()); |
} |
DCHECK_EQ(talk_base::Thread::Current(), current()); |
@@ -43,19 +45,18 @@ JingleThreadWrapper* JingleThreadWrapper::current() { |
return g_jingle_thread_wrapper.Get().Get(); |
} |
-JingleThreadWrapper::JingleThreadWrapper(MessageLoop* message_loop) |
+JingleThreadWrapper::JingleThreadWrapper( |
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
: talk_base::Thread(new talk_base::NullSocketServer()), |
- message_loop_(message_loop), |
+ task_runner_(task_runner), |
send_allowed_(false), |
last_task_id_(0), |
- pending_send_event_(true, false) { |
- DCHECK_EQ(message_loop_, MessageLoop::current()); |
- |
- talk_base::ThreadManager::Instance()->UnwrapCurrentThread(); |
- talk_base::ThreadManager::Instance()->SetCurrentThread(this); |
+ pending_send_event_(true, false), |
+ weak_ptr_factory_(this), |
+ weak_ptr_(weak_ptr_factory_.GetWeakPtr()) { |
+ DCHECK(task_runner->BelongsToCurrentThread()); |
+ DCHECK(!talk_base::Thread::Current()); |
talk_base::MessageQueueManager::Instance()->Add(this); |
- message_loop_->AddDestructionObserver(this); |
- |
WrapCurrent(); |
} |
@@ -69,7 +70,6 @@ void JingleThreadWrapper::WillDestroyCurrentMessageLoop() { |
g_jingle_thread_wrapper.Get().Set(NULL); |
talk_base::ThreadManager::Instance()->SetCurrentThread(NULL); |
talk_base::MessageQueueManager::Instance()->Remove(this); |
- message_loop_->RemoveDestructionObserver(this); |
talk_base::SocketServer* ss = socketserver(); |
delete this; |
delete ss; |
@@ -162,9 +162,9 @@ void JingleThreadWrapper::Send(talk_base::MessageHandler *handler, uint32 id, |
// Need to signal |pending_send_event_| here in case the thread is |
// sending message to another thread. |
pending_send_event_.Signal(); |
- message_loop_->PostTask(FROM_HERE, |
- base::Bind(&JingleThreadWrapper::ProcessPendingSends, |
- base::Unretained(this))); |
+ task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&JingleThreadWrapper::ProcessPendingSends, |
+ weak_ptr_)); |
while (!pending_send.done_event.IsSignaled()) { |
@@ -214,14 +214,14 @@ void JingleThreadWrapper::PostTaskInternal( |
} |
if (delay_ms <= 0) { |
- message_loop_->PostTask(FROM_HERE, |
- base::Bind(&JingleThreadWrapper::RunTask, |
- base::Unretained(this), task_id)); |
+ task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&JingleThreadWrapper::RunTask, |
+ weak_ptr_, task_id)); |
} else { |
- message_loop_->PostDelayedTask(FROM_HERE, |
- base::Bind(&JingleThreadWrapper::RunTask, |
- base::Unretained(this), task_id), |
- base::TimeDelta::FromMilliseconds(delay_ms)); |
+ task_runner_->PostDelayedTask(FROM_HERE, |
+ base::Bind(&JingleThreadWrapper::RunTask, |
+ weak_ptr_, task_id), |
+ base::TimeDelta::FromMilliseconds(delay_ms)); |
} |
} |