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

Reply via email to