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