Run curl_global_cleanup only once per application

This commit is contained in:
Howard Hinnant
2021-03-11 19:58:34 -05:00
parent 0e08b942c8
commit b899774303

View File

@@ -2846,24 +2846,29 @@ file_exists(const std::string& filename)
// CURL tools // CURL tools
static namespace
int {
curl_global()
struct curl_global_init_and_cleanup
{
~curl_global_init_and_cleanup()
{
::curl_global_cleanup();
}
curl_global_init_and_cleanup()
{ {
if (::curl_global_init(CURL_GLOBAL_DEFAULT) != 0) if (::curl_global_init(CURL_GLOBAL_DEFAULT) != 0)
throw std::runtime_error("CURL global initialization failed"); throw std::runtime_error("CURL global initialization failed");
return 0;
} }
curl_global_init_and_cleanup(curl_global_init_and_cleanup const&) = delete;
namespace curl_global_init_and_cleanup& operator=(curl_global_init_and_cleanup const&) = delete;
{ };
struct curl_deleter struct curl_deleter
{ {
void operator()(CURL* p) const void operator()(CURL* p) const
{ {
::curl_easy_cleanup(p); ::curl_easy_cleanup(p);
::curl_global_cleanup();
} }
}; };
@@ -2873,8 +2878,7 @@ static
std::unique_ptr<CURL, curl_deleter> std::unique_ptr<CURL, curl_deleter>
curl_init() curl_init()
{ {
static const auto curl_is_now_initiailized = curl_global(); static const curl_global_init_and_cleanup _{};
(void)curl_is_now_initiailized;
return std::unique_ptr<CURL, curl_deleter>{::curl_easy_init()}; return std::unique_ptr<CURL, curl_deleter>{::curl_easy_init()};
} }