]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Set dynamic-locking callbacks in openssl. These can be more efficient when openssl...
authorNick Mathewson <nickm@torproject.org>
Fri, 13 Jun 2008 16:35:12 +0000 (16:35 +0000)
committerNick Mathewson <nickm@torproject.org>
Fri, 13 Jun 2008 16:35:12 +0000 (16:35 +0000)
svn:r15222

ChangeLog
src/common/crypto.c

index 9ef989891b933e0ca3f1848f255ec28b3be2575b..73b496c16c472bd0ead3a80bdbf2ad1bd3be1a28 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Changes in version 0.2.1.2-alpha - 2008-??-??
+  o Minor features:
+    - Allow OpenSSL to use dynamic locks if it wants.
+
 Changes in version 0.2.1.1-alpha - 2008-06-13
   o Major features:
     - More work on making our TLS handshake blend in: modify the list
index 18c5b81e0afb7b67b9500624563b0a33126864ba..eb1af30daa1bca9fa2c30868fbee70cb9b24727a 100644 (file)
@@ -2227,6 +2227,43 @@ _openssl_locking_cb(int mode, int n, const char *file, int line)
     tor_mutex_release(_openssl_mutexes[n]);
 }
 
+struct CRYPTO_dynlock_value {
+  tor_mutex_t *lock;
+};
+
+static struct CRYPTO_dynlock_value *
+_openssl_dynlock_create_cb(const char *file, int line)
+{
+  struct CRYPTO_dynlock_value *v;
+  (void)file;
+  (void)line;
+  v = tor_malloc(sizeof(struct CRYPTO_dynlock_value));
+  v->lock = tor_mutex_new();
+  return v;
+}
+
+static void
+_openssl_dynlock_lock_cb(int mode, struct CRYPTO_dynlock_value *v,
+                         const char *file, int line)
+{
+  (void)file;
+  (void)line;
+  if (mode & CRYPTO_LOCK)
+    tor_mutex_acquire(v->lock);
+  else
+    tor_mutex_release(v->lock);
+}
+
+static void
+_openssl_dynlock_destroy_cb(struct CRYPTO_dynlock_value *v,
+                            const char *file, int line)
+{
+  (void)file;
+  (void)line;
+  tor_mutex_free(v->lock);
+  tor_free(v);
+}
+
 /** Helper: Construct mutexes, and set callbacks to help OpenSSL handle being
  * multithreaded. */
 static int
@@ -2240,6 +2277,9 @@ setup_openssl_threading(void)
     _openssl_mutexes[i] = tor_mutex_new();
   CRYPTO_set_locking_callback(_openssl_locking_cb);
   CRYPTO_set_id_callback(tor_get_thread_id);
+  CRYPTO_set_dynlock_create_callback(_openssl_dynlock_create_cb);
+  CRYPTO_set_dynlock_lock_callback(_openssl_dynlock_lock_cb);
+  CRYPTO_set_dynlock_destroy_callback(_openssl_dynlock_destroy_cb);
   return 0;
 }
 #else