]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
build: rely on gnulib's pthread module
authorEric Blake <eblake@redhat.com>
Thu, 29 Apr 2010 02:39:11 +0000 (20:39 -0600)
committerEric Blake <eblake@redhat.com>
Thu, 6 May 2010 20:35:37 +0000 (14:35 -0600)
Gnulib can guarantee that pthread.h exists, but for now, it is a dummy
header with no support for most pthread_* functions.  Modify our
use of pthread to use function checks, rather than header checks,
to determine how much pthread support is present.

* bootstrap.conf (gnulib_modules): Add pthread.
* configure.ac: Drop all pthread.h checks.  Optimize function
checks.  Add check for pthread functions.
* src/Makefile.am (libvirt_lxc_LDADD): Ensure proper link.
* src/remote/remote_driver.c (remoteIOEventLoop): Depend on
pthread_sigmask, now that gnulib guarantees pthread.h.
* src/util/util.c (virFork): Likewise.
* src/util/threads.c (threads-pthread.c): Depend on
pthread_mutexattr_init, as a witness of full pthread support.
* src/util/threads.h (threads-pthread.h): Likewise.

bootstrap.conf
configure.ac
src/Makefile.am
src/remote/remote_driver.c
src/util/threads.c
src/util/threads.h
src/util/util.c

index 785489bbf9fdb9b9bc00d0d359c0bf2ff7eb4c88..da7cc9ce78721c18a112351dfa70e0584e3b9fc1 100644 (file)
@@ -43,6 +43,7 @@ perror
 physmem
 poll
 posix-shell
+pthread
 recv
 random_r
 send
index 5d68dcc38518eb2666c1f3c99c163c6f3fc3493e..93eb654e5cbed4c0af1ad1f1eea1f221b68477ba 100644 (file)
@@ -106,10 +106,19 @@ dnl Use --disable-largefile if you don't want this.
 AC_SYS_LARGEFILE
 
 dnl Availability of various common functions (non-fatal if missing).
-AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity getuid getgid posix_fallocate mmap])
+AC_CHECK_FUNCS_ONCE([cfmakeraw regexec uname sched_getaffinity getuid getgid \
+ posix_fallocate mmap])
 
 dnl Availability of various not common threadsafe functions
