diff options
author | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-28 16:57:03 +0000 |
---|---|---|
committer | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-28 16:57:03 +0000 |
commit | 6de751f7caa908c996e0bd61cfaeecea8b6459b1 (patch) | |
tree | a7c52b13b3967953f7b954d69789cf6fab6a6f75 /jingle/glue/thread_wrapper.h | |
parent | abd08d0adcfa37c35033a5cefc41f9b9ed6a4934 (diff) | |
download | chromium_src-6de751f7caa908c996e0bd61cfaeecea8b6459b1.zip chromium_src-6de751f7caa908c996e0bd61cfaeecea8b6459b1.tar.gz chromium_src-6de751f7caa908c996e0bd61cfaeecea8b6459b1.tar.bz2 |
Add JingleThreadWrapper.
JingleThreadWrapper wraps chromium thread with a talk_base::Thread interface.
BUG=None
TEST=Unittests
Review URL: http://codereview.chromium.org/6747017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@79576 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'jingle/glue/thread_wrapper.h')
-rw-r--r-- | jingle/glue/thread_wrapper.h | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/jingle/glue/thread_wrapper.h b/jingle/glue/thread_wrapper.h new file mode 100644 index 0000000..755d047 --- /dev/null +++ b/jingle/glue/thread_wrapper.h @@ -0,0 +1,89 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef JINGLE_GLUE_THREAD_WRAPPER_H_ +#define JINGLE_GLUE_THREAD_WRAPPER_H_ + +#include <map> + +#include "base/message_loop.h" +#include "base/synchronization/lock.h" +#include "third_party/libjingle/source/talk/base/thread.h" + +class MessageLoop; + +namespace jingle_glue { + +// JingleThreadWrapper wraps Chromium threads using talk_base::Thread +// interface. The object must be created on a thread it belongs +// to. Each JingleThreadWrapper deletes itself when MessageLoop is +// destroyed. Currently only the bare minimum that is used by P2P +// part of libjingle is implemented. +class JingleThreadWrapper + : public MessageLoop::DestructionObserver, + public talk_base::Thread { + public: + JingleThreadWrapper(MessageLoop* message_loop); + + // MessageLoop::DestructionObserver implementation. + virtual void WillDestroyCurrentMessageLoop() OVERRIDE; + + // talk_base::MessageQueue overrides. + virtual void Post(talk_base::MessageHandler *phandler, uint32 id = 0, + talk_base::MessageData *pdata = NULL, + bool time_sensitive = false) OVERRIDE; + virtual void PostDelayed( + int delay_ms, talk_base::MessageHandler* handler, uint32 id = 0, + talk_base::MessageData* data = NULL) OVERRIDE; + virtual void Clear(talk_base::MessageHandler* handler, + uint32 id = talk_base::MQID_ANY, + talk_base::MessageList* removed = NULL) OVERRIDE; + + // Following methods are not supported.They are overriden just to + // ensure that they are not called (each of them contain NOTREACHED + // in the body). Some of this methods can be implemented if it + // becomes neccessary to use libjingle code that calls them. + virtual void Quit() OVERRIDE; + virtual bool IsQuitting() OVERRIDE; + virtual void Restart() OVERRIDE; + virtual bool Get(talk_base::Message* msg, int delay_ms = talk_base::kForever, + bool process_io = true) OVERRIDE; + virtual bool Peek(talk_base::Message* msg, int delay_ms = 0) OVERRIDE; + virtual void PostAt( + uint32 timestamp, talk_base::MessageHandler* handler, + uint32 id = 0, talk_base::MessageData* data = NULL) OVERRIDE; + virtual void Dispatch(talk_base::Message* msg) OVERRIDE; + virtual void ReceiveSends() OVERRIDE; + virtual int GetDelay() OVERRIDE; + + // talk_base::Thread overrides. + virtual void Stop() OVERRIDE; + virtual void Run() OVERRIDE; + + private: + typedef std::map<int, talk_base::Message> MessagesQueue; + + virtual ~JingleThreadWrapper(); + + void PostTaskInternal( + int delay_ms, talk_base::MessageHandler* handler, + uint32 message_id, talk_base::MessageData* data); + void RunTask(int task_id); + + // Chromium thread used to execute messages posted on this thread. + MessageLoop* message_loop_; + + // |lock_| must be locked when accessing |messages_|. + base::Lock lock_; + int last_task_id_; + MessagesQueue messages_; +}; + +} + +// Safe to disable refcounting because JingleThreadWrapper deletes +// itself with the thread. +DISABLE_RUNNABLE_METHOD_REFCOUNT(jingle_glue::JingleThreadWrapper); + +#endif // JINGLE_GLUE_THREAD_WRAPPER_H_ |