Lon

Good work!  Thanks for the original patch.

I merged Fabio's rev of the patch.

I had originally thought forked processes inherited a copy of the forked
threads, but this is not the case.

Regards
-steve

On Thu, 2008-04-17 at 08:34 +0200, Fabio M. Di Nitto wrote:
> Hi Lon
> 
> On Wed, 16 Apr 2008, Lon Hohberger wrote:
> 
> > Hi Fabio,
> >
> > I'd call this a 'pass 1' patch.
> 
> 'pass 2' here :)
> 
> >
> > * This makes your test program work.
> > * This does not cause a regression with the existing logsys test cases
> > in the openais trunk.
> 
> confirmed. I was able to run ccsd without any problem.
> 
> > It, however, dirties up the build system because it requires changing
> > the linking order (logsys now needs -lpthread after it.  For some
> > reason, it didn't before (despite using other pthread APIs); someone
> > probably knows why - as well as the correct way to fix it within the
> > context of the openais build system.
> 
> I have been looking into this because my original patch was very close to 
> your but i don't have the definite answer other than linking with external 
> libraries should happen at the end in order to resolve all symbols.
> 
> So for example:
> $(CC) $(LDFLAGS) $(EXEC_OBJS) $(EXEC_LIBS) -o aisexec
> needs to turn into:
> $(CC) $(EXEC_OBJS) $(EXEC_LIBS) -o aisexec $(LDFLAGS)
> 
> what still puzzles me is that we need to link all applications that uses 
> liblogsys to pthread and this was not necessary before but i am sure i am 
> overlooking at something. _maybe_ the fact that pthread_atfork interacts 
> directly with the application fork() invokation needs this explicit 
> linking.
> 
> > It would be *potentially* cleaner to make the child "cleanup" function
> > an explicitly-called function, but probably less nice from a user API
> > perspective.  Basically, pthread_atfork() makes it a pretty simple thing
> > since the user doesn't need to do anything in the child process (I think
> > pthread_atfork was primarily designed for use in threaded APIs, anyway).
> >
> > Minimally, we needed to zap the mutexes and the thread indicators (since
> > there's no threads in the child process... yet).
> >
> > Upon further investigation, I noticed a double-lock when doing
> > _log_printf around the config mutex (_log_printf does a lock and so does
> > log_printf_worker_fn, causing the child to hang on itself).  To remedy
> > this, I added a check for logsys_wthread_active (which will be 0 in the
> > child process unless a full reinitialization is done) - but I'm not sure
> > if this is the right thing to do or not.
> 
> It seems to work fine here. I guess in one way or another it is the right 
> thing to do.
> 
> Lon, thanks a lot for this patch.. Steven, can we please drive it into svn 
> at somepoing?
> 
> Thanks
> Fabio
> 
> 
> diff -urNad openais-0.82~/exec/Makefile openais-0.82/exec/Makefile
> --- openais-0.82~/exec/Makefile       2008-04-17 07:27:02.000000000 +0200
> +++ openais-0.82/exec/Makefile        2008-04-17 07:29:20.000000000 +0200
> @@ -175,7 +175,7 @@
>   endif
> 
>   aisexec: $(EXEC_OBJS) $(EXEC_LIBS)
> -     $(CC) $(LDFLAGS) $(EXEC_OBJS) $(EXEC_LIBS) -o aisexec
> +     $(CC) $(EXEC_OBJS) $(EXEC_LIBS) -o aisexec $(LDFLAGS)
> 
>   libtotem_pg.a: $(TOTEM_OBJS)
>       $(AR) -rc libtotem_pg.a $(TOTEM_OBJS)
> diff -urNad openais-0.82~/exec/logsys.c openais-0.82/exec/logsys.c
> --- openais-0.82~/exec/logsys.c       2008-04-17 07:27:02.000000000 +0200
> +++ openais-0.82/exec/logsys.c        2008-04-17 07:27:23.000000000 +0200
> @@ -255,7 +255,8 @@
>   {
>       struct log_data *log_data = (struct log_data *)work_item;
> 
> -     pthread_mutex_lock (&logsys_config_mutex);
> +     if (logsys_wthread_active)
> +             pthread_mutex_lock (&logsys_config_mutex);
>       /*
>        * Output the log data
>        */
> @@ -273,7 +274,8 @@
>                       &log_data->log_string[log_data->syslog_pos]);
>       }
>       free (log_data->log_string);
> -     pthread_mutex_unlock (&logsys_config_mutex);
> +     if (logsys_wthread_active)
> +             pthread_mutex_unlock (&logsys_config_mutex);
>   }
> 
>   static void _log_printf (
> @@ -467,6 +469,14 @@
>       pthread_mutex_unlock (&logsys_new_log_mutex);
>   }
> 
> +static void child_cleanup (void)
> +{
> +     memset(&log_thread_group, 0, sizeof(log_thread_group));
> +     logsys_wthread_active = 0;
> +     pthread_mutex_init(&logsys_config_mutex, NULL);
> +     pthread_mutex_init(&logsys_new_log_mutex, NULL);
> +}
> +
>   int _logsys_wthread_create (void)
>   {
>       worker_thread_group_init (
> @@ -481,6 +491,7 @@
>       logsys_flush();
> 
>       atexit (logsys_atexit);
> +     pthread_atfork(NULL, NULL, child_cleanup);
> 
>       if (logsys_mode & LOG_MODE_OUTPUT_SYSLOG_THREADED && logsys_name != 
> NULL) {
>               openlog (logsys_name, LOG_CONS|LOG_PID, logsys_facility);
> diff -urNad openais-0.82~/test/Makefile openais-0.82/test/Makefile
> --- openais-0.82~/test/Makefile       2008-04-17 07:27:02.000000000 +0200
> +++ openais-0.82/test/Makefile        2008-04-17 07:29:02.000000000 +0200
> @@ -161,13 +161,13 @@
>       $(CC) $(LDFLAGS) -o openais-cfgtool openais-cfgtool.o $(LIBS)
> 
>   logsys_s: logsys_s.o logsys_s1.o logsys_s2.o ../exec/liblogsys.a
> -     $(CC) $(LDFLAGS) -o logsys_s logsys_s.o logsys_s1.o logsys_s2.o 
> ../exec/liblogsys.a
> +     $(CC) -o logsys_s logsys_s.o logsys_s1.o logsys_s2.o 
> ../exec/liblogsys.a $(LDFLAGS)
> 
>   logsys_t1: logsys_t1.o ../exec/liblogsys.a
> -     $(CC) $(LDFLAGS) -o logsys_t1 logsys_t1.o ../exec/liblogsys.a
> +     $(CC) -o logsys_t1 logsys_t1.o ../exec/liblogsys.a $(LDFLAGS)
> 
>   logsys_t2: logsys_t2.o ../exec/liblogsys.a
> -     $(CC) $(LDFLAGS) -o logsys_t2 logsys_t2.o ../exec/liblogsys.a
> +     $(CC) -o logsys_t2 logsys_t2.o ../exec/liblogsys.a $(LDFLAGS)
> 
>   clean:
>       rm -f *.o $(LIBRARIES) $(BINARIES)
> 
> 
> --
> I'm going to make him an offer he can't refuse.
> _______________________________________________
> Openais mailing list
> Openais@lists.linux-foundation.org
> https://lists.linux-foundation.org/mailman/listinfo/openais

_______________________________________________
Openais mailing list
Openais@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to