1. 程式人生 > >webrtc中的MethodCall0程式碼功能分析

webrtc中的MethodCall0程式碼功能分析

webrtc中的MethodCall0程式碼功能分析

MethodCall0實現了這樣一個功能:

將一個類物件的成員函式(無引數)放在某個執行緒上下文執行,無返回(void)。

涉及到webRTC的類有:

Message, MessageHandler, Thread, ReturnType

呼叫例子:下例是將proxy物件的Release_s方法放在work_thread執行上下文執行。

VideoSourceProxy *proxy;

talk_base::Thread* work_thread;

...

MethodCall0<VideoSourceProxy, void> call(proxy, &VideoSourceProxy::Release_s);  //宣告一個MethodCall0物件call

call.Marshal(work_thread); // 將VideoSourceProxy的成員Release_s放線上程thread的上下文執行,無返回結果(void)

MethodCall0的實現如下:

template <typename R>  
class ReturnType {  
 public:  
  template<typename C, typename M>  
  void Invoke(C* c, M m) { r_ = (c->*m)(); }  
  template<typename C, typename M, typename T1>  
  void Invoke(C* c, M m, T1 a1) { r_ = (c->*m)(a1); }  
  template<typename C
, typename M, typename T1, typename T2> void Invoke(C* c, M m, T1 a1, T2 a2) { r_ = (c->*m)(a1, a2); } template<typename C, typename M, typename T1, typename T2, typename T3> void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3) { r_ = (c->*m)(a1, a2, a3); } R value() { return r_; } private: R
r_; }; template <typename C, typename R> class MethodCall0 : public talk_base::Message, public talk_base::MessageHandler { public: typedef R (C::*Method)(); MethodCall0(C* c, Method m) : c_(c), m_(m) {} R Marshal(talk_base::Thread* t) { t->Send(this, 0); return r_.value(); } private: void OnMessage(talk_base::Message*) { r_.Invoke(c_, m_);} C* c_; Method m_; ReturnType<R> r_; }; struct Message { Message() { memset(this, 0, sizeof(*this)); } inline bool Match(MessageHandler* handler, uint32 id) const { return (handler == NULL || handler == phandler) && (id == MQID_ANY || id == message_id); } MessageHandler *phandler; uint32 message_id; MessageData *pdata; uint32 ts_sensitive; }; // Messages get dispatched to a MessageHandler class MessageHandler { public: virtual void OnMessage(Message* msg) = 0; protected: MessageHandler() {} virtual ~MessageHandler(); private: DISALLOW_COPY_AND_ASSIGN(MessageHandler); };

從原始碼中可以看出,MethodCall0 最終呼叫了webrtc中Thread的send()方法來執行指定的函式,send()方法是指讓函式在Thread執行緒中同步執行,webrtc中大量使用次方法來保證執行緒安全。