[Openais] [PATCH] change fork() override to pthread_atfork() callbacks.

Steven Dake sdake at redhat.com
Tue Mar 9 11:45:02 PST 2010


On Tue, 2010-03-09 at 07:07 +1100, Angus Salkeld wrote:
> On VM (one cpu) I was getting very high cpu usage by corosync.
> 
> This was because of the tsafe code I added. This patch changes
> the overriding of fork() to using pthread_atfork() callbacks
> instead. It seems that during the fork the mutex was been held
> so the child had a "taken" mutex.
> 
> -Angus
> 
One nitpicky spacing issue otherwise good for merge

> Signed-off-by: Angus Salkeld <asalkeld at redhat.com>
> ---
>  exec/tsafe.c |   44 ++++++++++++++++++++++++--------------------
>  1 files changed, 24 insertions(+), 20 deletions(-)
> 
> diff --git a/exec/tsafe.c b/exec/tsafe.c
> index aecfb15..e2b4f21 100644
> --- a/exec/tsafe.c
> +++ b/exec/tsafe.c
> @@ -80,6 +80,9 @@
>  static int tsafe_disabled = 1;
>  static int tsafe_inited = 0;
>  static char **coro_environ;
> +static void atfork_prepare (void);
> +static void atfork_parent (void);
> +static void atfork_child (void);
>  
>  #if defined(HAVE_PTHREAD_SPIN_LOCK)
>  static pthread_spinlock_t tsafe_enabled_mutex;
> @@ -105,11 +108,13 @@ void tsafe_init (char **envp)
>  #if defined(HAVE_PTHREAD_SPIN_LOCK)
>         pthread_spin_init (&tsafe_enabled_mutex, 0);
>  #endif
> +
> +       pthread_atfork (atfork_prepare, atfork_parent,atfork_child);
> +

missing a space after ,atfork_child

>         tsafe_disabled = 1;
>         tsafe_inited = 1;
>  }
>  
> -
>  static void tsafe_lock (void)
>  {
>  #if defined(HAVE_PTHREAD_SPIN_LOCK)
> @@ -118,6 +123,7 @@ static void tsafe_lock (void)
>         pthread_mutex_lock (&tsafe_enabled_mutex);
>  #endif
>  }
> +
>  static void tsafe_unlock (void)
>  {
>  #if defined(HAVE_PTHREAD_SPIN_LOCK)
> @@ -141,6 +147,23 @@ void tsafe_on (void)
>         tsafe_unlock ();
>  }
>  
> +static void atfork_prepare (void)
> +{
> +       tsafe_lock ();
> +}
> +
> +static void atfork_parent (void)
> +{
> +       tsafe_unlock ();
> +}
> +
> +static void atfork_child (void)
> +{
> +       if (tsafe_inited && !tsafe_disabled) {
> +               tsafe_disabled = 1;
> +       }
> +       tsafe_unlock ();
> +}
>  
>  static void* _get_real_func_(const char * func_name)
>  {
> @@ -182,25 +205,6 @@ int pthread_create(pthread_t *thread, const
> pthread_attr_t *attr,
>         return real_pthread_create (thread, attr, start_routine, arg);
>  }
>  
> -pid_t fork(void)
> -{
> -       static pid_t (*real_fork)(void) = NULL;
> -       pid_t ret;
> -
> -       if (tsafe_inited && !tsafe_disabled) {
> -               tsafe_off ();
> -       }
> -
> -       if (real_fork == NULL) {
> -               real_fork = _get_real_func_ ("fork");
> -       }
> -       ret = real_fork ();
> -       if (ret == 0) {
> -               /* if we have forked corosync then anything goes. */
> -               tsafe_off ();
> -       }
> -       return ret;
> -}
>  #endif /* COROSYNC_LINUX */
>  
>  /*
> -- 
> 1.6.6.1
> 



More information about the Openais mailing list