From 6850a909557b488c624a50324d1b806d8d013380 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Thu, 19 Jun 2014 08:23:17 -0700 Subject: More work on integrating cURL in Balau. --- src/CurlTask.cc | 4 ++++ src/TaskMan.cc | 35 ++++++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/CurlTask.cc b/src/CurlTask.cc index 3dce322..5ff8b97 100644 --- a/src/CurlTask.cc +++ b/src/CurlTask.cc @@ -25,3 +25,7 @@ int Balau::CurlTask::debugFunctionStatic(CURL * easy, curl_infotype info, char * IAssert(easy == curlTask->m_curlHandle, "Got a debug callback for a handle that isn't our own."); return curlTask->debugFunction(info, str, str_len); } + +void Balau::CurlTask::curlDone(CURLcode result) { + +} diff --git a/src/TaskMan.cc b/src/TaskMan.cc index 5f028ae..00ce0f2 100644 --- a/src/TaskMan.cc +++ b/src/TaskMan.cc @@ -14,7 +14,7 @@ #include static Balau::AsyncManager s_async; -static CURLSH * s_curlshared = NULL; +static CURLSH * s_curlShared = NULL; namespace { @@ -73,16 +73,17 @@ class CurlSharedManager : public Balau::AtStart, Balau::AtExit { void doStart() { curl_global_init(CURL_GLOBAL_ALL); static SharedLocks locks; - s_curlshared = curl_share_init(); - curl_share_setopt(s_curlshared, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE); - curl_share_setopt(s_curlshared, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); - curl_share_setopt(s_curlshared, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); - curl_share_setopt(s_curlshared, CURLSHOPT_USERDATA, &locks); - curl_share_setopt(s_curlshared, CURLSHOPT_LOCKFUNC, lock_function); - curl_share_setopt(s_curlshared, CURLSHOPT_UNLOCKFUNC, lock_function); + s_curlShared = curl_share_init(); + curl_share_setopt(s_curlShared, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE); + curl_share_setopt(s_curlShared, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); + curl_share_setopt(s_curlShared, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); + curl_share_setopt(s_curlShared, CURLSHOPT_USERDATA, &locks); + curl_share_setopt(s_curlShared, CURLSHOPT_LOCKFUNC, lock_function); + curl_share_setopt(s_curlShared, CURLSHOPT_UNLOCKFUNC, lock_function); } void doExit() { - curl_share_cleanup(s_curlshared); + curl_share_cleanup(s_curlShared); + curl_global_cleanup(); } }; @@ -478,6 +479,8 @@ int Balau::TaskMan::mainLoop() { CurlTask * curlTask = dynamic_cast(t); if (curlTask) { curlGotHandle = true; + curl_easy_setopt(curlTask->m_curlHandle, CURLOPT_SHARE, s_curlShared); + curl_easy_setopt(curlTask->m_curlHandle, CURLOPT_PRIVATE, curlTask); curl_multi_add_handle(m_curlMulti, curlTask->m_curlHandle); } } @@ -485,6 +488,20 @@ int Balau::TaskMan::mainLoop() { if (curlGotHandle || curlNeedsSpin) curl_multi_socket_all(m_curlMulti, &m_curlStillRunning); + CURLMsg * curlMsg = NULL; + int curlMsgInQueue; + + while ((curlMsg = curl_multi_info_read(m_curlMulti, &curlMsgInQueue))) { + if (curlMsg->msg != CURLMSG_DONE) + continue; + Task * maybeCurlTask = NULL; + curl_easy_getinfo(curlMsg->easy_handle, CURLINFO_PRIVATE, &maybeCurlTask); + IAssert(maybeCurlTask, "curl easy handle didn't have any private data..."); + CurlTask * curlTask = dynamic_cast(maybeCurlTask); + IAssert(curlTask, "curl easy handle had corrupted private data..."); + curlTask->curlDone(curlMsg->data.result); + } + // Finally, let's destroy tasks that no longer are necessary. bool didDelete; do { -- cgit v1.2.3