From 908e0805e70c87a898f536efa92ef2d76e41fd6d Mon Sep 17 00:00:00 2001 From: "joth@chromium.org" Date: Fri, 19 Nov 2010 17:58:00 +0000 Subject: Fix openssl build to work with AllowSingleton changes BUG=61585 TEST=net & base unit tests; start & quit browser Review URL: http://codereview.chromium.org/5102006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@66772 0039d316-1c4b-4281-b951-d872f2087c98 --- base/openssl_util.cc | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'base/openssl_util.cc') diff --git a/base/openssl_util.cc b/base/openssl_util.cc index 1cbc304..5cfc34a 100644 --- a/base/openssl_util.cc +++ b/base/openssl_util.cc @@ -22,6 +22,20 @@ unsigned long CurrentThreadId() { // Singleton for initializing and cleaning up the OpenSSL library. class OpenSSLInitSingleton { + public: + static OpenSSLInitSingleton* Get() { + // We allow the SSL environment to leak for multiple reasons: + // - it is used from a non-joinable worker thread that is not stopped on + // shutdown, hence may still be using OpenSSL library after the AtExit + // runner has completed. + // - There are other OpenSSL related singletons (e.g. the client socket + // context) who's cleanup depends on the global environment here, but + // we can't control the order the AtExit handlers will run in so + // allowing the global environment to leak at least ensures it is + // available for those other singletons to reliably cleanup. + return Singleton >::get(); + } private: friend struct DefaultSingletonTraits; OpenSSLInitSingleton() { @@ -43,8 +57,7 @@ class OpenSSLInitSingleton { } static void LockingCallback(int mode, int n, const char* file, int line) { - Singleton::get()->OnLockingCallback(mode, n, file, - line); + OpenSSLInitSingleton::Get()->OnLockingCallback(mode, n, file, line); } void OnLockingCallback(int mode, int n, const char* file, int line) { @@ -64,7 +77,7 @@ class OpenSSLInitSingleton { } // namespace void EnsureOpenSSLInit() { - (void)Singleton::get(); + (void)OpenSSLInitSingleton::Get(); } void ClearOpenSSLERRStack(const tracked_objects::Location& location) { -- cgit v1.1