summaryrefslogtreecommitdiffstats
path: root/jingle/glue/thread_wrapper.h
diff options
context:
space:
mode:
Diffstat (limited to 'jingle/glue/thread_wrapper.h')
-rw-r--r--jingle/glue/thread_wrapper.h68
1 files changed, 47 insertions, 21 deletions
diff --git a/jingle/glue/thread_wrapper.h b/jingle/glue/thread_wrapper.h
index 5b5cf08..4707e21 100644
--- a/jingle/glue/thread_wrapper.h
+++ b/jingle/glue/thread_wrapper.h
@@ -5,21 +5,21 @@
#ifndef JINGLE_GLUE_THREAD_WRAPPER_H_
#define JINGLE_GLUE_THREAD_WRAPPER_H_
+#include <list>
#include <map>
#include "base/message_loop.h"
#include "base/synchronization/lock.h"
+#include "base/synchronization/waitable_event.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.
+// interface. The object must be created by calling
+// EnsureForCurrentThread(). 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 {
@@ -28,21 +28,38 @@ class JingleThreadWrapper
// been created yet.
static void EnsureForCurrentThread();
+ // Returns thread wrapper for the current thread. NULL is returned
+ // if EnsureForCurrentThread() has never been called for this
+ // thread.
+ static JingleThreadWrapper* current();
+
JingleThreadWrapper(MessageLoop* message_loop);
+ // Sets whether the thread can be used to send messages
+ // synchronously to another thread using Send() method. Set to false
+ // by default to avoid potential jankiness when Send() used on
+ // renderer thread. It should be set explicitly for threads that
+ // need to call Send() for other threads.
+ void set_send_allowed(bool allowed) { send_allowed_ = allowed; }
+
// 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 Post(talk_base::MessageHandler *phandler,
+ uint32 id,
+ talk_base::MessageData *pdata,
+ bool time_sensitive) OVERRIDE;
+ virtual void PostDelayed(int delay_ms,
+ talk_base::MessageHandler* handler,
+ uint32 id,
+ talk_base::MessageData* data) OVERRIDE;
virtual void Clear(talk_base::MessageHandler* handler,
- uint32 id = talk_base::MQID_ANY,
- talk_base::MessageList* removed = NULL) OVERRIDE;
+ uint32 id,
+ talk_base::MessageList* removed) OVERRIDE;
+ virtual void Send(talk_base::MessageHandler *handler,
+ uint32 id,
+ talk_base::MessageData *data) OVERRIDE;
// Following methods are not supported.They are overriden just to
// ensure that they are not called (each of them contain NOTREACHED
@@ -51,13 +68,16 @@ class JingleThreadWrapper
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 bool Get(talk_base::Message* message,
+ int delay_ms,
+ bool process_io) OVERRIDE;
+ virtual bool Peek(talk_base::Message* message,
+ int delay_ms) OVERRIDE;
+ virtual void PostAt(uint32 timestamp,
+ talk_base::MessageHandler* handler,
+ uint32 id,
+ talk_base::MessageData* data) OVERRIDE;
+ virtual void Dispatch(talk_base::Message* message) OVERRIDE;
virtual void ReceiveSends() OVERRIDE;
virtual int GetDelay() OVERRIDE;
@@ -67,6 +87,7 @@ class JingleThreadWrapper
private:
typedef std::map<int, talk_base::Message> MessagesQueue;
+ struct PendingSend;
virtual ~JingleThreadWrapper();
@@ -74,14 +95,19 @@ class JingleThreadWrapper
int delay_ms, talk_base::MessageHandler* handler,
uint32 message_id, talk_base::MessageData* data);
void RunTask(int task_id);
+ void ProcessPendingSends();
// Chromium thread used to execute messages posted on this thread.
MessageLoop* message_loop_;
+ bool send_allowed_;
+
// |lock_| must be locked when accessing |messages_|.
base::Lock lock_;
int last_task_id_;
MessagesQueue messages_;
+ std::list<PendingSend*> pending_send_messages_;
+ base::WaitableEvent pending_send_event_;
};
}