]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Moved locking code to special file.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Tue, 29 Jun 2010 15:42:47 +0000 (17:42 +0200)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Tue, 29 Jun 2010 16:16:35 +0000 (18:16 +0200)
lib/Makefile.am
lib/gnutls_global.c
lib/gnutls_global.h
lib/locks.c [new file with mode: 0644]
lib/locks.h [new file with mode: 0644]

index 8eb2d2d4596840f28d7c09370c48a2080f43262a..7034b53904d31a60d13f449407aea5e8083dd80c 100644 (file)
@@ -80,7 +80,7 @@ COBJECTS = gnutls_record.c gnutls_compress.c debug.c gnutls_cipher.c  \
        auth_dh_common.c gnutls_helper.c gnutls_supplemental.c          \
        crypto.c random.c  ext_signature.c cryptodev.c \
        crypto-api.c ext_safe_renegotiation.c gnutls_privkey.c \
-       pkcs11.c pkcs11_privkey.c gnutls_pubkey.c pkcs11_write.c
+       pkcs11.c pkcs11_privkey.c gnutls_pubkey.c pkcs11_write.c locks.c
 
 
 if ENABLE_NETTLE
@@ -104,7 +104,7 @@ HFILES = debug.h gnutls_compress.h gnutls_cipher.h gnutls_buffers.h \
        gnutls_helper.h auth_psk.h auth_psk_passwd.h                    \
        gnutls_supplemental.h crypto.h random.h         \
        ext_session_ticket.h ext_signature.h gnutls_cryptodev.h         \
-       ext_safe_renegotiation.h
+       ext_safe_renegotiation.h locks.h
 
 if ENABLE_LOCAL_PAKCHOIS
 COBJECTS+=pakchois/pakchois.c pakchois/errors.c
index bdbdc642bdff1dfe651f6b6159d2f9474904b73c..1f5dc9ddb7260c82f986368366ac538d8e0fe150 100644 (file)
@@ -37,6 +37,7 @@
 
 #include <gnutls_extensions.h> /* for _gnutls_ext_init */
 #include <gnutls_cryptodev.h>
+#include <locks.h>
 
 #include "sockets.h"
 #include "gettext.h"
@@ -54,139 +55,6 @@ ASN1_TYPE _gnutls_gnutls_asn;
 gnutls_log_func _gnutls_log_func;
 int _gnutls_log_level = 0;     /* default log level */
 
