On 01/23/2014 02:37 PM, Daniel P. Berrange wrote:
There are a number of pthreads impls available on Win32
these days, in particular the mingw64 project has a good
impl. Delete the native windows thread implementation and
rely on using pthreads everywhere.
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
configure.ac | 15 +-
src/Makefile.am | 4 -
src/util/virthread.c | 291 +++++++++++++++++++++++++++++++-
src/util/virthread.h | 41 ++++-
src/util/virthreadpthread.c | 309 ----------------------------------
src/util/virthreadpthread.h | 53 ------
src/util/virthreadwin32.c | 396 --------------------------------------------
src/util/virthreadwin32.h | 53 ------
8 files changed, 329 insertions(+), 833 deletions(-)
delete mode 100644 src/util/virthreadpthread.c
delete mode 100644 src/util/virthreadpthread.h
delete mode 100644 src/util/virthreadwin32.c
delete mode 100644 src/util/virthreadwin32.h
diff --git a/configure.ac b/configure.ac
index 3a70375..168eb27 100644
--- a/configure.ac
+++ b/configure.ac
@@ -270,12 +270,21 @@ AC_CHECK_FUNCS_ONCE([cfmakeraw fallocate geteuid getgid getgrnam_r
\
posix_memalign prlimit regexec sched_getaffinity setgroups setns \
setrlimit symlink sysctlbyname])
-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 and LIBMULTITHREAD were set during gl_INIT by gnulib.
+dnl Availability of pthread functions. Because of $LIB_PTHREAD, we
+dnl cannot use AC_CHECK_FUNCS_ONCE. LIB_PTHREAD and LIBMULTITHREAD
+dnl were set during gl_INIT by gnulib.
old_LIBS=$LIBS
LIBS="$LIBS $LIB_PTHREAD $LIBMULTITHREAD"
+
+pthread_found=yes
AC_CHECK_FUNCS([pthread_mutexattr_init])
+AC_CHECK_HEADER([pthread.h],,[pthread_found=no])
+
+if test "$ac_cv_func_pthread_mutexattr_init:$pthread_found" !=
"yes:yes"
+then
+ AC_MSG_ERROR([A pthreads impl is required for building libvirt])
+fi
+
dnl At least mingw64-winpthreads #defines pthread_sigmask to 0,
dnl which in turn causes compilation to complain about unused variables.
dnl Expose this broken implementation, so we can work around it.
diff --git a/src/Makefile.am b/src/Makefile.am
index 8f77658..2298fdb 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -141,8 +141,6 @@ UTIL_SOURCES = \
util/virsysinfo.c util/virsysinfo.h \
util/virsystemd.c util/virsystemd.h \
util/virthread.c util/virthread.h \
- util/virthreadpthread.h \
- util/virthreadwin32.h \
util/virthreadpool.c util/virthreadpool.h \
util/virtime.h util/virtime.c \
util/virtpm.h util/virtpm.c \
@@ -165,8 +163,6 @@ util/virkeymaps.h: $(srcdir)/util/keymaps.csv \
$(AM_V_GEN)$(PYTHON) $(srcdir)/util/virkeycode-mapgen.py \
<$(srcdir)/util/keymaps.csv >$(srcdir)/util/virkeymaps.h
-EXTRA_DIST += util/virthreadpthread.c util/virthreadwin32.c
-
# Internal generic driver infrastructure
NODE_INFO_SOURCES = nodeinfo.h nodeinfo.c
DATATYPES_SOURCES = datatypes.h datatypes.c
diff --git a/src/util/virthread.c b/src/util/virthread.c
index dd1768e..b60fb4a 100644
--- a/src/util/virthread.c
+++ b/src/util/virthread.c
@@ -23,12 +23,289 @@
#include "virthread.h"
-/* On mingw, we prefer native threading over the sometimes-broken
- * pthreads-win32 library wrapper. */
-#ifdef WIN32
-# include "virthreadwin32.c"
-#elif defined HAVE_PTHREAD_MUTEXATTR_INIT
-# include "virthreadpthread.c"
+#include <unistd.h>
+#include <inttypes.h>
+#if HAVE_SYS_SYSCALL_H
+# include <sys/syscall.h>
+#endif
+
+#include "viralloc.h"
+
+
+/* Nothing special required for pthreads */
+int virThreadInitialize(void)
+{
+ return 0;
+}
+
+void virThreadOnExit(void)
+{
+}
+
+int virOnce(virOnceControlPtr once, virOnceFunc init)
+{
+ return pthread_once(&once->once, init);
+}
+
+
+int virMutexInit(virMutexPtr m)
+{
+ int ret;
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
+ ret = pthread_mutex_init(&m->lock, &attr);
+ pthread_mutexattr_destroy(&attr);
+ if (ret != 0) {
+ errno = ret;
+ return -1;
+ }
+ return 0;
+}
You just moved the contents of virthreadpthread.c into virthread.c,
right? Is there maybe some way to convince git to make a shorter diff?
(I did something similar in netcf - moved 90% of one file into another,
and renamed the original, and it properly figured out to rename the
original into the new 90%, and create the one I thought I was renaming
from scratch). Not terribly important though, since we all know what
really happened here :-)
diff --git a/src/util/virthread.h b/src/util/virthread.h
index 7015d60..94476ee 100644
--- a/src/util/virthread.h
+++ b/src/util/virthread.h
@@ -25,24 +25,57 @@
# include "internal.h"
# include "virerror.h"
+# include <pthread.h>
+
[...]
+
typedef struct virOnceControl virOnceControl;
typedef virOnceControl *virOnceControlPtr;
+struct virOnceControl {
+ pthread_once_t once;
+};
+
+
+#define VIR_ONCE_CONTROL_INITIALIZER \
This is now improperly indented.
Oh, and also I just noticed the copyright date hasn't been updated.
I guess as long as it builds on Windows/ming64 I give it a functional
ACK. I don't know enough about problems in "certain" Windows pthreads
implementations to comfortably ACK the removal of the Windows native
threads code, though.