/* * Copyright (C) 2016+ AzerothCore * Copyright (C) 2008-2016 TrinityCore * Copyright (C) 2005-2009 MaNGOS */ #include #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1010000fL #include #include #include std::vector cryptoLocks; static void lockingCallback(int mode, int type, char const* /*file*/, int /*line*/) { if (mode & CRYPTO_LOCK) { cryptoLocks[type]->lock(); } else { cryptoLocks[type]->unlock(); } } static void threadIdCallback(CRYPTO_THREADID* id) { (void)id; CRYPTO_THREADID_set_numeric(id, std::hash()(std::this_thread::get_id())); } void OpenSSLCrypto::threadsSetup() { cryptoLocks.resize(CRYPTO_num_locks()); for (int i = 0 ; i < CRYPTO_num_locks(); ++i) { cryptoLocks[i] = new std::mutex(); } (void)&threadIdCallback; CRYPTO_THREADID_set_callback(threadIdCallback); (void)&lockingCallback; CRYPTO_set_locking_callback(lockingCallback); } void OpenSSLCrypto::threadsCleanup() { CRYPTO_set_locking_callback(nullptr); CRYPTO_THREADID_set_callback(nullptr); for (int i = 0 ; i < CRYPTO_num_locks(); ++i) { delete cryptoLocks[i]; } cryptoLocks.resize(0); } #endif