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 <[email protected]> > --- > 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 > _______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
