Optimise : use condition variable instead of busyloop
This commit is contained in:
parent
6d83e1d4d3
commit
93dd64ceca
1 changed files with 11 additions and 5 deletions
|
@ -19,6 +19,7 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#include <condition_variable>
|
||||||
|
|
||||||
#define SOC_ALIGN 0x1000
|
#define SOC_ALIGN 0x1000
|
||||||
#define SOC_BUFFERSIZE 0x100000
|
#define SOC_BUFFERSIZE 0x100000
|
||||||
|
@ -803,6 +804,8 @@ json_t* Client::doRequest(const char* method, const std::string& path, json_t* b
|
||||||
|
|
||||||
CURLM* curl_multi_handle;
|
CURLM* curl_multi_handle;
|
||||||
std::map<CURLM*, CURLcode> curl_handles_done;
|
std::map<CURLM*, CURLcode> curl_handles_done;
|
||||||
|
std::condition_variable on_done;
|
||||||
|
std::mutex handles_done_m;
|
||||||
Thread curl_multi_loop_thread;
|
Thread curl_multi_loop_thread;
|
||||||
|
|
||||||
[[noreturn]] void curl_multi_loop(void* p) {
|
[[noreturn]] void curl_multi_loop(void* p) {
|
||||||
|
@ -818,6 +821,7 @@ Thread curl_multi_loop_thread;
|
||||||
while ((msg = curl_multi_info_read(curl_multi_handle, &msgsLeft))) {
|
while ((msg = curl_multi_info_read(curl_multi_handle, &msgsLeft))) {
|
||||||
if (msg->msg == CURLMSG_DONE) {
|
if (msg->msg == CURLMSG_DONE) {
|
||||||
curl_handles_done[msg->easy_handle] = msg->data.result;
|
curl_handles_done[msg->easy_handle] = msg->data.result;
|
||||||
|
on_done.notify_all(); // wake up all threads, since we don't know what thread needs this req
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!openHandles) {
|
if (!openHandles) {
|
||||||
|
@ -874,13 +878,15 @@ json_t* Client::doRequestCurl(const char* method, const std::string& url, json_t
|
||||||
curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout);
|
curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout);
|
||||||
|
|
||||||
curl_multi_add_handle(curl_multi_handle, curl);
|
curl_multi_add_handle(curl_multi_handle, curl);
|
||||||
|
CURLcode res;
|
||||||
|
{
|
||||||
|
std::unique_lock lk(handles_done_m);
|
||||||
|
|
||||||
while (curl_handles_done.count(curl) == 0) {
|
on_done.wait(lk, [&curl]{return curl_handles_done.count(curl) != 0;});
|
||||||
svcSleepThread((u64)1000000ULL * 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
CURLcode res = curl_handles_done[curl];
|
res = curl_handles_done[curl];
|
||||||
curl_handles_done.erase(curl);
|
curl_handles_done.erase(curl);
|
||||||
|
}
|
||||||
curl_multi_remove_handle(curl_multi_handle, curl);
|
curl_multi_remove_handle(curl_multi_handle, curl);
|
||||||
|
|
||||||
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||||
|
|
Loading…
Reference in a new issue