summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/net/dcsctp/socket/callback_deferrer.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--third_party/libwebrtc/net/dcsctp/socket/callback_deferrer.h17
1 files changed, 16 insertions, 1 deletions
diff --git a/third_party/libwebrtc/net/dcsctp/socket/callback_deferrer.h b/third_party/libwebrtc/net/dcsctp/socket/callback_deferrer.h
index 6659e87155..9d9fbcef06 100644
--- a/third_party/libwebrtc/net/dcsctp/socket/callback_deferrer.h
+++ b/third_party/libwebrtc/net/dcsctp/socket/callback_deferrer.h
@@ -18,6 +18,7 @@
#include <vector>
#include "absl/strings/string_view.h"
+#include "absl/types/variant.h"
#include "api/array_view.h"
#include "api/ref_counted_base.h"
#include "api/scoped_refptr.h"
@@ -89,12 +90,26 @@ class CallbackDeferrer : public DcSctpSocketCallbacks {
void OnLifecycleEnd(LifecycleId lifecycle_id) override;
private:
+ struct Error {
+ ErrorKind error;
+ std::string message;
+ };
+ struct StreamReset {
+ std::vector<StreamID> streams;
+ std::string message;
+ };
+ // Use a pre-sized variant for storage to avoid double heap allocation. This
+ // variant can hold all cases of stored data.
+ using CallbackData = absl::
+ variant<absl::monostate, DcSctpMessage, Error, StreamReset, StreamID>;
+ using Callback = void (*)(CallbackData, DcSctpSocketCallbacks&);
+
void Prepare();
void TriggerDeferred();
DcSctpSocketCallbacks& underlying_;
bool prepared_ = false;
- std::vector<std::function<void(DcSctpSocketCallbacks& cb)>> deferred_;
+ std::vector<std::pair<Callback, CallbackData>> deferred_;
};
} // namespace dcsctp