[Openais] [PATCH] change fork() override to pthread_atfork() callbacks.
Angus Salkeld
asalkeld at redhat.com
Tue Mar 9 14:02:54 PST 2010
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 <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