Skip to content

Commit 64b25db

Browse files
Align iterateTracks() synchronization on iterateDataChannels()
1 parent 982a0af commit 64b25db

File tree

1 file changed

+17
-13
lines changed

1 file changed

+17
-13
lines changed

src/impl/peerconnection.cpp

+17-13
Original file line numberDiff line numberDiff line change
@@ -715,13 +715,10 @@ void PeerConnection::iterateDataChannels(
715715
{
716716
std::shared_lock lock(mDataChannelsMutex); // read-only
717717
locked.reserve(mDataChannels.size());
718-
auto it = mDataChannels.begin();
719-
while (it != mDataChannels.end()) {
718+
for(auto it = mDataChannels.begin(); it != mDataChannels.end(); ++it) {
720719
auto channel = it->second.lock();
721720
if (channel && !channel->isClosed())
722721
locked.push_back(std::move(channel));
723-
724-
++it;
725722
}
726723
}
727724

@@ -783,15 +780,22 @@ shared_ptr<Track> PeerConnection::emplaceTrack(Description::Media description) {
783780
}
784781

785782
void PeerConnection::iterateTracks(std::function<void(shared_ptr<Track> track)> func) {
786-
std::shared_lock lock(mTracksMutex); // read-only
787-
for (auto it = mTrackLines.begin(); it != mTrackLines.end(); ++it) {
788-
auto track = it->lock();
789-
if (track && !track->isClosed()) {
790-
try {
791-
func(std::move(track));
792-
} catch (const std::exception &e) {
793-
PLOG_WARNING << e.what();
794-
}
783+
std::vector<shared_ptr<Track>> locked;
784+
{
785+
std::shared_lock lock(mTracksMutex); // read-only
786+
locked.reserve(mTrackLines.size());
787+
for(auto it = mTrackLines.begin(); it != mTrackLines.end(); ++it) {
788+
auto track = it->lock();
789+
if (track && !track->isClosed())
790+
locked.push_back(std::move(track));
791+
}
792+
}
793+
794+
for (auto &track : locked) {
795+
try {
796+
func(std::move(track));
797+
} catch (const std::exception &e) {
798+
PLOG_WARNING << e.what();
795799
}
796800
}
797801
}

0 commit comments

Comments
 (0)