-#ifdef _WIN32
-
-# include <windows.h>
-
-/* FIXME: win32 locks are untested */
-static int gnutls_system_mutex_init (void **priv)
-{
-  CRITICAL_SECTION *lock = malloc (sizeof (CRITICAL_SECTION));
-  int ret;
-
-  if (lock==NULL)
-    return GNUTLS_E_MEMORY_ERROR;
-
-  InitializeCriticalSection(lock);
-     
-  *priv = lock;
-  
-  return 0;
-}
-
-static void gnutls_system_mutex_deinit (void *priv)
-{
-  DeleteCriticalSection(priv);
-  free(priv);
-}
-
-static int gnutls_system_mutex_lock (void *priv)
-{
-  EnterCriticalSection(priv);
-  return 0;
-}
-
-static int gnutls_system_mutex_unlock (void *priv)
-{
-  LeaveCriticalSection(priv);
-  return 0;
-}
-
-#else
-
-# ifdef HAVE_LIBPTHREAD
-#  include <pthread.h>
-
-static int gnutls_system_mutex_init (void **priv)
-{
-  pthread_mutex_t *lock = malloc (sizeof (pthread_mutex_t));
-  int ret;
-
-  if (lock==NULL)
-    return GNUTLS_E_MEMORY_ERROR;
-
-   ret = pthread_mutex_init (lock, NULL);
-   if (ret)
-     {
-       free(lock);
-       gnutls_assert();
-       return GNUTLS_E_LOCKING_ERROR;
-     }
-     
-  *priv = lock;
-  
-  return 0;
-}
-
-static void gnutls_system_mutex_deinit (void *priv)
-{
-  pthread_mutex_destroy(priv);
-  free(priv);
-}
-
-static int gnutls_system_mutex_lock (void *priv)
-{
-  if (pthread_mutex_lock(priv))
-    {
-        gnutls_assert();
-        return GNUTLS_E_LOCKING_ERROR;
-    }
-
-  return 0;
-}
-
-static int gnutls_system_mutex_unlock (void *priv)
-{
-  if (pthread_mutex_unlock(priv))
-    {
-        gnutls_assert();
-        return GNUTLS_E_LOCKING_ERROR;
-    }
-
-  return 0;
-}
-
-# else
-
-#define gnutls_system_mutex_init NULL
-#define gnutls_system_mutex_deinit NULL
-#define gnutls_system_mutex_lock NULL
-#define gnutls_mutex_unlock NULL
-
-# endif /* PTHREAD */
-
-#endif
-
-mutex_init_func gnutls_mutex_init = gnutls_system_mutex_init;
-mutex_deinit_func gnutls_mutex_deinit = gnutls_system_mutex_deinit;
-mutex_lock_func gnutls_mutex_lock = gnutls_system_mutex_lock;
-mutex_unlock_func gnutls_mutex_unlock = gnutls_system_mutex_unlock;
-
-/**
- * gnutls_global_set_mutex:
- * @init: mutex initialization function
- * @deinit: mutex deinitialization function
- * @lock: mutex locking function
- * @unlock: mutex unlocking function
- *
- * With this function you are allowed to override the default mutex
- * locks used in some parts of gnutls and dependent libraries. This function
- * should be used if you have complete control of your program and libraries.
- * Do not call this function from a library. Instead only initialize gnutls and
- * the default OS mutex locks will be used.
- * 
- * This function must be called before gnutls_global_init().
- *
- **/
-void gnutls_global_set_mutex(mutex_init_func init, mutex_deinit_func deinit, 
-        mutex_lock_func lock, mutex_unlock_func unlock)
-{
-  gnutls_mutex_init = init;
-  gnutls_mutex_deinit = deinit;
-  gnutls_mutex_lock = lock;
-  gnutls_mutex_unlock = unlock;
-}
-
 /**
  * gnutls_global_set_log_function:
  * @log_func: it's a log function
@@ -274,35 +142,6 @@ gnutls_global_set_mem_functions (gnutls_alloc_function alloc_func,
 
 static int _gnutls_init = 0;
 
-#ifndef HAVE_LIBNETTLE
-static struct gcry_thread_cbs gct = {
-  .option = (GCRY_THREAD_OPTION_PTH | (GCRY_THREAD_OPTION_VERSION << 8)),
-  .init = NULL,
-  .select = NULL,
-  .waitpid = NULL,
-  .accept = NULL,
-  .connect = NULL,
-  .sendmsg = NULL,
-  .recvmsg = NULL,
-};
-
-static int wrap_gcry_mutex_lock(void** m)
-{
-  return gnutls_mutex_lock(*m);
-}
-
-static int wrap_gcry_mutex_unlock(void** m)
-{
-  return gnutls_mutex_unlock(*m);
-}
-
-static int wrap_gcry_mutex_deinit(void** m)
-{
-  gnutls_mutex_deinit(*m);
-  return 0;
-}
-
-#endif
 
 /**
  * gnutls_global_init:
@@ -313,10 +152,7 @@ static int wrap_gcry_mutex_deinit(void** m)
  * gnutls_global_deinit() when gnutls usage is no longer needed
  *
  * Note that this function will also initialize libgcrypt, if it has
- * not been initialized before.  Thus if you want to manually
- * initialize libgcrypt you must do it before calling this function.
- * This is useful in cases you want to disable libgcrypt's internal
- * lockings etc.
+ * not been initialized before.  
  *
  * This function increment a global counter, so that
  * gnutls_global_deinit() only releases resources when it has been
@@ -356,15 +192,7 @@ gnutls_global_init (void)
     {
       const char *p;
 
-      if (gnutls_mutex_init != NULL)
-        {
-          gct.mutex_init = gnutls_mutex_init;
-          gct.mutex_destroy = wrap_gcry_mutex_deinit;
-          gct.mutex_lock = wrap_gcry_mutex_lock;
-          gct.mutex_unlock = wrap_gcry_mutex_unlock;
-
-          gcry_control (GCRYCTL_SET_THREAD_CBS, &gct);
-        }
+      _gnutls_gcry_register_mutexes();
 
       p = gcry_check_version (GNUTLS_MIN_LIBGCRYPT_VERSION);
 
index e6bf08e408fa28bc6fcff2c451a9611f389bfc20..081c20d464a8d74df1fae0121af54fcb44559cec 100644 (file)
@@ -43,9 +43,4 @@ extern ASN1_TYPE _gnutls_gnutls_asn;
 extern gnutls_log_func _gnutls_log_func;
 extern int _gnutls_log_level;
 
-extern mutex_init_func gnutls_mutex_init;
-extern mutex_deinit_func gnutls_mutex_deinit;
-extern mutex_lock_func gnutls_mutex_lock;
-extern mutex_unlock_func gnutls_mutex_unlock;
-
 #endif
diff --git a/lib/locks.c b/lib/locks.c
new file mode 100644 (file)
index 0000000..3b8a66d
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2010
+ * Free Software Foundation, Inc.
+ *
+ * Author: Nikos Mavrogiannopoulos
+ *
+ * This file is part of GnuTLS.
+ *
+ * The GnuTLS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA
+ *
+ */
+
+#include <gnutls_int.h>
+#include <gnutls_errors.h>
+#include <libtasn1.h>
+#include <gnutls_dh.h>
+#include <random.h>
+#ifndef HAVE_LIBNETTLE
+#include <gcrypt.h>
+
+#endif
+
+#ifdef _WIN32
+
+# include <windows.h>
+
+/* FIXME: win32 locks are untested */
+static int gnutls_system_mutex_init (void **priv)
+{
+  CRITICAL_SECTION *lock = malloc (sizeof (CRITICAL_SECTION));
+  int ret;
+
+  if (lock==NULL)
+    return GNUTLS_E_MEMORY_ERROR;
+
+  InitializeCriticalSection(lock);
+     
+  *priv = lock;
+  
+  return 0;
+}
+
+static void gnutls_system_mutex_deinit (void *priv)
+{
+  DeleteCriticalSection(priv);
+  free(priv);
+}
+
+static int gnutls_system_mutex_lock (void *priv)
+{
+  EnterCriticalSection(priv);
+  return 0;
+}
+
+static int gnutls_system_mutex_unlock (void *priv)
+{
+  LeaveCriticalSection(priv);
+  return 0;
+}
+
+#else
+
+# ifdef HAVE_LIBPTHREAD
+#  include <pthread.h>
+
+static int gnutls_system_mutex_init (void **priv)
+{
+  pthread_mutex_t *lock = malloc (sizeof (pthread_mutex_t));
+  int ret;
+
+  if (lock==NULL)
+    return GNUTLS_E_MEMORY_ERROR;
+
+   ret = pthread_mutex_init (lock, NULL);
+   if (ret)
+     {
+       free(lock);
+       gnutls_assert();
+       return GNUTLS_E_LOCKING_ERROR;
+     }
+     
+  *priv = lock;
+  
+  return 0;
+}
+
+static void gnutls_system_mutex_deinit (void *priv)
+{
+  pthread_mutex_destroy(priv);
+  free(priv);
+}
+
+static int gnutls_system_mutex_lock (void *priv)
+{
+  if (pthread_mutex_lock(priv))
+    {
+        gnutls_assert();
+        return GNUTLS_E_LOCKING_ERROR;
+    }
+
+  return 0;
+}
+
+static int gnutls_system_mutex_unlock (void *priv)
+{
+  if (pthread_mutex_unlock(priv))
+    {
+        gnutls_assert();
+        return GNUTLS_E_LOCKING_ERROR;
+    }
+
+  return 0;
+}
+
+# else
+
+#define gnutls_system_mutex_init NULL
+#define gnutls_system_mutex_deinit NULL
+#define gnutls_system_mutex_lock NULL
+#define gnutls_mutex_unlock NULL
+
+# endif /* PTHREAD */
+
+#endif
+
+mutex_init_func gnutls_mutex_init = gnutls_system_mutex_init;
+mutex_deinit_func gnutls_mutex_deinit = gnutls_system_mutex_deinit;
+mutex_lock_func gnutls_mutex_lock = gnutls_system_mutex_lock;
+mutex_unlock_func gnutls_mutex_unlock = gnutls_system_mutex_unlock;
+
+/**
+ * gnutls_global_set_mutex:
+ * @init: mutex initialization function
+ * @deinit: mutex deinitialization function
+ * @lock: mutex locking function
+ * @unlock: mutex unlocking function
+ *
+ * With this function you are allowed to override the default mutex
+ * locks used in some parts of gnutls and dependent libraries. This function
+ * should be used if you have complete control of your program and libraries.
+ * Do not call this function from a library. Instead only initialize gnutls and
+ * the default OS mutex locks will be used.
+ * 
+ * This function must be called before gnutls_global_init().
+ *
+ **/
+void gnutls_global_set_mutex(mutex_init_func init, mutex_deinit_func deinit, 
+        mutex_lock_func lock, mutex_unlock_func unlock)
+{
+  gnutls_mutex_init = init;
+  gnutls_mutex_deinit = deinit;
+  gnutls_mutex_lock = lock;
+  gnutls_mutex_unlock = unlock;
+}
+
+#ifndef HAVE_LIBNETTLE
+static struct gcry_thread_cbs gct = {
+  .option = (GCRY_THREAD_OPTION_PTHREAD | (GCRY_THREAD_OPTION_VERSION << 8)),
+  .init = NULL,
+  .select = NULL,
+  .waitpid = NULL,
+  .accept = NULL,
+  .connect = NULL,
+  .sendmsg = NULL,
+  .recvmsg = NULL,
+};
+
+static int wrap_gcry_mutex_lock(void** m)
+{
+  return gnutls_mutex_lock(*m);
+}
+
+static int wrap_gcry_mutex_unlock(void** m)
+{
+  return gnutls_mutex_unlock(*m);
+}
+
+static int wrap_gcry_mutex_deinit(void** m)
+{
+  gnutls_mutex_deinit(*m);
+  return 0;
+}
+
+void _gnutls_gcry_register_mutexes(void)
+{
+       if (gnutls_mutex_init != NULL) {
+               gct.mutex_init = gnutls_mutex_init;
+               gct.mutex_destroy = wrap_gcry_mutex_deinit;
+               gct.mutex_lock = wrap_gcry_mutex_lock;
+               gct.mutex_unlock = wrap_gcry_mutex_unlock;
+
+               gcry_control (GCRYCTL_SET_THREAD_CBS, &gct);
+       }
+}
+
+#endif
diff --git a/lib/locks.h b/lib/locks.h
new file mode 100644 (file)
index 0000000..4f8c355
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef GNUTLS_LOCKS_H
+# define GNUTLS_LOCKS_H
+
+#include <gnutls/gnutls.h>
+#include <gnutls_int.h>
+
+extern mutex_init_func gnutls_mutex_init;
+extern mutex_deinit_func gnutls_mutex_deinit;
+extern mutex_lock_func gnutls_mutex_lock;
+extern mutex_unlock_func gnutls_mutex_unlock;
+
+# ifndef HAVE_LIBNETTLE
+void _gnutls_gcry_register_mutexes(void);
+# endif
+
+#endif