diff --git a/src/cpp-utils/CMakeLists.txt b/src/cpp-utils/CMakeLists.txt index 9aac88e1..d1e0451c 100644 --- a/src/cpp-utils/CMakeLists.txt +++ b/src/cpp-utils/CMakeLists.txt @@ -15,7 +15,6 @@ set(SOURCES tempfile/TempDir.cpp network/HttpClient.cpp network/CurlHttpClient.cpp - network/CurlInitializerRAII.cpp network/FakeHttpClient.cpp io/Console.cpp io/DontEchoStdinToStdoutRAII.cpp diff --git a/src/cpp-utils/network/CurlHttpClient.cpp b/src/cpp-utils/network/CurlHttpClient.cpp index 01e8c52d..2c10228a 100644 --- a/src/cpp-utils/network/CurlHttpClient.cpp +++ b/src/cpp-utils/network/CurlHttpClient.cpp @@ -3,15 +3,35 @@ #include "CurlHttpClient.h" #include #include -#include using boost::none; using boost::optional; using std::string; using std::ostringstream; +using std::mutex; +using std::unique_lock; namespace cpputils { + mutex CurlHttpClient::CurlInitializerRAII::_mutex; + uint32_t CurlHttpClient::CurlInitializerRAII::_refcount = 0; + + CurlHttpClient::CurlInitializerRAII::CurlInitializerRAII() { + unique_lock lock(_mutex); + if (0 == _refcount) { + curl_global_init(CURL_GLOBAL_ALL); + } + _refcount += 1; + } + + CurlHttpClient::CurlInitializerRAII::~CurlInitializerRAII() { + unique_lock lock(_mutex); + _refcount -= 1; + if (0 == _refcount) { + curl_global_cleanup(); + } + } + size_t CurlHttpClient::write_data(void *ptr, size_t size, size_t nmemb, ostringstream *stream) { stream->write(static_cast(ptr), size * nmemb); return size * nmemb; diff --git a/src/cpp-utils/network/CurlHttpClient.h b/src/cpp-utils/network/CurlHttpClient.h index 49f859a8..696c6e67 100644 --- a/src/cpp-utils/network/CurlHttpClient.h +++ b/src/cpp-utils/network/CurlHttpClient.h @@ -1,10 +1,11 @@ #pragma once -#ifndef MESSMER_CPPUTILS_NETWORK_HTTPCLIENT_HPP -#define MESSMER_CPPUTILS_NETWORK_HTTPCLIENT_HPP +#ifndef MESSMER_CPPUTILS_NETWORK_CURLHTTPCLIENT_HPP +#define MESSMER_CPPUTILS_NETWORK_CURLHTTPCLIENT_HPP #include "HttpClient.h" #include "../macros.h" -#include "CurlInitializerRAII.h" +#include +#include namespace cpputils { @@ -17,6 +18,19 @@ namespace cpputils { boost::optional get(const std::string &url, boost::optional timeoutMsec = boost::none) override; private: + // When the first object of this class is created, it will initialize curl using curl_global_init(). + // When the last object is destroyed, it will deinitialize curl using curl_global_cleanup(). + class CurlInitializerRAII final { + public: + CurlInitializerRAII(); + ~CurlInitializerRAII(); + private: + static std::mutex _mutex; + static uint32_t _refcount; + + DISALLOW_COPY_AND_ASSIGN(CurlInitializerRAII); + }; + CurlInitializerRAII curlInitializer; CURL *curl; diff --git a/src/cpp-utils/network/CurlInitializerRAII.cpp b/src/cpp-utils/network/CurlInitializerRAII.cpp deleted file mode 100644 index c9172852..00000000 --- a/src/cpp-utils/network/CurlInitializerRAII.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "CurlInitializerRAII.h" - -using std::mutex; -using std::unique_lock; - -namespace cpputils { - -mutex CurlInitializerRAII::_mutex; -uint32_t CurlInitializerRAII::_refcount = 0; - -CurlInitializerRAII::CurlInitializerRAII() { - unique_lock lock(_mutex); - if (0 == _refcount) { - curl_global_init(CURL_GLOBAL_ALL); - } - _refcount += 1; -} - -CurlInitializerRAII::~CurlInitializerRAII() { - unique_lock lock(_mutex); - _refcount -= 1; - if (0 == _refcount) { - curl_global_cleanup(); - } -} - -} diff --git a/src/cpp-utils/network/CurlInitializerRAII.h b/src/cpp-utils/network/CurlInitializerRAII.h deleted file mode 100644 index a95d7dc5..00000000 --- a/src/cpp-utils/network/CurlInitializerRAII.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once -#ifndef MESSMER_CPPUTILS_NETWORK_CURLINITIALIZERRAII_HPP -#define MESSMER_CPPUTILS_NETWORK_CURLINITIALIZERRAII_HPP - -#include -#include -#include - -namespace cpputils { - // TODO Test - - // When the first object of this class is created, it will initialize curl using curl_global_init(). - // When the last object is destroyed, it will deinitialize curl using curl_global_cleanup(). - class CurlInitializerRAII final { - public: - CurlInitializerRAII(); - ~CurlInitializerRAII(); - private: - static std::mutex _mutex; - static uint32_t _refcount; - - DISALLOW_COPY_AND_ASSIGN(CurlInitializerRAII); - }; - -} - -#endif