* global.c (global_init): New. Use it instead of the setting
authorWerner Koch <wk@gnupg.org>
Tue, 17 Sep 2002 12:40:05 +0000 (12:40 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 17 Sep 2002 12:40:05 +0000 (12:40 +0000)
any_init_done.  Initialize the ATH system.
(gcry_check_version): Hook global_init in.  This is the suggested
way to initialize the library.
(_gcry_no_internal_locking): Removed.  We simply call a ath_deinit
and leave it to ATH to disbale the locking.

* ath.c, ath.h, ath-pth.c, ath-pthread.c: New. Taken from GPGME.
* mutex.h: Removed.
* Makefile.am (ath_components): New.

src/ChangeLog
src/Makefile.am
src/gcrypt.h
src/global.c
src/mutex.h [deleted file]
src/secmem.c

index b5684fc..f12d4cb 100644 (file)
@@ -1,3 +1,20 @@
+2002-09-17  Werner Koch  <wk@gnupg.org>
+
+       * global.c (global_init): New.  Use it instead of the setting
+       any_init_done.  Initialize the ATH system.
+       (gcry_check_version): Hook global_init in.  This is the suggested
+       way to initialize the library.
+       (_gcry_no_internal_locking): Removed.  We simply call a ath_deinit
+       and leave it to ATH to disbale the locking.
+
+       * ath.c, ath.h, ath-pth.c, ath-pthread.c: New. Taken from GPGME.
+       * mutex.h: Removed.
+       * Makefile.am (ath_components): New.
+
+2002-09-16  Werner Koch  <wk@gnupg.org>
+
+       * secmem.c (_gcry_secmem_dump_stats): Replaced fprintf by log_*.
+
 2002-08-23  Werner Koch  <wk@gnupg.org>
 
        * missing-string.c: Removed unneeded strlwr.
index 447da74..5e882d2 100644 (file)
@@ -28,12 +28,29 @@ bin_SCRIPTS = libgcrypt-config
 m4datadir = $(datadir)/aclocal
 m4data_DATA = libgcrypt.m4
 
-noinst_PROGRAMS = testapi
+noinst_PROGRAMS = testapi benchmark
 testapi_SOURCES = testapi.c
 testapi_LDADD = libgcrypt.la
 
+benchmark_SOURCES = benchmark.c
+benchmark_LDADD = libgcrypt.la
+
 include_HEADERS = gcrypt.h
 
+
+if HAVE_PTHREAD
+ath_components_pthread = ath-pthread.c
+else
+ath_components_pthread =
+endif
+if HAVE_PTH
+ath_components_pth = ath-pth.c
+else
+ath_components_pth =
+endif
+ath_components = ath.h ath.c ${ath_components_pthread} ${ath_components_pth}
+
+
 libgcrypt_la_LDFLAGS = -version-info \
       @LIBGCRYPT_LT_CURRENT@:@LIBGCRYPT_LT_REVISION@:@LIBGCRYPT_LT_AGE@ 
 # limiting the exported symbols is not good for debugging.
@@ -50,8 +67,8 @@ libgcrypt_la_SOURCES =         g10lib.h \
                         secmem.c \
                         secmem.h \
                         mpi.h \
-                        mutex.h \
-                        missing-string.c 
+                        missing-string.c \
+                        ${ath_components} 
 
 libgcrypt_la_DEPENDENCIES = libgcrypt.sym \
                            ../cipher/libcipher.la ../mpi/libmpi.la
index 5a7af1f..44cb37c 100644 (file)
@@ -37,7 +37,7 @@ extern "C" {
    autoconf (using the AM_PATH_GCRYPT macro) check that this header
    matches the installed library.  Note: Do not edit the next line as
    configure may fix the string here.  */
-#define GCRYPT_VERSION "1.1.9"
+#define GCRYPT_VERSION "1.1.9-cvs"
 
 /* Internal: We can't to use the convenience macros for the multi
    precision integer functions when building this library. */
index 35a6265..20e74a1 100644 (file)
@@ -30,7 +30,7 @@
 #include "cipher.h"
 #include "stdmem.h" /* our own memory allocator */
 #include "secmem.h" /* our own secmem allocator */
-
+#include "ath.h"
 
 /****************
  * flag bits: 0 : general cipher debug
@@ -46,9 +46,22 @@ static void *(*realloc_func)(void *p, size_t n) = NULL;
 static void (*free_func)(void*) = NULL;
 static int (*outofcore_handler)( void*, size_t, unsigned int ) = NULL;
 static void *outofcore_handler_value = NULL;
-static int no_internal_locking = 0;
 static int no_secure_memory = 0;
-static int any_init_done = 0;
+static int any_init_done;
+
+/* This is out handmade constructore.  It gets called by any function
+   likely to be called at startup.  The suggested way for an
+   application to make sure that this has been called is by using
+   gcry_check_version. */
+static void
+global_init (void)
+{
+  if (!any_init_done)
+    return;
+  any_init_done = 1;
+  ath_init ();
+}
+
 
 static const char*
 parse_version_number( const char *s, int *number )
@@ -97,6 +110,7 @@ gcry_check_version( const char *req_version )
     int rq_major, rq_minor, rq_micro;
     const char *my_plvl, *rq_plvl;
 
+    global_init ();
     if ( !req_version )
        return ver;
 
@@ -153,22 +167,22 @@ gcry_control( enum gcry_ctl_cmds cmd, ... )
        break;
 
       case GCRYCTL_DROP_PRIVS:
-        any_init_done = 1;
+        global_init ();
        _gcry_secmem_init( 0 );
        break;
 
       case GCRYCTL_DISABLE_SECMEM:
-        any_init_done = 1;
+        global_init ();
         no_secure_memory = 1;
         break;    
 
       case GCRYCTL_INIT_SECMEM:
-        any_init_done = 1;
+        global_init ();
        _gcry_secmem_init( va_arg( arg_ptr, unsigned int ) );
        break;
 
       case GCRYCTL_TERM_SECMEM:
-        any_init_done = 1;
+        global_init ();
        _gcry_secmem_term();
        break;
 
@@ -185,7 +199,7 @@ gcry_control( enum gcry_ctl_cmds cmd, ... )
        break;
 
       case GCRYCTL_USE_SECURE_RNDPOOL:
-        any_init_done = 1;
+        global_init ();
        _gcry_secure_random_alloc(); /* put random number into secure memory */
        break;
 
@@ -202,8 +216,11 @@ gcry_control( enum gcry_ctl_cmds cmd, ... )
        break;
 
       case GCRYCTL_DISABLE_INTERNAL_LOCKING:
-        any_init_done = 1;
-        no_internal_locking = 1;
+        global_init ();
+        /* We wase some bytes by doing it this way.  OTOH this
+           function is not anymore required becuase it is done
+           automagically. */
+        ath_deinit ();
         break;
 
       case GCRYCTL_ANY_INITIALIZATION_P:
@@ -221,8 +238,7 @@ gcry_control( enum gcry_ctl_cmds cmd, ... )
            way to be really sure that all initialization for
            thread-safety has been done. */
         if (!init_finished) {
-            any_init_done = 1;
-            /* fixme: we should initialize the various mutexs here */
+            global_init ();
             init_finished = 1;
         }
         break;
@@ -322,7 +338,7 @@ gcry_set_allocation_handler( void *(*new_alloc_func)(size_t n),
                             void *(*new_realloc_func)(void *p, size_t n),
                             void (*new_free_func)(void*) )
 {
-    any_init_done = 1;
+    global_init ();
 
     alloc_func       = new_alloc_func;
     alloc_secure_func = new_alloc_secure_func;
@@ -351,7 +367,7 @@ void
 gcry_set_outofcore_handler( int (*f)( void*, size_t, unsigned int ),
                                                        void *value )
 {
-    any_init_done = 1;
+    global_init ();
 
     outofcore_handler = f;
     outofcore_handler_value = value;
@@ -523,11 +539,6 @@ _gcry_get_debug_flag( unsigned int mask )
     return debug_flags & mask;
 }
 
-int 
-_gcry_no_internal_locking (void)
-{
-  return no_internal_locking;
-}
 
 \f
 /* It is often useful to get some feedback of long running operations.
diff --git a/src/mutex.h b/src/mutex.h
deleted file mode 100644 (file)
index b1b1c45..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-/* mutex.h -  Portable mutual exclusion, independent from any thread library.
- *      Copyright (C) 2002 g10 Code GmbH
- *     Copyright (C) 2002 Free Software Foundation, Inc.
- *
- * This file is part of Libgcrypt.
- *
- * Libgcrypt 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.
- *
- * Libgcrypt 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 program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef MUTEX_H
-#define MUTEX_H
-
-/* Define MUTEX_FAKE before including the file to get stubs that don't
-   provide any locking at all.  Define MUTEX_PTHREAD if you can link
-   against the posix thread library.  */
-
-#if defined(MUTEX_FAKE)
-
-typedef char mutex_t;
-#define mutex_init(x) (0)
-#define mutex_destroy(x)
-#define mutex_lock(x) (0)
-#define mutex_unlock(x) (0)
-#define DEFINE_LOCAL_MUTEX(a) /* not needed */
-
-#elif defined(MUTEX_PTHREAD)
-
-#include <pthread.h>
-
-#define mutex_t pthread_mutex_t
-#define mutex_init(x) pthread_mutex_init (&(x), 0)
-#define mutex_destroy(x) pthread_mutex_destroy(&(x))
-#define mutex_lock(x) pthread_mutex_lock (&(x))
-#define mutex_unlock(x) pthread_mutex_unlock (&(x))
-#define DEFINE_LOCAL_MUTEX(a) static mutex_t a;
-
-#else
-
-int _gcry_no_internal_locking (void);
-
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-/* The type of a mutex.  */
-typedef int mutex_t[2];
-#define DEFINE_LOCAL_MUTEX(a) static mutex_t a = { -1, -1 };
-
-inline static int
-set_close_on_exec (int fd)
-{
-  int flags = fcntl (fd, F_GETFD, 0);
-  if (flags == -1)
-    return errno;
-  flags |= FD_CLOEXEC;
-  if (fcntl (fd, F_SETFD, flags) == -1)
-    return errno;
-  return 0;
-}
-
-/* Initialize the mutex variable MUTEX.  */
-inline int
-_gcry_mutex_init (mutex_t mutex)
-{
-  ssize_t amount;
-  int err = 0;
-
-  if  (_gcry_no_internal_locking())
-    return 0;
-  if (pipe (mutex))
-    return errno;
-
-  err = set_close_on_exec (mutex[0]);
-  if (!err)
-    err = set_close_on_exec (mutex[1]);
-  if (!err)
-    while ((amount = write (mutex[1], " ", 1)) < 0 && errno == EINTR)
-      ;
-  if (!err && amount != 1)
-    err = errno;
-
-  if (err)
-    {
-      close (mutex[0]);
-      close (mutex[1]);
-    }
-  return err;
-}
-
-/* Destroy the mutex variable MUTEX.  */
-inline void
-_gcry_mutex_destroy (mutex_t mutex)
-{
-  if  (_gcry_no_internal_locking ())
-    return;
-  close (mutex[0]);
-  close (mutex[1]);
-}
-
-/* Take the mutex variable MUTEX.  */
-inline int
-_gcry_mutex_lock (mutex_t mutex)
-{
-  char data;
-  int amount;
-  if  (_gcry_no_internal_locking ())
-    return 0;
-
-  while ((amount = read (mutex[0], &data, 1)) < 0 && errno == EINTR)
-    ;
-  return (amount != 1) ? errno : 0;
-}
-
-/* Release the mutex variable MUTEX.  */
-inline int
-_gcry_mutex_unlock (mutex_t mutex)
-{
-  int amount;
-  if  (_gcry_no_internal_locking ())
-    return 0;
-  while ((amount = write (mutex[1], " ", 1)) < 0 && errno == EINTR)
-    ;
-  return (amount != 1) ? errno : 0;
-}
-
-#define mutex_init(x)    _gcry_mutex_init (x)
-#define mutex_destroy(x) _gcry_mutex_destroy(x)
-#define mutex_lock(x)    _gcry_mutex_lock (x)
-#define mutex_unlock(x)  _gcry_mutex_unlock (x)
-
-
-#endif /* MUTEX_FAKE */
-#endif /* MUTEX_H */
index 261af48..5c3ad70 100644 (file)
@@ -424,8 +424,7 @@ _gcry_secmem_dump_stats()
 {
     if( disable_secmem )
        return;
-    fprintf(stderr,
-               "secmem usage: %u/%u bytes in %u/%u blocks of pool %lu/%lu\n",
+    log_info ("secmem usage: %u/%u bytes in %u/%u blocks of pool %lu/%lu\n",
                cur_alloced, max_alloced, cur_blocks, max_blocks,
                (ulong)poollen, (ulong)poolsize );
 }