Defines smart pointer types to hold nghttp2_session and nghttp2_session_callbacks objects. PiperOrigin-RevId: 372112786 Change-Id: I087db189d3b23b4b2d4699814896c52d8443c0a2
diff --git a/http2/adapter/mock_nghttp2_callbacks.cc b/http2/adapter/mock_nghttp2_callbacks.cc index c3f9e71..4bc1e8e 100644 --- a/http2/adapter/mock_nghttp2_callbacks.cc +++ b/http2/adapter/mock_nghttp2_callbacks.cc
@@ -7,7 +7,7 @@ namespace test { /* static */ -nghttp2_session_callbacks* MockNghttp2Callbacks::GetCallbacks() { +nghttp2_session_callbacks_unique_ptr MockNghttp2Callbacks::GetCallbacks() { nghttp2_session_callbacks* callbacks; nghttp2_session_callbacks_new(&callbacks); @@ -107,7 +107,7 @@ ->OnInvalidFrameRecv(frame, error_code); }); - return callbacks; + return MakeCallbacksPtr(callbacks); } } // namespace test
diff --git a/http2/adapter/mock_nghttp2_callbacks.h b/http2/adapter/mock_nghttp2_callbacks.h index 2d279ad..fcc9c59 100644 --- a/http2/adapter/mock_nghttp2_callbacks.h +++ b/http2/adapter/mock_nghttp2_callbacks.h
@@ -2,6 +2,7 @@ #define QUICHE_HTTP2_ADAPTER_MOCK_NGHTTP2_CALLBACKS_H_ #include "absl/strings/string_view.h" +#include "http2/adapter/nghttp2_util.h" #include "third_party/nghttp2/src/lib/includes/nghttp2/nghttp2.h" #include "common/platform/api/quiche_test.h" @@ -16,7 +17,7 @@ MockNghttp2Callbacks() = default; // The caller takes ownership of the |nghttp2_session_callbacks|. - static nghttp2_session_callbacks* GetCallbacks(); + static nghttp2_session_callbacks_unique_ptr GetCallbacks(); MOCK_METHOD(ssize_t, Send,
diff --git a/http2/adapter/nghttp2_session.cc b/http2/adapter/nghttp2_session.cc index b288037..6d997a9 100644 --- a/http2/adapter/nghttp2_session.cc +++ b/http2/adapter/nghttp2_session.cc
@@ -6,10 +6,6 @@ namespace adapter { namespace { -void DeleteSession(nghttp2_session* session) { - nghttp2_session_del(session); -} - void DeleteOptions(nghttp2_option* options) { nghttp2_option_del(options); } @@ -20,7 +16,7 @@ nghttp2_session_callbacks* callbacks, nghttp2_option* options, void* userdata) - : session_(nullptr, DeleteSession), + : session_(MakeSessionPtr(nullptr)), options_(options, DeleteOptions), perspective_(perspective) { nghttp2_session* session;
diff --git a/http2/adapter/nghttp2_session.h b/http2/adapter/nghttp2_session.h index 27a2153..bf1e01b 100644 --- a/http2/adapter/nghttp2_session.h +++ b/http2/adapter/nghttp2_session.h
@@ -2,6 +2,7 @@ #define QUICHE_HTTP2_ADAPTER_NGHTTP2_SESSION_H_ #include "http2/adapter/http2_session.h" +#include "http2/adapter/nghttp2_util.h" #include "third_party/nghttp2/src/lib/includes/nghttp2/nghttp2.h" namespace http2 { @@ -27,10 +28,9 @@ nghttp2_session* raw_ptr() const { return session_.get(); } private: - using SessionDeleter = void (&)(nghttp2_session*); using OptionsDeleter = void (&)(nghttp2_option*); - std::unique_ptr<nghttp2_session, SessionDeleter> session_; + nghttp2_session_unique_ptr session_; std::unique_ptr<nghttp2_option, OptionsDeleter> options_; Perspective perspective_; };
diff --git a/http2/adapter/nghttp2_util.cc b/http2/adapter/nghttp2_util.cc index c191f4d..f457bb6 100644 --- a/http2/adapter/nghttp2_util.cc +++ b/http2/adapter/nghttp2_util.cc
@@ -10,6 +10,27 @@ namespace http2 { namespace adapter { +namespace { + +void DeleteCallbacks(nghttp2_session_callbacks* callbacks) { + nghttp2_session_callbacks_del(callbacks); +} + +void DeleteSession(nghttp2_session* session) { + nghttp2_session_del(session); +} + +} // namespace + +nghttp2_session_callbacks_unique_ptr MakeCallbacksPtr( + nghttp2_session_callbacks* callbacks) { + return nghttp2_session_callbacks_unique_ptr(callbacks, DeleteCallbacks); +} + +nghttp2_session_unique_ptr MakeSessionPtr(nghttp2_session* session) { + return nghttp2_session_unique_ptr(session, DeleteSession); +} + uint8_t* ToUint8Ptr(char* str) { return reinterpret_cast<uint8_t*>(str); } uint8_t* ToUint8Ptr(const char* str) { return const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(str));
diff --git a/http2/adapter/nghttp2_util.h b/http2/adapter/nghttp2_util.h index b9c03bb..a8d340a 100644 --- a/http2/adapter/nghttp2_util.h +++ b/http2/adapter/nghttp2_util.h
@@ -20,6 +20,18 @@ NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE; inline constexpr int kCancelStatus = NGHTTP2_ERR_CANCEL; +using CallbacksDeleter = void (&)(nghttp2_session_callbacks*); +using SessionDeleter = void (&)(nghttp2_session*); + +using nghttp2_session_callbacks_unique_ptr = + std::unique_ptr<nghttp2_session_callbacks, CallbacksDeleter>; +using nghttp2_session_unique_ptr = + std::unique_ptr<nghttp2_session, SessionDeleter>; + +nghttp2_session_callbacks_unique_ptr MakeCallbacksPtr( + nghttp2_session_callbacks* callbacks); +nghttp2_session_unique_ptr MakeSessionPtr(nghttp2_session* session); + uint8_t* ToUint8Ptr(char* str); uint8_t* ToUint8Ptr(const char* str);