webrtc中的MethodCall0程式碼功能分析
阿新 • • 發佈:2018-12-18
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中大量使用次方法來保證執行緒安全。