diff options
Diffstat (limited to 'third_party/libwebrtc/net/dcsctp/socket/callback_deferrer.h')
-rw-r--r-- | third_party/libwebrtc/net/dcsctp/socket/callback_deferrer.h | 17 |
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 |