Skip to content

Commit a02f94b

Browse files
committed
fix: use separate network thread in PeerConnectionFactory
Previously, the same thread was passed for both network_thread and worker_thread to CreatePeerConnectionFactory. In M114, many operations moved to the network thread, and PeerConnection::Close() does sequential BlockingCalls to network then worker threads (pc/peer_connection.cc:1909-1929). Sharing a single thread caused cleanup contention that limited sequential connection throughput. This matches Chrome's architecture (pc/connection_context.cc:85-98) where network, worker, and signaling threads are all separate. The network thread gets a socket server for ICE port management, matching the CreateWithSocketServer() pattern Chrome uses.
1 parent 8134487 commit a02f94b

2 files changed

Lines changed: 20 additions & 5 deletions

File tree

src/interfaces/rtc_peer_connection/peer_connection_factory.cc

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,22 @@ PeerConnectionFactory::PeerConnectionFactory(const Napi::CallbackInfo &info)
5252
// TODO(mroberts): Read `audioLayer` from some PeerConnectionFactoryOptions?
5353
auto audioLayer = MakeNothing<webrtc::AudioDeviceModule::AudioLayer>();
5454

55-
_workerThread = rtc::Thread::CreateWithSocketServer();
56-
assert(_workerThread);
55+
_networkThread = rtc::Thread::CreateWithSocketServer();
56+
assert(_networkThread);
5757

5858
bool result =
59+
_networkThread->SetName("PeerConnectionFactory:networkThread", nullptr);
60+
assert(result);
61+
(void)result;
62+
63+
result = _networkThread->Start();
64+
assert(result);
65+
(void)result;
66+
67+
_workerThread = rtc::Thread::Create();
68+
assert(_workerThread);
69+
70+
result =
5971
_workerThread->SetName("PeerConnectionFactory:workerThread", nullptr);
6072
assert(result);
6173
(void)result;
@@ -93,7 +105,7 @@ PeerConnectionFactory::PeerConnectionFactory(const Napi::CallbackInfo &info)
93105
(void)result;
94106

95107
_factory = webrtc::CreatePeerConnectionFactory(
96-
_workerThread.get(), _workerThread.get(), _signalingThread.get(),
108+
_networkThread.get(), _workerThread.get(), _signalingThread.get(),
97109
_audioDeviceModule, webrtc::CreateBuiltinAudioEncoderFactory(),
98110
webrtc::CreateBuiltinAudioDecoderFactory(),
99111
webrtc::CreateBuiltinVideoEncoderFactory(),
@@ -105,11 +117,11 @@ PeerConnectionFactory::PeerConnectionFactory(const Napi::CallbackInfo &info)
105117
_factory->SetOptions(options);
106118

107119
_networkManager = std::unique_ptr<rtc::NetworkManager>(
108-
new rtc::BasicNetworkManager(_workerThread->socketserver()));
120+
new rtc::BasicNetworkManager(_networkThread->socketserver()));
109121
assert(_networkManager != nullptr);
110122

111123
_socketFactory = std::unique_ptr<rtc::PacketSocketFactory>(
112-
new rtc::BasicPacketSocketFactory(_workerThread->socketserver()));
124+
new rtc::BasicPacketSocketFactory(_networkThread->socketserver()));
113125
assert(_socketFactory != nullptr);
114126
}
115127

@@ -118,9 +130,11 @@ PeerConnectionFactory::~PeerConnectionFactory() {
118130

119131
_workerThread->BlockingCall([this]() { this->_audioDeviceModule = nullptr; });
120132

133+
_networkThread->Stop();
121134
_workerThread->Stop();
122135
_signalingThread->Stop();
123136

137+
_networkThread = nullptr;
124138
_workerThread = nullptr;
125139
_signalingThread = nullptr;
126140

src/interfaces/rtc_peer_connection/peer_connection_factory.hh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public:
6262
static void Dispose();
6363

6464
private:
65+
std::unique_ptr<rtc::Thread> _networkThread;
6566
std::unique_ptr<rtc::Thread> _signalingThread;
6667
std::unique_ptr<rtc::Thread> _workerThread;
6768

0 commit comments

Comments
 (0)