[Top][All Lists]
[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)
{
- [gnutls-dev] living without global variables, Bryan Henderson, 2005/12/21
- Re: [gnutls-dev] living without global variables, Nikos Mavrogiannopoulos, 2005/12/21
- Re: [gnutls-dev] living without global variables, Bryan Henderson, 2005/12/22
- Message not available
- [gnutls-dev] Re: living without global variables, Bryan Henderson, 2005/12/24
- Message not available
- [gnutls-dev] Re: living without global variables, Simon Josefsson, 2005/12/25
- [gnutls-dev] Re: living without global variables, Bryan Henderson, 2005/12/25
- [gnutls-dev] Re: living without global variables, Nikos Mavrogiannopoulos, 2005/12/26
- [gnutls-dev] Re: living without global variables,
Simon Josefsson <=
- Re: [gnutls-dev] Re: living without global variables, Bryan Henderson, 2005/12/26
- Message not available
- [gnutls-dev] Re: living without global variables, Simon Josefsson, 2005/12/28
- Message not available
- [gnutls-dev] Re: living without global variables, Simon Josefsson, 2005/12/26
Re: [gnutls-dev] living without global variables, Nikos Mavrogiannopoulos, 2005/12/26