From 94fe2125da8619a76c5d38829543cb5818b73731 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Wed, 18 Jun 2014 08:30:53 -0700 Subject: Starting to integrate cURL into Balau. --- includes/TaskMan.h | 5 ++++ src/TaskMan.cc | 59 +++++++++++++++++++++++++++++++++++++ win32/project/Balau.vcxproj | 16 +++++----- win32/project/libcurl.vcxproj | 68 +++++++++++++++++++++---------------------- 4 files changed, 106 insertions(+), 42 deletions(-) diff --git a/includes/TaskMan.h b/includes/TaskMan.h index eae78b9..a9eb490 100644 --- a/includes/TaskMan.h +++ b/includes/TaskMan.h @@ -1,6 +1,7 @@ #pragma once #include +#include #ifndef _WIN32 #include #endif @@ -102,6 +103,10 @@ class TaskMan { int m_stopCode = 0; bool m_stopped = false; bool m_allowedToSignal = false; + CURLM * m_curlMulti = false; + int m_curlStillRunning = 0; + static int curlSocketCallback(CURL * easy, curl_socket_t s, int what, void * userp, void * socketp); + static int curlMultiTimerCallback(CURLM * multi, long timeout_ms, void * userp); TaskMan(const TaskMan &) = delete; TaskMan & operator=(const TaskMan &) = delete; diff --git a/src/TaskMan.cc b/src/TaskMan.cc index 8e4e941..c50e57a 100644 --- a/src/TaskMan.cc +++ b/src/TaskMan.cc @@ -9,7 +9,10 @@ #include #endif +#include + static Balau::AsyncManager s_async; +static CURLSH * s_curlshared = NULL; namespace { @@ -33,9 +36,49 @@ class Stopper : public Balau::Task { int m_code; }; +class CurlSharedManager : public Balau::AtStart, Balau::AtExit { + public: + CurlSharedManager() : AtStart(0), AtExit(0) { } + struct SharedLocks { + Balau::RWLock cookie, dns, ssl_session; + }; + static void lock_function(CURL *handle, curl_lock_data data, curl_lock_access access, void * userptr) { + SharedLocks * locks = (SharedLocks *) userptr; + Balau::RWLock * lock = NULL; + switch (data) { + case CURL_LOCK_DATA_COOKIE: lock = &locks->cookie; break; + case CURL_LOCK_DATA_DNS: lock = &locks->dns; break; + case CURL_LOCK_DATA_SSL_SESSION: lock = &locks->ssl_session; break; + default: Failure("Unknown lock"); + } + switch (access) { + case CURL_LOCK_ACCESS_SHARED: lock->enterR(); break; + case CURL_LOCK_ACCESS_SINGLE: lock->enterW(); break; + default: Failure("Unknown access"); + } + } + static void unlock_function(CURL *handle, curl_lock_data data, void * userptr) { + SharedLocks * locks = (SharedLocks *) userptr; + } + void doStart() { + 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); + } + void doExit() { + curl_share_cleanup(s_curlshared); + } +}; + }; static AsyncStarter s_asyncStarter; +static CurlSharedManager s_curlSharedmManager; void Stopper::Do() { getTaskMan()->stopMe(m_code); @@ -178,6 +221,8 @@ Balau::TaskMan::TaskMan() { s_scheduler.registerTaskMan(this); m_nStacks = 0; + + m_curlMulti = curl_multi_init(); } #ifdef _WIN32 @@ -210,6 +255,20 @@ Balau::TaskMan::~TaskMan() { // probably way more work to do here in order to clean up tasks from that thread m_evt.stop(); ev_loop_destroy(m_loop); + curl_multi_cleanup(m_curlMulti); + curl_multi_setopt(m_curlMulti, CURLMOPT_SOCKETFUNCTION, reinterpret_cast(curlSocketCallback)); + curl_multi_setopt(m_curlMulti, CURLMOPT_SOCKETDATA, this); + curl_multi_setopt(m_curlMulti, CURLMOPT_TIMERFUNCTION, reinterpret_cast (curlMultiTimerCallback)); + curl_multi_setopt(m_curlMulti, CURLMOPT_TIMERDATA, this); + curl_multi_setopt(m_curlMulti, CURLMOPT_PIPELINING, 1L); +} + +int Balau::TaskMan::curlSocketCallback(CURL * easy, curl_socket_t s, int what, void * userp, void * socketp) { + return 0; +} + +int Balau::TaskMan::curlMultiTimerCallback(CURLM * multi, long timeout_ms, void * userp) { + return 0; } void * Balau::TaskMan::getStack() { diff --git a/win32/project/Balau.vcxproj b/win32/project/Balau.vcxproj index d23c043..131042e 100644 --- a/win32/project/Balau.vcxproj +++ b/win32/project/Balau.vcxproj @@ -86,8 +86,8 @@ Level3 Disabled true - PTW32_STATIC_LIB;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;PTW32_STATIC_LIB;DEBUG;_DEBUG;DEBUGBUILD;%(PreprocessorDefinitions) - ..\..\includes;..\..\includes\msc;..\..\libev;..\..\win32;..\..\win32\pthreads-win32;..\..\win32\iconv;..\..\win32\zlib;..\..\win32\regex;..\..\win32\c-ares;..\..\LuaJIT\src;..\..\src\jsoncpp\include;..\..\libtommath;..\..\libtomcrypt\src\headers + PTW32_STATIC_LIB;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;CURL_STATICLIB;DEBUG;_DEBUG;DEBUGBUILD;%(PreprocessorDefinitions) + ..\..\includes;..\..\includes\msc;..\..\libev;..\..\win32;..\..\win32\pthreads-win32;..\..\win32\iconv;..\..\win32\zlib;..\..\win32\regex;..\..\win32\c-ares;..\..\LuaJIT\src;..\..\src\jsoncpp\include;..\..\libtommath;..\..\libtomcrypt\src\headers;..\..\win32\curl\include 4290;4800 $(SolutionDir)\Balau\msvc-config.h ProgramDatabase @@ -101,8 +101,8 @@ Level3 Disabled true - PTW32_STATIC_LIB;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;PTW32_STATIC_LIB;DEBUG;_DEBUG;DEBUGBUILD;%(PreprocessorDefinitions) - ..\..\includes;..\..\includes\msc;..\..\libev;..\..\win32;..\..\win32\pthreads-win32;..\..\win32\iconv;..\..\win32\zlib;..\..\win32\regex;..\..\win32\c-ares;..\..\LuaJIT\src;..\..\src\jsoncpp\include;..\..\libtommath;..\..\libtomcrypt\src\headers + PTW32_STATIC_LIB;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;CURL_STATICLIB;DEBUG;_DEBUG;DEBUGBUILD;%(PreprocessorDefinitions) + ..\..\includes;..\..\includes\msc;..\..\libev;..\..\win32;..\..\win32\pthreads-win32;..\..\win32\iconv;..\..\win32\zlib;..\..\win32\regex;..\..\win32\c-ares;..\..\LuaJIT\src;..\..\src\jsoncpp\include;..\..\libtommath;..\..\libtomcrypt\src\headers;..\..\win32\curl\include 4290;4800 $(SolutionDir)\Balau\msvc-config.h @@ -117,8 +117,8 @@ true true true - PTW32_STATIC_LIB;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;PTW32_STATIC_LIB;NDEBUG;%(PreprocessorDefinitions) - ..\..\includes;..\..\includes\msc;..\..\libev;..\..\win32;..\..\win32\pthreads-win32;..\..\win32\iconv;..\..\win32\zlib;..\..\win32\regex;..\..\win32\c-ares;..\..\LuaJIT\src;..\..\src\jsoncpp\include;..\..\libtommath;..\..\libtomcrypt\src\headers + PTW32_STATIC_LIB;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;CURL_STATICLIB;NDEBUG;%(PreprocessorDefinitions) + ..\..\includes;..\..\includes\msc;..\..\libev;..\..\win32;..\..\win32\pthreads-win32;..\..\win32\iconv;..\..\win32\zlib;..\..\win32\regex;..\..\win32\c-ares;..\..\LuaJIT\src;..\..\src\jsoncpp\include;..\..\libtommath;..\..\libtomcrypt\src\headers;..\..\win32\curl\include 4290;4800 $(SolutionDir)\Balau\msvc-config.h @@ -135,8 +135,8 @@ true true true - PTW32_STATIC_LIB;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;PTW32_STATIC_LIB;NDEBUG;%(PreprocessorDefinitions) - ..\..\includes;..\..\includes\msc;..\..\libev;..\..\win32;..\..\win32\pthreads-win32;..\..\win32\iconv;..\..\win32\zlib;..\..\win32\regex;..\..\win32\c-ares;..\..\LuaJIT\src;..\..\src\jsoncpp\include;..\..\libtommath;..\..\libtomcrypt\src\headers + PTW32_STATIC_LIB;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;CURL_STATICLIB;NDEBUG;%(PreprocessorDefinitions) + ..\..\includes;..\..\includes\msc;..\..\libev;..\..\win32;..\..\win32\pthreads-win32;..\..\win32\iconv;..\..\win32\zlib;..\..\win32\regex;..\..\win32\c-ares;..\..\LuaJIT\src;..\..\src\jsoncpp\include;..\..\libtommath;..\..\libtomcrypt\src\headers;..\..\win32\curl\include 4290;4800 $(SolutionDir)\Balau\msvc-config.h diff --git a/win32/project/libcurl.vcxproj b/win32/project/libcurl.vcxproj index b555954..563bc4c 100644 --- a/win32/project/libcurl.vcxproj +++ b/win32/project/libcurl.vcxproj @@ -1,20 +1,20 @@  - - LIB Debug - DLL Windows SSPI + + Debug Win32 - - LIB Debug - DLL Windows SSPI + + Debug x64 - - LIB Release - DLL Windows SSPI + + Release Win32 - - LIB Release - DLL Windows SSPI + + Release x64 @@ -23,25 +23,25 @@ libcurl - + StaticLibrary false MultiByte v120 - + StaticLibrary false MultiByte v120 - + StaticLibrary false MultiByte v120 - + StaticLibrary false MultiByte @@ -50,37 +50,37 @@ - + - + - + - + <_ProjectFileVersion>10.0.30319.1 - ..\..\..\..\build\Win32\VC12\$(Configuration)\ - $(OutDir)lib\ - ..\..\..\..\build\Win64\VC12\$(Configuration)\ - $(OutDir)lib\ - ..\..\..\..\build\Win32\VC12\$(Configuration)\ - $(OutDir)lib\ - ..\..\..\..\build\Win64\VC12\$(Configuration)\ - $(OutDir)lib\ - $(ProjectName)d - $(ProjectName)d + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + $(ProjectName)d + $(ProjectName)d - + Disabled .;..\curl\include;..\curl\lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;CURL_DISABLE_LDAP;WIN32;_DEBUG;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -102,14 +102,14 @@ $(OutDir)$(ProjectName).bsc - + X64 Disabled .;..\curl\include;..\curl\lib;%(AdditionalIncludeDirectories) - WIN64;_DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;CURL_DISABLE_LDAP;WIN64;_DEBUG;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -131,12 +131,12 @@ $(OutDir)$(ProjectName).bsc - + MaxSpeed OnlyExplicitInline .;..\curl\include;..\curl\lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;CURL_DISABLE_LDAP;WIN32;NDEBUG;%(PreprocessorDefinitions) true MultiThreadedDLL true @@ -157,7 +157,7 @@ $(OutDir)$(ProjectName).bsc - + X64 @@ -165,7 +165,7 @@ MaxSpeed OnlyExplicitInline .;..\curl\include;..\curl\lib;%(AdditionalIncludeDirectories) - WIN64;NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;CURL_DISABLE_LDAP;WIN64;NDEBUG;%(PreprocessorDefinitions) true MultiThreadedDLL true -- cgit v1.2.3