| Index: chrome/browser/sync/engine/net/openssl_init.cc
|
| ===================================================================
|
| --- chrome/browser/sync/engine/net/openssl_init.cc (revision 0)
|
| +++ chrome/browser/sync/engine/net/openssl_init.cc (revision 0)
|
| @@ -0,0 +1,129 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +//
|
| +// OpenSSL multi-threading initialization
|
| +
|
| +#include "chrome/browser/sync/engine/net/openssl_init.h"
|
| +
|
| +#include <openssl/crypto.h>
|
| +
|
| +#include "base/logging.h"
|
| +#include "chrome/browser/sync/util/compat-pthread.h"
|
| +#include "chrome/browser/sync/util/pthread_helpers.h"
|
| +
|
| +// OpenSSL requires multithreading callbacks to be initialized prior to using
|
| +// the library so that it can manage thread locking as necessary.
|
| +
|
| +// Dynamic lock type
|
| +//
|
| +// This needs to be a struct and in global scope because OpenSSL relies on some
|
| +// macro magic.
|
| +struct CRYPTO_dynlock_value {
|
| + PThreadMutex mutex;
|
| + void Lock() {
|
| + mutex.Lock();
|
| + }
|
| + void Unlock() {
|
| + mutex.Unlock();
|
| + }
|
| +};
|
| +
|
| +namespace {
|
| +
|
| +// This array stores all of the mutexes available to OpenSSL
|
| +PThreadMutex* mutex_buf = NULL;
|
| +
|
| +// OpenSSL mutex handling callback functions
|
| +
|
| +// OpenSSL Callback - Locks/unlocks the specified mutex held by OpenSSL.
|
| +void OpenSslMutexLockControl(int mode, int n, const char* file, int line) {
|
| + if (mode & CRYPTO_LOCK) {
|
| + mutex_buf[n].Lock();
|
| + } else {
|
| + mutex_buf[n].Unlock();
|
| + }
|
| +}
|
| +
|
| +// OpenSSL Callback - Returns the thread ID
|
| +unsigned long OpenSslGetThreadID(void) {
|
| + return GetCurrentThreadId();
|
| +}
|
| +
|
| +// Dynamic locking functions
|
| +
|
| +// Allocate a new lock
|
| +struct CRYPTO_dynlock_value* dyn_create_function(const char* file, int line) {
|
| + return new CRYPTO_dynlock_value;
|
| +}
|
| +
|
| +void dyn_lock_function(int mode, struct CRYPTO_dynlock_value* lock,
|
| + const char* file, int line) {
|
| + if (mode & CRYPTO_LOCK) {
|
| + lock->Lock();
|
| + } else {
|
| + lock->Unlock();
|
| + }
|
| +}
|
| +
|
| +void dyn_destroy_function(struct CRYPTO_dynlock_value* lock,
|
| + const char* file, int line) {
|
| + delete lock;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +// We want to log the version of the OpenSSL library being used, in particular
|
| +// for the case where it's dynamically linked. We want the version from the
|
| +// library, not from the header files. It seems the OpenSSL folks haven't
|
| +// bothered with an accessor for this, so we just pluck it out.
|
| +#ifdef OS_WINDOWS
|
| +// TODO(sync): Figure out how to get the SSL version string on Windows.
|
| +const char* SSL_version_str = "UNKNOWN";
|
| +#else
|
| +extern const char* SSL_version_str;
|
| +#endif
|
| +
|
| +namespace browser_sync {
|
| +
|
| +// Initializes the OpenSSL multithreading callbacks. This isn't thread-safe,
|
| +// but it is called early enough that it doesn't matter.
|
| +void InitOpenSslMultithreading() {
|
| + LOG(INFO) << "Using OpenSSL headers version " << OPENSSL_VERSION_TEXT
|
| + << ", lib version " << SSL_version_str;
|
| +
|
| + if (mutex_buf)
|
| + return;
|
| +
|
| + mutex_buf = new PThreadMutex[CRYPTO_num_locks()];
|
| + CHECK(NULL != mutex_buf);
|
| +
|
| + // OpenSSL has only one single global set of callbacks, so this
|
| + // initialization must be done only once, even though the OpenSSL lib may be
|
| + // used by multiple modules (jingle jabber connections and P2P tunnels).
|
| + CRYPTO_set_id_callback(OpenSslGetThreadID);
|
| + CRYPTO_set_locking_callback(OpenSslMutexLockControl);
|
| +
|
| + CRYPTO_set_dynlock_create_callback(dyn_create_function);
|
| + CRYPTO_set_dynlock_lock_callback(dyn_lock_function);
|
| + CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function);
|
| +}
|
| +
|
| +// Cleans up the OpenSSL multithreading callbacks.
|
| +void CleanupOpenSslMultithreading() {
|
| + if (!mutex_buf) {
|
| + return;
|
| + }
|
| +
|
| + CRYPTO_set_dynlock_create_callback(NULL);
|
| + CRYPTO_set_dynlock_lock_callback(NULL);
|
| + CRYPTO_set_dynlock_destroy_callback(NULL);
|
| +
|
| + CRYPTO_set_id_callback(NULL);
|
| + CRYPTO_set_locking_callback(NULL);
|
| +
|
| + delete [] mutex_buf;
|
| + mutex_buf = NULL;
|
| +}
|
| +
|
| +} // namespace browser_sync
|
|
|
| Property changes on: chrome\browser\sync\engine\net\openssl_init.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|