summaryrefslogtreecommitdiff
path: root/lib/atfork.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2015-06-26 09:08:20 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2015-06-26 09:08:20 +0200
commiteea3114a5315bc6ff1ba55a37342bedebc4e6dad (patch)
tree9f9bc7f5ac90b86f38dfe0ebc30560f9f3d34416 /lib/atfork.c
parent6f67fbf5c8466124c594daddcb6b035f19c16518 (diff)
downloadgnutls-eea3114a5315bc6ff1ba55a37342bedebc4e6dad.tar.gz
simplified fork detection
Diffstat (limited to 'lib/atfork.c')
-rw-r--r--lib/atfork.c46
1 files changed, 16 insertions, 30 deletions
diff --git a/lib/atfork.c b/lib/atfork.c
index dec8d2cb2c..793de391cf 100644
--- a/lib/atfork.c
+++ b/lib/atfork.c
@@ -31,44 +31,17 @@
#include <sys/types.h>
#include <atfork.h>
-#ifndef _WIN32
-
-# if defined(HAVE___REGISTER_ATFORK) || defined(HAVE_PTHREAD_ATFORK)
-# define HAVE_ATFORK
-# endif
+unsigned int gnutls_forkid = 0;
-/* The maximum number of users of the API */
-# define MAX_VALS 6
-
-static unsigned int * fvals[MAX_VALS];
-static unsigned int fvals_size = 0;
+#ifndef _WIN32
# ifdef HAVE_ATFORK
static void fork_handler(void)
{
- unsigned i;
- for (i=0;i<fvals_size;i++)
- *fvals[i] = 1;
+ gnutls_forkid++;
}
# endif
-static void set_val_on_fork(unsigned int *val, unsigned int def)
-{
- if (fvals_size >= MAX_VALS)
- abort(); /* internal error */
- *val = def;
- fvals[fvals_size++] = val;
-}
-
-void _gnutls_fork_set_val(unsigned int *val)
-{
-# ifdef HAVE_ATFORK
- set_val_on_fork(val, 0);
-# else
- set_val_on_fork(val, getpid());
-# endif
-}
-
# if defined(HAVE_PTHREAD_ATFORK)
# include <pthread.h>
@@ -93,9 +66,22 @@ int _gnutls_register_fork_handler(void)
# else
+unsigned int _gnutls_get_forkid(void)
+{
+ return getpid();
+}
+
+int _gnutls_detect_fork(unsigned int forkid)
+{
+ if (getpid() == forkid)
+ return 0;
+ return 1;
+}
+
/* we have to detect fork manually */
int _gnutls_register_fork_handler(void)
{
+ gnutls_forkid = getpid();
return 0;
}