On Tue, 2010-03-09 at 12:45 -0700, Steven Dake wrote: > 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 >
Committed as revision 2677. -A > > 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
