signaling_thread_ = talk_base::Thread::Current();
if (worker == NULL) {
worker_thread_ = talk_base::Thread::Current();
} else {
worker_thread_ = worker;
}
|
Session::Session(....
)
: BaseSession(
session_manager->signaling_thread()
,
session_manager->worker_thread(),
session_manager->port_allocator(),
sid, content_type, initiator_name == local_name) {
.....
}
BaseSession::BaseSession(
talk_base::Thread* signaling_thread
,
talk_base::Thread* worker_thread,
PortAllocator* port_allocator,
const std::string& sid,
const std::string& content_type,
bool initiator)
{
ASSERT(signaling_thread->IsCurrent());
}
|
<<libjingle sessionmanagertask 分析>>中XmppPump中的m_pXmppThread所决定。如图:
void TunnelSessionClientBase::OnSessionCreate(Session* session, bool received) {
LOG(LS_INFO) << "TunnelSessionClientBase::OnSessionCreate: received="
<< received;
ASSERT(session_manager_->signaling_thread()->IsCurrent());
if (received)
sessions_.push_back(
MakeTunnelSession(session,
talk_base::Thread::Current()
, RESPONDER));
}
|
talk_base::StreamInterface* TunnelSessionClientBase::CreateTunnel(
const buzz::Jid& to, const std::string& description) {
// Valid from any thread
CreateTunnelData data;
data.jid = to;
data.description = description;
data.thread = talk_base::Thread::Current(); //这里就是最终要赋值给
PseudoTcpChannel的stream_thread_
data.stream = NULL;
session_manager_->signaling_thread()->Send(this, MSG_CREATE_TUNNEL, &data);
return data.stream;
}
void TunnelSessionClientBase::OnMessage(talk_base::Message* pmsg) {
if (pmsg->message_id ==
MSG_CREATE_TUNNEL
) {
ASSERT(session_manager_->signaling_thread()->IsCurrent());
CreateTunnelData* data = static_cast<CreateTunnelData*>(pmsg->pdata);
SessionDescription* offer = CreateOffer(data->jid, data->description);
if (offer == NULL) {
return;
}
Session* session = session_manager_->CreateSession(jid_.Str(), namespace_);
TunnelSession* tunnel = MakeTunnelSession(session,
data->thread
,
INITIATOR);
sessions_.push_back(tunnel);
session->Initiate(data->jid.Str(), offer);
data->stream = tunnel->GetStream();
}
}
|
P2PTransportChannel::P2PTransportChannel(....
)
: ........
transport_(transport),
allocator_(allocator),
worker_thread_(talk_base::Thread::Current()),
{
}
int P2PTransportChannel::SendPacket(const char *data, size_t len, int flags) {
ASSERT(worker_thread_ == talk_base::Thread::Current());
if (flags != 0) {
error_ = EINVAL;
return -1;
}
if (best_connection_ == NULL) {
error_ = EWOULDBLOCK;
return -1;
}
int sent = best_connection_->Send(data, len);
if (sent <= 0) {
ASSERT(sent < 0);
error_ = best_connection_->GetError();
}
return sent;
}
|
TransportChannelImpl* Transport::CreateChannel(int component) {
ChannelParams params(component);
worker_thread()->Send(this, MSG_CREATECHANNEL, ¶ms);//这里的workthread()是由SessionMananger的worker_thread_决定
return params.channel;
}
void Transport::OnMessage(talk_base::Message* msg) {
switch (msg->message_id) {
case MSG_CREATECHANNEL: {
ChannelParams* params = static_cast<ChannelParams*>(msg->pdata);
params->channel =
CreateChannel_w(params->component)
;
}
..........................
}
TransportChannelImpl*
Transport::CreateChannel_w
(int component) {
ASSERT(worker_thread()->IsCurrent());
TransportChannelImpl *impl;
talk_base::CritScope cs(&crit_);
// Create the entry if it does not exist.
bool impl_exists = false;
if (channels_.find(component) == channels_.end()) {
impl =
CreateTransportChannel(component);
channels_[component] = ChannelMapEntry(impl);
} else {
impl = channels_[component].get();
impl_exists = true;
}
...................................
}
virtual DtlsTransportChannelWrapper*
DtlsTransport::CreateTransportChannel(int component)
{
return new DtlsTransportChannelWrapper(
this,
Base::CreateTransportChannel
(component));
}
TransportChannelImpl*
P2PTransport::CreateTransportChannel
(int component) {
return
new P2PTransportChannel
(
content_name(), component, this, port_allocator());
}
|