PKG_CHECK_MODULES(LIBEXIF, libexif)
PKG_CHECK_MODULES(LIBDRM, libdrm)
PKG_CHECK_MODULES(LIBCURL, libcurl)
+PKG_CHECK_MODULES(LIBCRYPTO, libcrypto)
PKG_CHECK_MODULES(HARFBUZZ, harfbuzz)
PKG_CHECK_MODULES(FRIBIDI, fribidi)
PKG_CHECK_MODULES(EVAS, evas)
// EXTERNAL INCLUDES
#include <dali/integration-api/debug.h>
+#include <pthread.h>
#include <curl/curl.h>
+#include <openssl/crypto.h>
#include <cstring>
// INTERNAL INCLUDES
*/
static Dali::TizenPlatform::Network::CurlEnvironment gCurlEnvironment;
-
void ConfigureCurlOptions( CURL* curlHandle, const std::string& url )
{
curl_easy_setopt( curlHandle, CURLOPT_URL, url.c_str() );
namespace Network
{
+std::mutex* CurlEnvironment::mMutexs = NULL;
+
CurlEnvironment::CurlEnvironment()
{
// Must be called before we attempt any loads. e.g. by using curl_easy_init()
// and before we start any threads.
curl_global_init(CURL_GLOBAL_ALL);
+
+ // libcurl with openssl needs locking_function and thread id for threadsafe
+ // https://curl.haxx.se/libcurl/c/threadsafe.html
+ // https://www.openssl.org/docs/man1.0.2/crypto/threads.html#DESCRIPTION
+ // SetLockingFunction sets locking_function and get thread id by the guide.
+ SetLockingFunction();
}
CurlEnvironment::~CurlEnvironment()
{
+ UnsetLockingFunction();
+
curl_global_cleanup();
}
+// libcurl with openssl needs locking_function and thread id for threadsafe
+// https://curl.haxx.se/libcurl/c/threadsafe.html
+// https://www.openssl.org/docs/man1.0.2/crypto/threads.html#DESCRIPTION
+void CurlEnvironment::OnOpenSSLLocking( int mode, int n, const char* file, int line )
+{
+ if( mode & CRYPTO_LOCK )
+ {
+ mMutexs[n].lock();
+ }
+ else
+ {
+ mMutexs[n].unlock();
+ }
+}
+
+unsigned long CurlEnvironment::GetThreadId()
+{
+ // If dali uses c++ thread, we may replace pthread_self() to this_thread::get_id()
+ return static_cast< unsigned long >( pthread_self() );
+}
+
+void CurlEnvironment::SetLockingFunction()
+{
+ if( mMutexs != NULL )
+ {
+ return;
+ }
+
+ mMutexs = new std::mutex[ CRYPTO_num_locks() ];
+
+ CRYPTO_set_id_callback( &CurlEnvironment::GetThreadId );
+ CRYPTO_set_locking_callback( &CurlEnvironment::OnOpenSSLLocking );
+}
+
+void CurlEnvironment::UnsetLockingFunction()
+{
+ if( mMutexs == NULL )
+ {
+ return;
+ }
+
+ CRYPTO_set_id_callback( NULL );
+ CRYPTO_set_locking_callback( NULL );
+ delete [] mMutexs;
+ mMutexs = NULL;
+}
bool DownloadRemoteFileIntoMemory( const std::string& url,
Dali::Vector<uint8_t>& dataBuffer,
// EXTERNAL INCLUDES
#include <dali/public-api/common/dali-vector.h>
#include <string>
+#include <mutex> //c++11
#include <stdint.h> // uint8
namespace Dali
* Destructor calls curl_global_cleanup()
*/
~CurlEnvironment();
+
+ /**
+ * Locking function for libcurl with openssl
+ */
+ static void OnOpenSSLLocking( int mode, int n, const char* file, int line );
+
+ /**
+ * Gets thread id for libcurl with openssl
+ */
+ static unsigned long GetThreadId();
+
+private:
+
+ void SetLockingFunction();
+
+ void UnsetLockingFunction();
+
+ static std::mutex* mMutexs;
};