Adds an `emplace()` method to RunOnExit, and deletes the move and copy constructors. There's some evidence in CL 411404964 that the copy constructor is accidentally used in the ChromeOS Chromium build. PiperOrigin-RevId: 411618225
diff --git a/http2/adapter/oghttp2_adapter_test.cc b/http2/adapter/oghttp2_adapter_test.cc index 7d0ca8a..c3f4356 100644 --- a/http2/adapter/oghttp2_adapter_test.cc +++ b/http2/adapter/oghttp2_adapter_test.cc
@@ -1836,7 +1836,7 @@ } TEST(OgHttp2AdapterServerTest, - DISABLED_IncompleteRequestWithServerResponseRstStreamEnabled) { + IncompleteRequestWithServerResponseRstStreamEnabled) { DataSavingVisitor visitor; OgHttp2Adapter::Options options{.perspective = Perspective::kServer, .rst_stream_no_error_when_incomplete = true};
diff --git a/http2/adapter/oghttp2_session.cc b/http2/adapter/oghttp2_session.cc index 168a9a0..0792a5c 100644 --- a/http2/adapter/oghttp2_session.cc +++ b/http2/adapter/oghttp2_session.cc
@@ -127,8 +127,10 @@ RunOnExit() = default; explicit RunOnExit(std::function<void()> f) : f_(std::move(f)) {} - RunOnExit(RunOnExit&& other) = default; - RunOnExit& operator=(RunOnExit&& other) = default; + RunOnExit(const RunOnExit& other) = delete; + RunOnExit& operator=(const RunOnExit& other) = delete; + RunOnExit(RunOnExit&& other) = delete; + RunOnExit& operator=(RunOnExit&& other) = delete; ~RunOnExit() { if (f_) { @@ -137,6 +139,8 @@ f_ = {}; } + void emplace(std::function<void()> f) { f_ = std::move(f); } + private: std::function<void()> f_; }; @@ -417,7 +421,7 @@ streams_reset_.insert(frame->stream_id()); } else if (iter != stream_map_.end()) { // Enqueue RST_STREAM NO_ERROR if appropriate. - r = RunOnExit{[this, iter]() { MaybeFinWithRstStream(iter); }}; + r.emplace([this, iter]() { MaybeFinWithRstStream(iter); }); } } if (frame->stream_id() != 0) {