void RGWHTTPManager::manage_pending_requests()
{
+ std::list<set_state> changes;
+ {
+ std::lock_guard l{reqs_change_state_lock};
+ changes.swap(reqs_change_state);
+ }
+
reqs_lock.lock_shared();
if (max_threaded_req == num_reqs &&
unregistered_reqs.empty() &&
- reqs_change_state.empty()) {
+ changes.empty()) {
reqs_lock.unlock_shared();
return;
}
std::unique_lock wl{reqs_lock};
- if (!reqs_change_state.empty()) {
- for (auto siter : reqs_change_state) {
- _set_req_state(siter);
- }
- reqs_change_state.clear();
+ for (auto& siter : changes) {
+ _set_req_state(siter);
}
if (!unregistered_reqs.empty()) {
bitmask |= CURLPAUSE_RECV;
}
- reqs_change_state.push_back(set_state(req_data, bitmask));
+ {
+ std::lock_guard l{reqs_change_state_lock};
+ reqs_change_state.push_back(set_state(req_data, bitmask));
+ }
int ret = signal_thread();
if (ret < 0) {
return ret;
ceph::shared_mutex reqs_lock = ceph::make_shared_mutex("RGWHTTPManager::reqs_lock");
std::map<uint64_t, rgw_http_req_data *> reqs;
std::list<rgw_http_req_data *> unregistered_reqs;
+ ceph::mutex reqs_change_state_lock =
+ ceph::make_mutex("RGWHTTPManager::reqs_change_state_lock");
std::list<set_state> reqs_change_state;
std::map<uint64_t, rgw_http_req_data *> complete_reqs;
int64_t num_reqs = 0;