From 3ce3bc52ecad684d8439241dd9108cb5f2b89350 Mon Sep 17 00:00:00 2001 From: Bright Chen Date: Sun, 12 May 2024 23:04:35 +0800 Subject: [PATCH 1/2] Support SCOPE_EXIT macro --- src/butil/endpoint.cpp | 4 ++-- src/butil/memory/scope_guard.h | 26 ++++++++++++++++++++++++++ test/scope_guard_unittest.cc | 19 +++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/butil/endpoint.cpp b/src/butil/endpoint.cpp index ac1f958ceb..689701e287 100644 --- a/src/butil/endpoint.cpp +++ b/src/butil/endpoint.cpp @@ -467,11 +467,11 @@ int pthread_timed_connect(int sockfd, const struct sockaddr* serv_addr, butil::make_non_blocking(sockfd); } // Scoped non-blocking. - auto guard = butil::MakeScopeGuard([is_blocking, sockfd]() { + BAIDU_SCOPE_EXIT { if (is_blocking) { butil::make_blocking(sockfd); } - }); + }; const int rc = ::connect(sockfd, serv_addr, addrlen); if (rc == 0 || errno != EINPROGRESS) { diff --git a/src/butil/memory/scope_guard.h b/src/butil/memory/scope_guard.h index 1771683f68..c04312c4d7 100644 --- a/src/butil/memory/scope_guard.h +++ b/src/butil/memory/scope_guard.h @@ -19,6 +19,7 @@ #define BRPC_SCOPED_GUARD_H #include +#include "butil/macros.h" namespace butil { @@ -83,6 +84,31 @@ ScopeGuard MakeScopeGuard(Callback&& callback) noexcept { return ScopeGuard{ std::forward(callback)}; } +namespace internal { +// for BAIDU_SCOPE_EXIT. +enum class ScopeExitHelper {}; + +template +ScopeGuard +operator+(ScopeExitHelper, Callback&& callback) { + return MakeScopeGuard(std::forward(callback)); } +} // namespace internal +} // namespace butil + +#define BAIDU_ANONYMOUS_VARIABLE(prefix) BAIDU_CONCAT(prefix, __COUNTER__) + +// The code in the braces of BAIDU_SCOPE_EXIT always executes at the end of the scope. +// Variables used within BAIDU_SCOPE_EXIT are captured by reference. +// Example: +// int fd = open(...); +// BAIDU_SCOPE_EXIT { +// close(fd); +// }; +// use fd ... +// +#define BAIDU_SCOPE_EXIT \ + auto BAIDU_ANONYMOUS_VARIABLE(SCOPE_EXIT) = \ + ::butil::internal::ScopeExitHelper() + [&]() noexcept #endif // BRPC_SCOPED_GUARD_H diff --git a/test/scope_guard_unittest.cc b/test/scope_guard_unittest.cc index 085162fdff..dd4155db48 100644 --- a/test/scope_guard_unittest.cc +++ b/test/scope_guard_unittest.cc @@ -28,6 +28,25 @@ TEST(ScopedGuardTest, sanity) { } ASSERT_TRUE(flag); + flag = false; + { + BAIDU_SCOPE_EXIT { + flag = true; + }; + } + ASSERT_TRUE(flag); + + { + BAIDU_SCOPE_EXIT { + flag = true; + }; + + BAIDU_SCOPE_EXIT { + flag = false; + }; + } + ASSERT_TRUE(flag); + flag = false; { auto guard = butil::MakeScopeGuard([&flag] { From 450deb49e48a87a4028cf1fce4a23446fda17c21 Mon Sep 17 00:00:00 2001 From: Bright Chen Date: Thu, 16 May 2024 23:03:53 +0800 Subject: [PATCH 2/2] Rename --- src/butil/endpoint.cpp | 2 +- src/butil/memory/scope_guard.h | 6 +++--- test/scope_guard_unittest.cc | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/butil/endpoint.cpp b/src/butil/endpoint.cpp index 689701e287..cfd536a06f 100644 --- a/src/butil/endpoint.cpp +++ b/src/butil/endpoint.cpp @@ -467,7 +467,7 @@ int pthread_timed_connect(int sockfd, const struct sockaddr* serv_addr, butil::make_non_blocking(sockfd); } // Scoped non-blocking. - BAIDU_SCOPE_EXIT { + BRPC_SCOPE_EXIT { if (is_blocking) { butil::make_blocking(sockfd); } diff --git a/src/butil/memory/scope_guard.h b/src/butil/memory/scope_guard.h index c04312c4d7..5ed65a4ce9 100644 --- a/src/butil/memory/scope_guard.h +++ b/src/butil/memory/scope_guard.h @@ -96,7 +96,7 @@ operator+(ScopeExitHelper, Callback&& callback) { } // namespace internal } // namespace butil -#define BAIDU_ANONYMOUS_VARIABLE(prefix) BAIDU_CONCAT(prefix, __COUNTER__) +#define BRPC_ANONYMOUS_VARIABLE(prefix) BAIDU_CONCAT(prefix, __COUNTER__) // The code in the braces of BAIDU_SCOPE_EXIT always executes at the end of the scope. // Variables used within BAIDU_SCOPE_EXIT are captured by reference. @@ -107,8 +107,8 @@ operator+(ScopeExitHelper, Callback&& callback) { // }; // use fd ... // -#define BAIDU_SCOPE_EXIT \ - auto BAIDU_ANONYMOUS_VARIABLE(SCOPE_EXIT) = \ +#define BRPC_SCOPE_EXIT \ + auto BRPC_ANONYMOUS_VARIABLE(SCOPE_EXIT) = \ ::butil::internal::ScopeExitHelper() + [&]() noexcept #endif // BRPC_SCOPED_GUARD_H diff --git a/test/scope_guard_unittest.cc b/test/scope_guard_unittest.cc index dd4155db48..f5e4b620d3 100644 --- a/test/scope_guard_unittest.cc +++ b/test/scope_guard_unittest.cc @@ -30,18 +30,18 @@ TEST(ScopedGuardTest, sanity) { flag = false; { - BAIDU_SCOPE_EXIT { + BRPC_SCOPE_EXIT { flag = true; }; } ASSERT_TRUE(flag); { - BAIDU_SCOPE_EXIT { + BRPC_SCOPE_EXIT { flag = true; }; - BAIDU_SCOPE_EXIT { + BRPC_SCOPE_EXIT { flag = false; }; }