diff options
-rw-r--r-- | jingle/glue/thread_wrapper.cc | 44 | ||||
-rw-r--r-- | jingle/glue/thread_wrapper.h | 15 | ||||
-rw-r--r-- | remoting/client/plugin/chromoting_instance.cc | 4 |
3 files changed, 39 insertions, 24 deletions
diff --git a/jingle/glue/thread_wrapper.cc b/jingle/glue/thread_wrapper.cc index d07b746..f74fbb3 100644 --- a/jingle/glue/thread_wrapper.cc +++ b/jingle/glue/thread_wrapper.cc @@ -30,16 +30,26 @@ base::LazyInstance<base::ThreadLocalPointer<JingleThreadWrapper> > // static void JingleThreadWrapper::EnsureForCurrentMessageLoop() { - if (JingleThreadWrapper::current() == NULL) { + if (JingleThreadWrapper::current() == nullptr) { base::MessageLoop* message_loop = base::MessageLoop::current(); - g_jingle_thread_wrapper.Get() - .Set(new JingleThreadWrapper(message_loop->message_loop_proxy())); - message_loop->AddDestructionObserver(current()); + scoped_ptr<JingleThreadWrapper> wrapper = + JingleThreadWrapper::WrapTaskRunner(message_loop->task_runner()); + message_loop->AddDestructionObserver(wrapper.release()); } DCHECK_EQ(rtc::Thread::Current(), current()); } +scoped_ptr<JingleThreadWrapper> JingleThreadWrapper::WrapTaskRunner( + scoped_refptr<base::SingleThreadTaskRunner> task_runner) { + DCHECK(!JingleThreadWrapper::current()); + DCHECK(task_runner->BelongsToCurrentThread()); + + scoped_ptr<JingleThreadWrapper> result(new JingleThreadWrapper(task_runner)); + g_jingle_thread_wrapper.Get().Set(result.get()); + return result.Pass(); +} + // static JingleThreadWrapper* JingleThreadWrapper::current() { return g_jingle_thread_wrapper.Get().Get(); @@ -47,8 +57,7 @@ JingleThreadWrapper* JingleThreadWrapper::current() { JingleThreadWrapper::JingleThreadWrapper( scoped_refptr<base::SingleThreadTaskRunner> task_runner) - : rtc::Thread(new rtc::NullSocketServer()), - task_runner_(task_runner), + : task_runner_(task_runner), send_allowed_(false), last_task_id_(0), pending_send_event_(true, false), @@ -61,18 +70,19 @@ JingleThreadWrapper::JingleThreadWrapper( } JingleThreadWrapper::~JingleThreadWrapper() { - Clear(NULL, rtc::MQID_ANY, NULL); -} + DCHECK_EQ(this, JingleThreadWrapper::current()); + DCHECK_EQ(this, rtc::Thread::Current()); -void JingleThreadWrapper::WillDestroyCurrentMessageLoop() { - DCHECK_EQ(rtc::Thread::Current(), current()); UnwrapCurrent(); - g_jingle_thread_wrapper.Get().Set(NULL); - rtc::ThreadManager::Instance()->SetCurrentThread(NULL); + rtc::ThreadManager::Instance()->SetCurrentThread(nullptr); rtc::MessageQueueManager::Remove(this); - rtc::SocketServer* ss = socketserver(); + g_jingle_thread_wrapper.Get().Set(nullptr); + + Clear(nullptr, rtc::MQID_ANY, nullptr); +} + +void JingleThreadWrapper::WillDestroyCurrentMessageLoop() { delete this; - delete ss; } void JingleThreadWrapper::Post( @@ -133,7 +143,7 @@ void JingleThreadWrapper::Send(rtc::MessageHandler *handler, uint32 id, return; JingleThreadWrapper* current_thread = JingleThreadWrapper::current(); - DCHECK(current_thread != NULL) << "Send() can be called only from a " + DCHECK(current_thread != nullptr) << "Send() can be called only from a " "thread that has JingleThreadWrapper."; rtc::Message message; @@ -180,7 +190,7 @@ void JingleThreadWrapper::Send(rtc::MessageHandler *handler, uint32 id, void JingleThreadWrapper::ProcessPendingSends() { while (true) { - PendingSend* pending_send = NULL; + PendingSend* pending_send = nullptr; { base::AutoLock auto_lock(lock_); if (!pending_send_messages_.empty()) { @@ -240,7 +250,7 @@ void JingleThreadWrapper::RunTask(int task_id) { if (have_message) { if (message.message_id == rtc::MQID_DISPOSE) { - DCHECK(message.phandler == NULL); + DCHECK(message.phandler == nullptr); delete message.pdata; } else { message.phandler->OnMessage(&message); diff --git a/jingle/glue/thread_wrapper.h b/jingle/glue/thread_wrapper.h index 6a045bf..7969d2b 100644 --- a/jingle/glue/thread_wrapper.h +++ b/jingle/glue/thread_wrapper.h @@ -35,13 +35,15 @@ class JingleThreadWrapper : public base::MessageLoop::DestructionObserver, // MessageLoop is destroyed. static void EnsureForCurrentMessageLoop(); - // Returns thread wrapper for the current thread. NULL is returned - // if EnsureForCurrentMessageLoop() has never been called for this - // thread. + // Creates JingleThreadWrapper for |task_runner| that runs tasks on the + // current thread. + static scoped_ptr<JingleThreadWrapper> WrapTaskRunner( + scoped_refptr<base::SingleThreadTaskRunner> task_runner); + + // Returns thread wrapper for the current thread or nullptr if it doesn't + // exist. static JingleThreadWrapper* current(); - explicit JingleThreadWrapper( - scoped_refptr<base::SingleThreadTaskRunner> task_runner); ~JingleThreadWrapper() override; // Sets whether the thread can be used to send messages @@ -95,6 +97,9 @@ class JingleThreadWrapper : public base::MessageLoop::DestructionObserver, typedef std::map<int, rtc::Message> MessagesQueue; struct PendingSend; + explicit JingleThreadWrapper( + scoped_refptr<base::SingleThreadTaskRunner> task_runner); + void PostTaskInternal( int delay_ms, rtc::MessageHandler* handler, uint32 message_id, rtc::MessageData* data); diff --git a/remoting/client/plugin/chromoting_instance.cc b/remoting/client/plugin/chromoting_instance.cc index aa48f07..c75f57a 100644 --- a/remoting/client/plugin/chromoting_instance.cc +++ b/remoting/client/plugin/chromoting_instance.cc @@ -198,8 +198,8 @@ ChromotingInstance::ChromotingInstance(PP_Instance pp_instance) // are not shared with Chrome. thread_task_runner_handle_.reset( new base::ThreadTaskRunnerHandle(plugin_task_runner_)); - thread_wrapper_.reset( - new jingle_glue::JingleThreadWrapper(plugin_task_runner_)); + thread_wrapper_ = + jingle_glue::JingleThreadWrapper::WrapTaskRunner(plugin_task_runner_); media::InitializeCPUSpecificYUVConversions(); // Register a global log handler. |