Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(169)

Side by Side Diff: content/renderer/media/rtc_peer_connection_handler.cc

Issue 1438153002: Fix leak of RTCPeerConnectionHandler if PeerConnection.close() is called from js. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Simple unittest of DestructAllHandlers Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/rtc_peer_connection_handler.h" 5 #include "content/renderer/media/rtc_peer_connection_handler.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 789
790 private: 790 private:
791 const base::WeakPtr<RTCPeerConnectionHandler> handler_; 791 const base::WeakPtr<RTCPeerConnectionHandler> handler_;
792 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_; 792 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
793 }; 793 };
794 794
795 RTCPeerConnectionHandler::RTCPeerConnectionHandler( 795 RTCPeerConnectionHandler::RTCPeerConnectionHandler(
796 blink::WebRTCPeerConnectionHandlerClient* client, 796 blink::WebRTCPeerConnectionHandlerClient* client,
797 PeerConnectionDependencyFactory* dependency_factory) 797 PeerConnectionDependencyFactory* dependency_factory)
798 : client_(client), 798 : client_(client),
799 is_closed_(false),
799 dependency_factory_(dependency_factory), 800 dependency_factory_(dependency_factory),
800 weak_factory_(this) { 801 weak_factory_(this) {
802 CHECK(client_),
801 g_peer_connection_handlers.Get().insert(this); 803 g_peer_connection_handlers.Get().insert(this);
802 } 804 }
803 805
804 RTCPeerConnectionHandler::~RTCPeerConnectionHandler() { 806 RTCPeerConnectionHandler::~RTCPeerConnectionHandler() {
805 DCHECK(thread_checker_.CalledOnValidThread()); 807 DCHECK(thread_checker_.CalledOnValidThread());
806 808
807 stop(); 809 stop();
808 810
809 g_peer_connection_handlers.Get().erase(this); 811 g_peer_connection_handlers.Get().erase(this);
810 if (peer_connection_tracker_) 812 if (peer_connection_tracker_)
811 peer_connection_tracker_->UnregisterPeerConnection(this); 813 peer_connection_tracker_->UnregisterPeerConnection(this);
812 STLDeleteValues(&remote_streams_); 814 STLDeleteValues(&remote_streams_);
813 815
814 UMA_HISTOGRAM_COUNTS_10000( 816 UMA_HISTOGRAM_COUNTS_10000(
815 "WebRTC.NumDataChannelsPerPeerConnection", num_data_channels_created_); 817 "WebRTC.NumDataChannelsPerPeerConnection", num_data_channels_created_);
816 } 818 }
817 819
818 // static 820 // static
819 void RTCPeerConnectionHandler::DestructAllHandlers() { 821 void RTCPeerConnectionHandler::DestructAllHandlers() {
820 std::set<RTCPeerConnectionHandler*> handlers( 822 std::set<RTCPeerConnectionHandler*> handlers(
tommi (sloooow) - chröme 2015/11/12 14:53:19 do we actually need this copy? Could this simply
perkj_chrome 2015/11/12 15:48:38 needs copy since g_peer_connection_handlers is mo
821 g_peer_connection_handlers.Get().begin(), 823 g_peer_connection_handlers.Get().begin(),
822 g_peer_connection_handlers.Get().end()); 824 g_peer_connection_handlers.Get().end());
823 for (auto handler : handlers) { 825 for (auto handler : handlers) {
tommi (sloooow) - chröme 2015/11/12 14:53:18 nit: could make it explicit that handler is always
perkj_chrome 2015/11/12 15:48:38 Done.
824 if (handler->client_) 826 handler->client_->releasePeerConnectionHandler();
825 handler->client_->releasePeerConnectionHandler();
826 } 827 }
827 } 828 }
828 829
829 // static 830 // static
830 void RTCPeerConnectionHandler::ConvertOfferOptionsToConstraints( 831 void RTCPeerConnectionHandler::ConvertOfferOptionsToConstraints(
831 const blink::WebRTCOfferOptions& options, 832 const blink::WebRTCOfferOptions& options,
832 RTCMediaConstraints* output) { 833 RTCMediaConstraints* output) {
833 output->AddMandatory( 834 output->AddMandatory(
834 webrtc::MediaConstraintsInterface::kOfferToReceiveAudio, 835 webrtc::MediaConstraintsInterface::kOfferToReceiveAudio,
835 options.offerToReceiveAudio() > 0 ? "true" : "false", 836 options.offerToReceiveAudio() > 0 ? "true" : "false",
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after
1302 const std::string& track_id, 1303 const std::string& track_id,
1303 blink::WebMediaStreamSource::Type track_type) { 1304 blink::WebMediaStreamSource::Type track_type) {
1304 DCHECK(thread_checker_.CalledOnValidThread()); 1305 DCHECK(thread_checker_.CalledOnValidThread());
1305 signaling_thread()->PostTask(FROM_HERE, 1306 signaling_thread()->PostTask(FROM_HERE,
1306 base::Bind(&GetStatsOnSignalingThread, native_peer_connection_, level, 1307 base::Bind(&GetStatsOnSignalingThread, native_peer_connection_, level,
1307 make_scoped_refptr(observer), track_id, track_type)); 1308 make_scoped_refptr(observer), track_id, track_type));
1308 } 1309 }
1309 1310
1310 void RTCPeerConnectionHandler::CloseClientPeerConnection() { 1311 void RTCPeerConnectionHandler::CloseClientPeerConnection() {
1311 DCHECK(thread_checker_.CalledOnValidThread()); 1312 DCHECK(thread_checker_.CalledOnValidThread());
1312 if (client_) 1313 if (!is_closed_)
1313 client_->closePeerConnection(); 1314 client_->closePeerConnection();
1314 } 1315 }
1315 1316
1316 blink::WebRTCDataChannelHandler* RTCPeerConnectionHandler::createDataChannel( 1317 blink::WebRTCDataChannelHandler* RTCPeerConnectionHandler::createDataChannel(
1317 const blink::WebString& label, const blink::WebRTCDataChannelInit& init) { 1318 const blink::WebString& label, const blink::WebRTCDataChannelInit& init) {
1318 DCHECK(thread_checker_.CalledOnValidThread()); 1319 DCHECK(thread_checker_.CalledOnValidThread());
1319 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createDataChannel"); 1320 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createDataChannel");
1320 DVLOG(1) << "createDataChannel label " 1321 DVLOG(1) << "createDataChannel label "
1321 << base::UTF16ToUTF8(base::StringPiece16(label)); 1322 << base::UTF16ToUTF8(base::StringPiece16(label));
1322 1323
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1373 if (peer_connection_tracker_) 1374 if (peer_connection_tracker_)
1374 peer_connection_tracker_->TrackCreateDTMFSender(this, track); 1375 peer_connection_tracker_->TrackCreateDTMFSender(this, track);
1375 1376
1376 return new RtcDtmfSenderHandler(sender); 1377 return new RtcDtmfSenderHandler(sender);
1377 } 1378 }
1378 1379
1379 void RTCPeerConnectionHandler::stop() { 1380 void RTCPeerConnectionHandler::stop() {
1380 DCHECK(thread_checker_.CalledOnValidThread()); 1381 DCHECK(thread_checker_.CalledOnValidThread());
1381 DVLOG(1) << "RTCPeerConnectionHandler::stop"; 1382 DVLOG(1) << "RTCPeerConnectionHandler::stop";
1382 1383
1383 if (!client_ || !native_peer_connection_.get()) 1384 if (!is_closed_ || !native_peer_connection_.get())
1384 return; // Already stopped. 1385 return; // Already stopped.
1385 1386
1386 if (peer_connection_tracker_) 1387 if (peer_connection_tracker_)
1387 peer_connection_tracker_->TrackStop(this); 1388 peer_connection_tracker_->TrackStop(this);
1388 1389
1389 native_peer_connection_->Close(); 1390 native_peer_connection_->Close();
1390 1391
1391 // The client_ pointer is not considered valid after this point and no further 1392 // This object may no longer forward call backs to blink.
1392 // callbacks must be made. 1393 is_closed_ = true;
tommi (sloooow) - chröme 2015/11/12 14:53:19 now that client_ is never set to nullptr, can we m
perkj_chrome 2015/11/12 15:48:37 Done.
1393 client_ = nullptr;
1394 } 1394 }
1395 1395
1396 void RTCPeerConnectionHandler::OnSignalingChange( 1396 void RTCPeerConnectionHandler::OnSignalingChange(
1397 webrtc::PeerConnectionInterface::SignalingState new_state) { 1397 webrtc::PeerConnectionInterface::SignalingState new_state) {
1398 DCHECK(thread_checker_.CalledOnValidThread()); 1398 DCHECK(thread_checker_.CalledOnValidThread());
1399 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnSignalingChange"); 1399 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnSignalingChange");
1400 1400
1401 blink::WebRTCPeerConnectionHandlerClient::SignalingState state = 1401 blink::WebRTCPeerConnectionHandlerClient::SignalingState state =
1402 GetWebKitSignalingState(new_state); 1402 GetWebKitSignalingState(new_state);
1403 if (peer_connection_tracker_) 1403 if (peer_connection_tracker_)
1404 peer_connection_tracker_->TrackSignalingStateChange(this, state); 1404 peer_connection_tracker_->TrackSignalingStateChange(this, state);
1405 if (client_) 1405 if (!is_closed_)
1406 client_->didChangeSignalingState(state); 1406 client_->didChangeSignalingState(state);
1407 } 1407 }
1408 1408
1409 // Called any time the IceConnectionState changes 1409 // Called any time the IceConnectionState changes
1410 void RTCPeerConnectionHandler::OnIceConnectionChange( 1410 void RTCPeerConnectionHandler::OnIceConnectionChange(
1411 webrtc::PeerConnectionInterface::IceConnectionState new_state) { 1411 webrtc::PeerConnectionInterface::IceConnectionState new_state) {
1412 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceConnectionChange"); 1412 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceConnectionChange");
1413 DCHECK(thread_checker_.CalledOnValidThread()); 1413 DCHECK(thread_checker_.CalledOnValidThread());
1414 ReportICEState(new_state); 1414 ReportICEState(new_state);
1415 if (new_state == webrtc::PeerConnectionInterface::kIceConnectionChecking) { 1415 if (new_state == webrtc::PeerConnectionInterface::kIceConnectionChecking) {
(...skipping 15 matching lines...) Expand all
1431 "WebRTC.PeerConnection.TimeToConnect", 1431 "WebRTC.PeerConnection.TimeToConnect",
1432 base::TimeTicks::Now() - ice_connection_checking_start_); 1432 base::TimeTicks::Now() - ice_connection_checking_start_);
1433 } 1433 }
1434 } 1434 }
1435 1435
1436 track_metrics_.IceConnectionChange(new_state); 1436 track_metrics_.IceConnectionChange(new_state);
1437 blink::WebRTCPeerConnectionHandlerClient::ICEConnectionState state = 1437 blink::WebRTCPeerConnectionHandlerClient::ICEConnectionState state =
1438 GetWebKitIceConnectionState(new_state); 1438 GetWebKitIceConnectionState(new_state);
1439 if (peer_connection_tracker_) 1439 if (peer_connection_tracker_)
1440 peer_connection_tracker_->TrackIceConnectionStateChange(this, state); 1440 peer_connection_tracker_->TrackIceConnectionStateChange(this, state);
1441 if(client_) 1441 if(!is_closed_)
tommi (sloooow) - chröme 2015/11/12 14:53:18 nit: add space
perkj_chrome 2015/11/12 15:48:38 Done.
1442 client_->didChangeICEConnectionState(state); 1442 client_->didChangeICEConnectionState(state);
1443 } 1443 }
1444 1444
1445 // Called any time the IceGatheringState changes 1445 // Called any time the IceGatheringState changes
1446 void RTCPeerConnectionHandler::OnIceGatheringChange( 1446 void RTCPeerConnectionHandler::OnIceGatheringChange(
1447 webrtc::PeerConnectionInterface::IceGatheringState new_state) { 1447 webrtc::PeerConnectionInterface::IceGatheringState new_state) {
1448 DCHECK(thread_checker_.CalledOnValidThread()); 1448 DCHECK(thread_checker_.CalledOnValidThread());
1449 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceGatheringChange"); 1449 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceGatheringChange");
1450 1450
1451 if (new_state == webrtc::PeerConnectionInterface::kIceGatheringComplete) { 1451 if (new_state == webrtc::PeerConnectionInterface::kIceGatheringComplete) {
1452 // If ICE gathering is completed, generate a NULL ICE candidate, 1452 // If ICE gathering is completed, generate a NULL ICE candidate,
1453 // to signal end of candidates. 1453 // to signal end of candidates.
1454 if (client_) { 1454 if (!is_closed_) {
1455 blink::WebRTCICECandidate null_candidate; 1455 blink::WebRTCICECandidate null_candidate;
1456 client_->didGenerateICECandidate(null_candidate); 1456 client_->didGenerateICECandidate(null_candidate);
1457 } 1457 }
1458 1458
1459 UMA_HISTOGRAM_COUNTS_100("WebRTC.PeerConnection.IPv4LocalCandidates", 1459 UMA_HISTOGRAM_COUNTS_100("WebRTC.PeerConnection.IPv4LocalCandidates",
1460 num_local_candidates_ipv4_); 1460 num_local_candidates_ipv4_);
1461 1461
1462 UMA_HISTOGRAM_COUNTS_100("WebRTC.PeerConnection.IPv6LocalCandidates", 1462 UMA_HISTOGRAM_COUNTS_100("WebRTC.PeerConnection.IPv6LocalCandidates",
1463 num_local_candidates_ipv6_); 1463 num_local_candidates_ipv6_);
1464 } else if (new_state == 1464 } else if (new_state ==
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1501 1501
1502 if (peer_connection_tracker_) { 1502 if (peer_connection_tracker_) {
1503 peer_connection_tracker_->TrackAddStream( 1503 peer_connection_tracker_->TrackAddStream(
1504 this, s->webkit_stream(), PeerConnectionTracker::SOURCE_REMOTE); 1504 this, s->webkit_stream(), PeerConnectionTracker::SOURCE_REMOTE);
1505 } 1505 }
1506 1506
1507 PerSessionWebRTCAPIMetrics::GetInstance()->IncrementStreamCounter(); 1507 PerSessionWebRTCAPIMetrics::GetInstance()->IncrementStreamCounter();
1508 1508
1509 track_metrics_.AddStream(MediaStreamTrackMetrics::RECEIVED_STREAM, 1509 track_metrics_.AddStream(MediaStreamTrackMetrics::RECEIVED_STREAM,
1510 s->webrtc_stream().get()); 1510 s->webrtc_stream().get());
1511 if (client_) 1511 if (!is_closed_)
1512 client_->didAddRemoteStream(s->webkit_stream()); 1512 client_->didAddRemoteStream(s->webkit_stream());
1513 } 1513 }
1514 1514
1515 void RTCPeerConnectionHandler::OnRemoveStream( 1515 void RTCPeerConnectionHandler::OnRemoveStream(
1516 const scoped_refptr<webrtc::MediaStreamInterface>& stream) { 1516 const scoped_refptr<webrtc::MediaStreamInterface>& stream) {
1517 DCHECK(thread_checker_.CalledOnValidThread()); 1517 DCHECK(thread_checker_.CalledOnValidThread());
1518 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnRemoveStreamImpl"); 1518 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnRemoveStreamImpl");
1519 RemoteStreamMap::iterator it = remote_streams_.find(stream.get()); 1519 RemoteStreamMap::iterator it = remote_streams_.find(stream.get());
1520 if (it == remote_streams_.end()) { 1520 if (it == remote_streams_.end()) {
1521 NOTREACHED() << "Stream not found"; 1521 NOTREACHED() << "Stream not found";
1522 return; 1522 return;
1523 } 1523 }
1524 1524
1525 track_metrics_.RemoveStream(MediaStreamTrackMetrics::RECEIVED_STREAM, 1525 track_metrics_.RemoveStream(MediaStreamTrackMetrics::RECEIVED_STREAM,
1526 stream.get()); 1526 stream.get());
1527 PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter(); 1527 PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter();
1528 1528
1529 scoped_ptr<RemoteMediaStreamImpl> remote_stream(it->second); 1529 scoped_ptr<RemoteMediaStreamImpl> remote_stream(it->second);
1530 const blink::WebMediaStream& webkit_stream = remote_stream->webkit_stream(); 1530 const blink::WebMediaStream& webkit_stream = remote_stream->webkit_stream();
1531 DCHECK(!webkit_stream.isNull()); 1531 DCHECK(!webkit_stream.isNull());
1532 remote_streams_.erase(it); 1532 remote_streams_.erase(it);
1533 1533
1534 if (peer_connection_tracker_) { 1534 if (peer_connection_tracker_) {
1535 peer_connection_tracker_->TrackRemoveStream( 1535 peer_connection_tracker_->TrackRemoveStream(
1536 this, webkit_stream, PeerConnectionTracker::SOURCE_REMOTE); 1536 this, webkit_stream, PeerConnectionTracker::SOURCE_REMOTE);
1537 } 1537 }
1538 1538
1539 if (client_) 1539 if (!is_closed_)
1540 client_->didRemoveRemoteStream(webkit_stream); 1540 client_->didRemoveRemoteStream(webkit_stream);
1541 } 1541 }
1542 1542
1543 void RTCPeerConnectionHandler::OnDataChannel( 1543 void RTCPeerConnectionHandler::OnDataChannel(
1544 scoped_ptr<RtcDataChannelHandler> handler) { 1544 scoped_ptr<RtcDataChannelHandler> handler) {
1545 DCHECK(thread_checker_.CalledOnValidThread()); 1545 DCHECK(thread_checker_.CalledOnValidThread());
1546 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnDataChannelImpl"); 1546 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnDataChannelImpl");
1547 1547
1548 if (peer_connection_tracker_) { 1548 if (peer_connection_tracker_) {
1549 peer_connection_tracker_->TrackCreateDataChannel( 1549 peer_connection_tracker_->TrackCreateDataChannel(
1550 this, handler->channel().get(), PeerConnectionTracker::SOURCE_REMOTE); 1550 this, handler->channel().get(), PeerConnectionTracker::SOURCE_REMOTE);
1551 } 1551 }
1552 1552
1553 if (client_) 1553 if (!is_closed_)
1554 client_->didAddRemoteDataChannel(handler.release()); 1554 client_->didAddRemoteDataChannel(handler.release());
1555 } 1555 }
1556 1556
1557 void RTCPeerConnectionHandler::OnIceCandidate( 1557 void RTCPeerConnectionHandler::OnIceCandidate(
1558 const std::string& sdp, const std::string& sdp_mid, int sdp_mline_index, 1558 const std::string& sdp, const std::string& sdp_mid, int sdp_mline_index,
1559 int component, int address_family) { 1559 int component, int address_family) {
1560 DCHECK(thread_checker_.CalledOnValidThread()); 1560 DCHECK(thread_checker_.CalledOnValidThread());
1561 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceCandidateImpl"); 1561 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceCandidateImpl");
1562 blink::WebRTCICECandidate web_candidate; 1562 blink::WebRTCICECandidate web_candidate;
1563 web_candidate.initialize(base::UTF8ToUTF16(sdp), 1563 web_candidate.initialize(base::UTF8ToUTF16(sdp),
1564 base::UTF8ToUTF16(sdp_mid), 1564 base::UTF8ToUTF16(sdp_mid),
1565 sdp_mline_index); 1565 sdp_mline_index);
1566 if (peer_connection_tracker_) { 1566 if (peer_connection_tracker_) {
1567 peer_connection_tracker_->TrackAddIceCandidate( 1567 peer_connection_tracker_->TrackAddIceCandidate(
1568 this, web_candidate, PeerConnectionTracker::SOURCE_LOCAL, true); 1568 this, web_candidate, PeerConnectionTracker::SOURCE_LOCAL, true);
1569 } 1569 }
1570 1570
1571 // Only the first m line's first component is tracked to avoid 1571 // Only the first m line's first component is tracked to avoid
1572 // miscounting when doing BUNDLE or rtcp mux. 1572 // miscounting when doing BUNDLE or rtcp mux.
1573 if (sdp_mline_index == 0 && component == 1) { 1573 if (sdp_mline_index == 0 && component == 1) {
1574 if (address_family == AF_INET) { 1574 if (address_family == AF_INET) {
1575 ++num_local_candidates_ipv4_; 1575 ++num_local_candidates_ipv4_;
1576 } else if (address_family == AF_INET6) { 1576 } else if (address_family == AF_INET6) {
1577 ++num_local_candidates_ipv6_; 1577 ++num_local_candidates_ipv6_;
1578 } else { 1578 } else {
1579 NOTREACHED(); 1579 NOTREACHED();
1580 } 1580 }
1581 } 1581 }
1582 if (client_) 1582 if (!is_closed_)
1583 client_->didGenerateICECandidate(web_candidate); 1583 client_->didGenerateICECandidate(web_candidate);
1584 } 1584 }
1585 1585
1586 webrtc::SessionDescriptionInterface* 1586 webrtc::SessionDescriptionInterface*
1587 RTCPeerConnectionHandler::CreateNativeSessionDescription( 1587 RTCPeerConnectionHandler::CreateNativeSessionDescription(
1588 const std::string& sdp, const std::string& type, 1588 const std::string& sdp, const std::string& type,
1589 webrtc::SdpParseError* error) { 1589 webrtc::SdpParseError* error) {
1590 webrtc::SessionDescriptionInterface* native_desc = 1590 webrtc::SessionDescriptionInterface* native_desc =
1591 dependency_factory_->CreateSessionDescription(type, sdp, error); 1591 dependency_factory_->CreateSessionDescription(type, sdp, error);
1592 1592
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1663 } 1663 }
1664 1664
1665 void RTCPeerConnectionHandler::ResetUMAStats() { 1665 void RTCPeerConnectionHandler::ResetUMAStats() {
1666 DCHECK(thread_checker_.CalledOnValidThread()); 1666 DCHECK(thread_checker_.CalledOnValidThread());
1667 num_local_candidates_ipv6_ = 0; 1667 num_local_candidates_ipv6_ = 0;
1668 num_local_candidates_ipv4_ = 0; 1668 num_local_candidates_ipv4_ = 0;
1669 ice_connection_checking_start_ = base::TimeTicks(); 1669 ice_connection_checking_start_ = base::TimeTicks();
1670 memset(ice_state_seen_, 0, sizeof(ice_state_seen_)); 1670 memset(ice_state_seen_, 0, sizeof(ice_state_seen_));
1671 } 1671 }
1672 } // namespace content 1672 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698