Skip to content

Commit 0487131

Browse files
Merge pull request #1109 from paullouisageneau/fix-track-creation-sync
Fix track creation synchronization
2 parents 7841d9f + 64b25db commit 0487131

File tree

1 file changed

+25
-17
lines changed

1 file changed

+25
-17
lines changed

src/impl/peerconnection.cpp

+25-17
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

@@ -751,6 +748,8 @@ void PeerConnection::remoteCloseDataChannels() {
751748
}
752749

753750
shared_ptr<Track> PeerConnection::emplaceTrack(Description::Media description) {
751+
std::unique_lock lock(mTracksMutex); // we are going to emplace
752+
754753
#if !RTC_ENABLE_MEDIA
755754
// No media support, mark as removed
756755
PLOG_WARNING << "Tracks are disabled (not compiled with media support)";
@@ -759,10 +758,12 @@ shared_ptr<Track> PeerConnection::emplaceTrack(Description::Media description) {
759758

760759
shared_ptr<Track> track;
761760
if (auto it = mTracks.find(description.mid()); it != mTracks.end())
762-
if (track = it->second.lock(); track)
763-
track->setDescription(std::move(description));
761+
if (auto t = it->second.lock(); t && !t->isClosed())
762+
track = std::move(t);
764763

765-
if (!track) {
764+
if (track) {
765+
track->setDescription(std::move(description));
766+
} else {
766767
track = std::make_shared<Track>(weak_from_this(), std::move(description));
767768
mTracks.emplace(std::make_pair(track->mid(), track));
768769
mTrackLines.emplace_back(track);
@@ -779,15 +780,22 @@ shared_ptr<Track> PeerConnection::emplaceTrack(Description::Media description) {
779780
}
780781

781782
void PeerConnection::iterateTracks(std::function<void(shared_ptr<Track> track)> func) {
782-
std::shared_lock lock(mTracksMutex); // read-only
783-
for (auto it = mTrackLines.begin(); it != mTrackLines.end(); ++it) {
784-
auto track = it->lock();
785-
if (track && !track->isClosed()) {
786-
try {
787-
func(std::move(track));
788-
} catch (const std::exception &e) {
789-
PLOG_WARNING << e.what();
790-
}
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();
791799
}
792800
}
793801
}
@@ -896,7 +904,7 @@ void PeerConnection::processLocalDescription(Description description) {
896904
description.addMedia(std::move(reciprocated));
897905
},
898906
[&](Description::Media *remoteMedia) {
899-
std::shared_lock lock(mTracksMutex);
907+
std::unique_lock lock(mTracksMutex); // we may emplace a track
900908
if (auto it = mTracks.find(remoteMedia->mid()); it != mTracks.end()) {
901909
// Prefer local description
902910
if (auto track = it->second.lock()) {

0 commit comments

Comments
 (0)