Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions .clang-tidy
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,14 @@ Checks: '*,
-cppcoreguidelines-avoid-do-while,
-llvmlibc-inline-function-decl,
-altera-struct-pack-align,
-boost-use-ranges
-boost-use-ranges,
-cppcoreguidelines-special-member-functions,
-hicpp-special-member-functions,
-misc-header-include-cycle,
-cppcoreguidelines-avoid-const-or-ref-data-members,
-google-explicit-constructor,
-hicpp-explicit-conversions
'
WarningsAsErrors: '*'
HeaderFilterRegex: 'src\/*.hpp'
HeaderFilterRegex: 'include\/cpr\/.*\.h(pp)?'
FormatStyle: file
4 changes: 4 additions & 0 deletions cppcheck-suppressions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,8 @@
<suppress>
<id>postfixOperator</id>
</suppress>
<suppress>
<id>syntaxError</id>
<fileName>*/cpr/util.cpp</fileName>
</suppress>
</suppressions>
2 changes: 1 addition & 1 deletion cpr/async.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
namespace cpr {

// NOLINTNEXTLINE (cppcoreguidelines-avoid-non-const-global-variables)
CPR_SINGLETON_IMPL(GlobalThreadPool)
CPR_SINGLETON_IMPL(GlobalThreadPool);

} // namespace cpr
6 changes: 3 additions & 3 deletions cpr/callback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
#include <functional>

namespace cpr {

void CancellationCallback::SetProgressCallback(ProgressCallback& u_cb) {
user_cb.emplace(std::reference_wrapper{u_cb});
}

bool CancellationCallback::operator()(cpr_pf_arg_t dltotal, cpr_pf_arg_t dlnow, cpr_pf_arg_t ultotal, cpr_pf_arg_t ulnow) const {
const bool cont_operation{!cancellation_state->load()};
return user_cb ? (cont_operation && (*user_cb)(dltotal, dlnow, ultotal, ulnow)) : cont_operation;
const bool const_operation = !(cancellation_state->load());
return user_cb ? (const_operation && (*user_cb)(dltotal, dlnow, ultotal, ulnow)) : const_operation;
}
} // namespace cpr
23 changes: 11 additions & 12 deletions cpr/connection_pool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,33 +7,32 @@ namespace cpr {
ConnectionPool::ConnectionPool() {
CURLSH* curl_share = curl_share_init();
this->connection_mutex_ = std::make_shared<std::mutex>();

auto lock_f = +[](CURL* /*handle*/, curl_lock_data /*data*/, curl_lock_access /*access*/, void* userptr) {
std::mutex* lock = static_cast<std::mutex*>(userptr);
lock->lock(); // cppcheck-suppress localMutex // False positive: mutex is used as callback for libcurl, not local scope
};

auto unlock_f = +[](CURL* /*handle*/, curl_lock_data /*data*/, void* userptr) {
std::mutex* lock = static_cast<std::mutex*>(userptr);
lock->unlock();
};

curl_share_setopt(curl_share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
curl_share_setopt(curl_share, CURLSHOPT_USERDATA, this->connection_mutex_.get());
curl_share_setopt(curl_share, CURLSHOPT_LOCKFUNC, lock_f);
curl_share_setopt(curl_share, CURLSHOPT_UNLOCKFUNC, unlock_f);

this->curl_sh_ = std::shared_ptr<CURLSH>(curl_share,
[](CURLSH* ptr) {
// Make sure to reset callbacks before cleanup to avoid deadlocks
curl_share_setopt(ptr, CURLSHOPT_LOCKFUNC, nullptr);
curl_share_setopt(ptr, CURLSHOPT_UNLOCKFUNC, nullptr);
curl_share_cleanup(ptr);
});

this->curl_sh_ = std::shared_ptr<CURLSH>(curl_share, [](CURLSH* ptr) {
// Make sure to reset callbacks before cleanup to avoid deadlocks
curl_share_setopt(ptr, CURLSHOPT_LOCKFUNC, nullptr);
curl_share_setopt(ptr, CURLSHOPT_UNLOCKFUNC, nullptr);
curl_share_cleanup(ptr);
});
}

void ConnectionPool::SetupHandler(CURL* easy_handler) const {
curl_easy_setopt(easy_handler, CURLOPT_SHARE, this->curl_sh_.get());
}

} // namespace cpr
} // namespace cpr
2 changes: 1 addition & 1 deletion cpr/cprtypes.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#include "cpr/cprtypes.h"

#include <algorithm>
#include <cctype>
#include <string>


namespace cpr {
bool CaseInsensitiveCompare::operator()(const std::string& a, const std::string& b) const noexcept {
return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), [](unsigned char ac, unsigned char bc) { return std::tolower(ac) < std::tolower(bc); });
Expand Down
4 changes: 2 additions & 2 deletions cpr/curlholder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ CurlHolder::CurlHolder() {
assert(handle);
}

CurlHolder::CurlHolder(CurlHolder&& old) noexcept : handle(old.handle), chunk(old.chunk), resolveCurlList(old.resolveCurlList), multipart(old.multipart), error(std::move(old.error)) {
CurlHolder::CurlHolder(CurlHolder&& old) noexcept : handle(old.handle), chunk(old.chunk), resolveCurlList(old.resolveCurlList), multipart(old.multipart), error(old.error) {
// Avoid double free
old.handle = nullptr;
old.chunk = nullptr;
Expand All @@ -49,7 +49,7 @@ CurlHolder& CurlHolder::operator=(CurlHolder&& old) noexcept {
chunk = old.chunk;
resolveCurlList = old.resolveCurlList;
multipart = old.multipart;
error = std::move(old.error);
error = old.error;

// Avoid double free
old.handle = nullptr;
Expand Down
Loading
Loading