-AC_CHECK_FUNCS([strerror_r strtok_r getmntent_r getgrnam_r getpwuid_r])
+AC_CHECK_FUNCS_ONCE([strerror_r strtok_r getmntent_r getgrnam_r getpwuid_r])
+
+dnl Availability of pthread functions (if missing, win32 threading is
+dnl assumed).  Because of $LIB_PTHREAD, we cannot use AC_CHECK_FUNCS_ONCE.
+dnl LIB_PTHREAD was set during gl_INIT by gnulib.
+old_LIBS=$LIBS
+LIBS="$LIBS $LIB_PTHREAD"
+AC_CHECK_FUNCS([pthread_sigmask pthread_mutexattr_init])
+LIBS=$old_libs
 
 dnl Availability of various common headers (non-fatal if missing).
 AC_CHECK_HEADERS([pwd.h paths.h regex.h sys/syslimits.h sys/utsname.h \
@@ -137,14 +146,6 @@ AM_CONDITIONAL([HAVE_GLIBC_RPCGEN],
               [test "x$ac_cv_path_RPCGEN" != "xno" &&
                $ac_cv_path_RPCGEN -t </dev/null >/dev/null 2>&1])
 
-dnl pthread?
-AC_CHECK_HEADER([pthread.h],
-       [AC_CHECK_LIB([pthread],[pthread_join],[
-               AC_DEFINE([HAVE_LIBPTHREAD],[],[Define if pthread (-lpthread)])
-               AC_DEFINE([HAVE_PTHREAD_H],[],[Define if <pthread.h>])
-               LIBS="-lpthread $LIBS"
-       ])])
-
 dnl Miscellaneous external programs.
 AC_PATH_PROG([RM], [rm], [/bin/rm])
 AC_PATH_PROG([MV], [mv], [/bin/mv])
index 2531ac58ade0868dac1e1eb2ae10626c05274dbc..dc76d032d34ceaca804a671813ad3b5c17abd392 100644 (file)
@@ -984,7 +984,8 @@ libvirt_lxc_SOURCES =                                               \
                $(CPU_CONF_SOURCES)                             \
                $(NWFILTER_PARAM_CONF_SOURCES)
 libvirt_lxc_LDFLAGS = $(WARN_CFLAGS) $(COVERAGE_LDCFLAGS) $(CAPNG_LIBS) $(YAJL_LIBS)
-libvirt_lxc_LDADD = $(LIBXML_LIBS) $(NUMACTL_LIBS) ../gnulib/lib/libgnu.la
+libvirt_lxc_LDADD = $(LIBXML_LIBS) $(NUMACTL_LIBS) $(LIB_PTHREAD) \
+               ../gnulib/lib/libgnu.la
 libvirt_lxc_CFLAGS =                           \
                $(LIBPARTED_CFLAGS)             \
                $(NUMACTL_CFLAGS)               \
index 317125fb9288ba8e5b4e37216559ed3563041b54..bf53da41ce03ee8c7f47c061a899c8b881dbaedb 100644 (file)
@@ -9556,7 +9556,7 @@ remoteIOEventLoop(virConnectPtr conn,
         struct remote_thread_call *tmp = priv->waitDispatch;
         struct remote_thread_call *prev;
         char ignore;
-#ifdef HAVE_PTHREAD_H
+#ifdef HAVE_PTHREAD_SIGMASK
         sigset_t oldmask, blockedsigs;
 #endif
 
@@ -9585,7 +9585,7 @@ remoteIOEventLoop(virConnectPtr conn,
          * after the call (RHBZ#567931).  Same for SIGCHLD and SIGPIPE
          * at the suggestion of Paolo Bonzini and Daniel Berrange.
          */
-#ifdef HAVE_PTHREAD_H
+#ifdef HAVE_PTHREAD_SIGMASK
         sigemptyset (&blockedsigs);
         sigaddset (&blockedsigs, SIGWINCH);
         sigaddset (&blockedsigs, SIGCHLD);
@@ -9598,7 +9598,7 @@ remoteIOEventLoop(virConnectPtr conn,
         if (ret < 0 && errno == EAGAIN)
             goto repoll;
 
-#ifdef HAVE_PTHREAD_H
+#ifdef HAVE_PTHREAD_SIGMASK
         ignore_value(pthread_sigmask(SIG_SETMASK, &oldmask, NULL));
 #endif
 
index 18f8b64e120692213a56728b49a7f760e7e2541d..8c0a91a607ffb4d4c9dd987d7b66dfef0987f028 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * threads.c: basic thread synchronization primitives
  *
- * Copyright (C) 2009 Red Hat, Inc.
+ * Copyright (C) 2009-2010 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -23,7 +23,7 @@
 
 #include "threads.h"
 
-#ifdef HAVE_PTHREAD_H
+#ifdef HAVE_PTHREAD_MUTEXATTR_INIT
 # include "threads-pthread.c"
 #else
 # ifdef WIN32
index 6e010829ff446eb0a26b27a5d749536c64d9545f..8b2be8dbc8ad22f8d10d529795a08b25a8f58f68 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * threads.h: basic thread synchronization primitives
  *
- * Copyright (C) 2009 Red Hat, Inc.
+ * Copyright (C) 2009-2010 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -61,7 +61,7 @@ int virThreadLocalInit(virThreadLocalPtr l,
 void *virThreadLocalGet(virThreadLocalPtr l);
 void virThreadLocalSet(virThreadLocalPtr l, void*);
 
-# ifdef HAVE_PTHREAD_H
+# ifdef HAVE_PTHREAD_MUTEXATTR_INIT
 #  include "threads-pthread.h"
 # else
 #  ifdef WIN32
index c44d0126e01f1c5fc6d51344b0485d8dd5e2338b..bfd37e049d8c063ea7a8bc2f713becace3c69833 100644 (file)
@@ -316,7 +316,7 @@ static int virClearCapabilities(void)
 
  */
 int virFork(pid_t *pid) {
-#  ifdef HAVE_PTHREAD_H
+#  ifdef HAVE_PTHREAD_SIGMASK
     sigset_t oldmask, newmask;
 #  endif
     struct sigaction sig_action;
@@ -328,7 +328,7 @@ int virFork(pid_t *pid) {
      * Need to block signals now, so that child process can safely
      * kill off caller's signal handlers without a race.
      */
-#  ifdef HAVE_PTHREAD_H
+#  ifdef HAVE_PTHREAD_SIGMASK
     sigfillset(&newmask);
     if (pthread_sigmask(SIG_SETMASK, &newmask, &oldmask) != 0) {
         saved_errno = errno;
@@ -349,7 +349,7 @@ int virFork(pid_t *pid) {
     virLogUnlock();
 
     if (*pid < 0) {
-#  ifdef HAVE_PTHREAD_H
+#  ifdef HAVE_PTHREAD_SIGMASK
         /* attempt to restore signal mask, but ignore failure, to
            avoid obscuring the fork failure */
         ignore_value (pthread_sigmask(SIG_SETMASK, &oldmask, NULL));
@@ -363,7 +363,7 @@ int virFork(pid_t *pid) {
 
         /* parent process */
 
-#  ifdef HAVE_PTHREAD_H
+#  ifdef HAVE_PTHREAD_SIGMASK
         /* Restore our original signal mask now that the child is
            safely running */
         if (pthread_sigmask(SIG_SETMASK, &oldmask, NULL) != 0) {
@@ -407,7 +407,7 @@ int virFork(pid_t *pid) {
             sigaction(i, &sig_action, NULL);
         }
 
-#  ifdef HAVE_PTHREAD_H
+#  ifdef HAVE_PTHREAD_SIGMASK
         /* Unmask all signals in child, since we've no idea
            what the caller's done with their signal mask
            and don't want to propagate that to children */