Remove remaining sigslots from DataChannelController
This includes:
* SignalDataChannelTransportWritable_s
* SignalDataChannelTransportReceivedData_s
* SignalDataChannelTransportChannelClosing_s
* Removing sigslot::has_slots<> inheritance from SctpDataChannel
Instead, we use the existing sctp_data_channels_ vector of channels
known to the DCC to deliver the callbacks.
Bug: webrtc:11943, webrtc:11547
Change-Id: I7935d7505856eedf04981b8ba665ef8419166c1d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/297100
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39557}
diff --git a/pc/data_channel_controller.cc b/pc/data_channel_controller.cc
index 1cad4ea..c8579de 100644
--- a/pc/data_channel_controller.cc
+++ b/pc/data_channel_controller.cc
@@ -41,32 +41,16 @@
bool DataChannelController::ConnectDataChannel(
SctpDataChannel* webrtc_data_channel) {
RTC_DCHECK_RUN_ON(signaling_thread());
- if (!data_channel_transport()) {
- // Don't log an error here, because DataChannels are expected to call
- // ConnectDataChannel in this state. It's the only way to initially tell
- // whether or not the underlying transport is ready.
- return false;
- }
- SignalDataChannelTransportWritable_s.connect(
- webrtc_data_channel, &SctpDataChannel::OnTransportReady);
- SignalDataChannelTransportReceivedData_s.connect(
- webrtc_data_channel, &SctpDataChannel::OnDataReceived);
- SignalDataChannelTransportChannelClosing_s.connect(
- webrtc_data_channel, &SctpDataChannel::OnClosingProcedureStartedRemotely);
- return true;
+ // TODO(bugs.webrtc.org/11547): This method can be removed once not
+ // needed by `SctpDataChannel`.
+ return data_channel_transport() ? true : false;
}
void DataChannelController::DisconnectDataChannel(
SctpDataChannel* webrtc_data_channel) {
RTC_DCHECK_RUN_ON(signaling_thread());
- if (!data_channel_transport()) {
- RTC_LOG(LS_ERROR)
- << "DisconnectDataChannel called when sctp_transport_ is NULL.";
- return;
- }
- SignalDataChannelTransportWritable_s.disconnect(webrtc_data_channel);
- SignalDataChannelTransportReceivedData_s.disconnect(webrtc_data_channel);
- SignalDataChannelTransportChannelClosing_s.disconnect(webrtc_data_channel);
+ // TODO(bugs.webrtc.org/11547): This method can be removed once not
+ // needed by `SctpDataChannel`.
}
void DataChannelController::AddSctpDataStream(int sid) {
@@ -120,10 +104,11 @@
SafeTask(signaling_safety_.flag(), [this, params, buffer] {
RTC_DCHECK_RUN_ON(signaling_thread());
// TODO(bugs.webrtc.org/11547): The data being received should be
- // delivered on the network thread (change
- // SignalDataChannelTransportReceivedData_s to
- // SignalDataChannelTransportReceivedData_n).
- SignalDataChannelTransportReceivedData_s(params, buffer);
+ // delivered on the network thread.
+ for (const auto& channel : sctp_data_channels_) {
+ if (channel->id() == params.sid)
+ channel->OnDataReceived(params, buffer);
+ }
}));
}
@@ -132,7 +117,11 @@
signaling_thread()->PostTask(
SafeTask(signaling_safety_.flag(), [this, channel_id] {
RTC_DCHECK_RUN_ON(signaling_thread());
- SignalDataChannelTransportChannelClosing_s(channel_id);
+ // TODO(bugs.webrtc.org/11547): Should run on the network thread.
+ for (const auto& channel : sctp_data_channels_) {
+ if (channel->id() == channel_id)
+ channel->OnClosingProcedureStartedRemotely();
+ }
}));
}
@@ -151,8 +140,6 @@
// Note: this causes OnSctpDataChannelClosed() to not do anything
// when called from within `OnClosingProcedureComplete`.
sctp_data_channels_.erase(it);
-
- DisconnectDataChannel(channel.get());
sid_allocator_.ReleaseSid(channel->sid());
channel->OnClosingProcedureComplete();
@@ -165,7 +152,8 @@
signaling_thread()->PostTask(SafeTask(signaling_safety_.flag(), [this] {
RTC_DCHECK_RUN_ON(signaling_thread());
data_channel_transport_ready_to_send_ = true;
- SignalDataChannelTransportWritable_s(data_channel_transport_ready_to_send_);
+ for (const auto& channel : sctp_data_channels_)
+ channel->OnTransportReady(true);
}));
}
diff --git a/pc/data_channel_controller.h b/pc/data_channel_controller.h
index 5fd0afb..c791924 100644
--- a/pc/data_channel_controller.h
+++ b/pc/data_channel_controller.h
@@ -26,7 +26,6 @@
#include "rtc_base/checks.h"
#include "rtc_base/copy_on_write_buffer.h"
#include "rtc_base/ssl_stream_adapter.h"
-#include "rtc_base/third_party/sigslot/sigslot.h"
#include "rtc_base/thread.h"
#include "rtc_base/thread_annotations.h"
#include "rtc_base/weak_ptr.h"
@@ -151,19 +150,6 @@
std::vector<rtc::scoped_refptr<SctpDataChannel>> sctp_data_channels_
RTC_GUARDED_BY(signaling_thread());
- // Signals from `data_channel_transport_`. These are invoked on the
- // signaling thread.
- // TODO(bugs.webrtc.org/11547): These '_s' signals likely all belong on the
- // network thread.
- sigslot::signal1<bool> SignalDataChannelTransportWritable_s
- RTC_GUARDED_BY(signaling_thread());
- sigslot::signal2<const cricket::ReceiveDataParams&,
- const rtc::CopyOnWriteBuffer&>
- SignalDataChannelTransportReceivedData_s
- RTC_GUARDED_BY(signaling_thread());
- sigslot::signal1<int> SignalDataChannelTransportChannelClosing_s
- RTC_GUARDED_BY(signaling_thread());
-
// Owning PeerConnection.
PeerConnectionInternal* const pc_;
// The weak pointers must be dereferenced and invalidated on the signalling
diff --git a/pc/data_channel_unittest.cc b/pc/data_channel_unittest.cc
index 529cb6b..e783dce 100644
--- a/pc/data_channel_unittest.cc
+++ b/pc/data_channel_unittest.cc
@@ -433,21 +433,6 @@
EXPECT_EQ(1, controller_->last_sid());
}
-// Tests that the incoming messages with wrong ids are rejected.
-TEST_F(SctpDataChannelTest, ReceiveDataWithInvalidId) {
- webrtc_data_channel_->SetSctpSid(StreamId(1));
- SetChannelReady();
-
- AddObserver();
-
- cricket::ReceiveDataParams params;
- params.sid = 0;
- DataBuffer buffer("abcd");
- webrtc_data_channel_->OnDataReceived(params, buffer.data);
-
- EXPECT_EQ(0U, observer_->messages_received());
-}
-
// Tests that the incoming messages with right ids are accepted.
TEST_F(SctpDataChannelTest, ReceiveDataWithValidId) {
webrtc_data_channel_->SetSctpSid(StreamId(1));
diff --git a/pc/sctp_data_channel.cc b/pc/sctp_data_channel.cc
index be2a480..ccd9c70 100644
--- a/pc/sctp_data_channel.cc
+++ b/pc/sctp_data_channel.cc
@@ -369,9 +369,9 @@
controller_->AddSctpDataStream(sid.stream_id_int());
}
-void SctpDataChannel::OnClosingProcedureStartedRemotely(int sid) {
+void SctpDataChannel::OnClosingProcedureStartedRemotely() {
RTC_DCHECK_RUN_ON(signaling_thread_);
- if (id_.stream_id_int() == sid && state_ != kClosing && state_ != kClosed) {
+ if (state_ != kClosing && state_ != kClosed) {
// Don't bother sending queued data since the side that initiated the
// closure wouldn't receive it anyway. See crbug.com/559394 for a lengthy
// discussion about this.
@@ -429,9 +429,7 @@
void SctpDataChannel::OnDataReceived(const cricket::ReceiveDataParams& params,
const rtc::CopyOnWriteBuffer& payload) {
RTC_DCHECK_RUN_ON(signaling_thread_);
- if (id_.stream_id_int() != params.sid) {
- return;
- }
+ RTC_DCHECK_EQ(id_.stream_id_int(), params.sid);
if (params.type == DataMessageType::kControl) {
if (handshake_state_ != kHandshakeWaitingForAck) {
diff --git a/pc/sctp_data_channel.h b/pc/sctp_data_channel.h
index 17cad26..6289801 100644
--- a/pc/sctp_data_channel.h
+++ b/pc/sctp_data_channel.h
@@ -29,7 +29,6 @@
#include "rtc_base/containers/flat_set.h"
#include "rtc_base/copy_on_write_buffer.h"
#include "rtc_base/ssl_stream_adapter.h" // For SSLRole
-#include "rtc_base/third_party/sigslot/sigslot.h"
#include "rtc_base/thread.h"
#include "rtc_base/thread_annotations.h"
#include "rtc_base/weak_ptr.h"
@@ -100,7 +99,7 @@
// SctpDataChannel is an implementation of the DataChannelInterface based on
// SctpTransport. It provides an implementation of unreliable or
-// reliabledata channels.
+// reliable data channels.
// DataChannel states:
// kConnecting: The channel has been created the transport might not yet be
@@ -122,8 +121,7 @@
// 5. Bob sends outgoing stream reset.
// 6. Alice receives incoming reset, Bob receives acknowledgement. Both receive
// OnClosingProcedureComplete callback and transition to kClosed.
-class SctpDataChannel : public DataChannelInterface,
- public sigslot::has_slots<> {
+class SctpDataChannel : public DataChannelInterface {
public:
static rtc::scoped_refptr<SctpDataChannel> Create(
rtc::WeakPtr<SctpDataChannelControllerInterface> controller,
@@ -188,9 +186,10 @@
// Sets the SCTP sid and adds to transport layer if not set yet. Should only
// be called once.
void SetSctpSid(const StreamId& sid);
+
// The remote side started the closing procedure by resetting its outgoing
// stream (our incoming stream). Sets state to kClosing.
- void OnClosingProcedureStartedRemotely(int sid);
+ void OnClosingProcedureStartedRemotely();
// The closing procedure is complete; both incoming and outgoing stream
// resets are done and the channel can transition to kClosed. Called
// asynchronously after RemoveSctpDataStream.