gnutls-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnutls-dev] Re: living without global variables


From: Simon Josefsson
Subject: [gnutls-dev] Re: living without global variables
Date: Mon, 26 Dec 2005 18:59:09 +0100
User-agent: Gnus/5.110004 (No Gnus v0.4) Emacs/22.0.50 (gnu/linux)

Nikos Mavrogiannopoulos <address@hidden> writes:

> On Sunday 25 December 2005 15:13, Simon Josefsson wrote:
>
>> Perhaps GnuTLS should deallocate these variables in an `atexit' hook
>> instead.  Then it seem all of this problem would go away.  In GNU
>> libc, atexit hooks are even called if GnuTLS was dlopen+dlclose'd.
>> gnutls_global_deinit() would then only call gc_done().
>
> I don't see how this can be usefull. Adding a sentance in the 
> global_init() function that it is not thread safe I think should be
> sufficient. This is a one time call initialization function, so it is 
> perfectly ok to leave the thread stuff to the called application.

Agreed.  I have installed the patch below.

Thanks,
Simon

--- gnutls_global.c     23 Dec 2005 15:49:27 +0100      2.110
+++ gnutls_global.c     26 Dec 2005 18:58:22 +0100      
@@ -171,6 +171,21 @@
   * you must do it before calling this function. This is useful in cases you 
   * want to disable libgcrypt's internal lockings etc.
   *
+  * This function increment a global counter, so that
+  * gnutls_global_deinit() only releases resources when it has been
+  * called as many times as gnutls_global_init().  This is useful when
+  * GnuTLS is used by more than one library in an application.  This
+  * function can be called many times, but will only do something the
+  * first time.
+  *
+  * Note!  This function is not thread safe.  If two threads call this
+  * function simultaneously, they can cause a race between checking
+  * the global counter and incrementing it, causing both threads to
+  * execute the library initialization code.  That would lead to a
+  * memory leak.  To handle this, your application could invoke this
+  * function after aquiring a thread mutex.  To ignore the potential
+  * memory leak is also an option.
+  *
   **/
 int
 gnutls_global_init (void)
@@ -265,8 +280,10 @@
   * This function deinitializes the global data, that were initialized
   * using gnutls_global_init().
   *
+  * Note!  This function is not thread safe.  See the discussion for
+  * gnutls_global_init() for more information.
+  *
   **/
-
 void
 gnutls_global_deinit (void)
 {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]