]> Savannah Git Hosting - gnulib.git/commitdiff
pthread: work around winpthread header pollution on mingw
authorEric Blake <eblake@redhat.com>
Thu, 23 Jan 2014 03:39:45 +0000 (20:39 -0700)
committerEric Blake <eblake@redhat.com>
Thu, 23 Jan 2014 17:55:02 +0000 (10:55 -0700)
Dan Berrange reported compilation failure of libvirt on Fedora 20
when cross-compiling to mingw; the problem was traced to bogus
macros in the winpthreads <pthread.h> header shipped as part of
mingw-headers 3.0.

  CC       util/libvirt_util_la-virerror.lo
In file included from /usr/i686-w64-mingw32/sys-root/mingw/include/sys/time.h:10:0,
                 from ../gnulib/lib/sys/time.h:39,
                 from ../gnulib/lib/sys/select.h:117,
                 from util/virutil.h:31,
                 from util/virerror.c:35:
../gnulib/lib/time.h:468:21: error: expected identifier or '(' before '{' token
 _GL_FUNCDECL_SYS (localtime_r, struct tm *, (time_t const *restrict __timer,
                     ^

Gnulib's time.h was already working around the pthread.h pollution,
but now that newer mingw has started providing struct timespec,
the workaround was no longer being hit.  Moving the pollution
workaround to the wrapper around the broken header solves the problem.

* lib/time.in.h: Move pthread workarounds...
* lib/pthread.in.h: ...here.
* m4/pthread.m4 (gl_PTHREAD_CHECK): Also build pthread.h when we
detect macro pollution on mingw.
* doc/posix-headers/pthread.texi (pthread.h): Document the problems.

Signed-off-by: Eric Blake <eblake@redhat.com>
ChangeLog
doc/posix-headers/pthread.texi
lib/pthread.in.h
lib/time.in.h
m4/pthread.m4

index b7c3e0fc28c84da52dc92757b1961a5a67ae3c58..d117e758597fc258801745fc05ac5ce5bdd82c95 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2014-01-23  Eric Blake  <eblake@redhat.com>
+
+       pthread: work around winpthread header pollution on mingw
+       * lib/time.in.h: Move pthread workarounds...
+       * lib/pthread.in.h: ...here.
+       * m4/pthread.m4 (gl_PTHREAD_CHECK): Also build pthread.h when we
+       detect macro pollution on mingw.
+       * doc/posix-headers/pthread.texi (pthread.h): Document the problems.
+
 2014-01-22  Paul Eggert  <eggert@cs.ucla.edu>
 
        qacl: check for fchmod
index 5fb1d2e5d46ec1d36c4af279910ded8875f61f54..cb4d2b80a05986ea51528ac70062fb056c2a17eb 100644 (file)
@@ -3,15 +3,22 @@
 
 POSIX specification:@* @url{http://www.opengroup.org/onlinepubs/9699919799/basedefs/pthread.h.html}
 
-Gnulib module: ---
+Gnulib module: pthread
 
 Portability problems fixed by Gnulib:
 @itemize
+@item
+This header pollutes the namespace with some broken macro
+implementations for various functions such as @code{strtok_r} and
+@code{gmtime_r}:
+mingw 3.0.
 @end itemize
 
 Portability problems not fixed by Gnulib:
 @itemize
 @item
-This header file is missing on some platforms:
-Minix 3.1.8, mingw, MSVC 9, BeOS.
+This header file is missing on some platforms; the replacement does
+not offer threads, so much as lightweight stubs that make conditional
+compilation easier for fallbacks to single-threaded programs.
+Minix 3.1.8, mingw 2.x, MSVC 9, BeOS.
 @end itemize
index a8438df9b1d15908490b11f03e9c54fa2a43cc89..764b34688f530dc4f2110c7bd9a2d31ce9bf499f 100644 (file)
 #include <stdlib.h>
 #undef __need_system_stdlib_h
 
+
+/* The pthreads-win32 <pthread.h> defines a couple of broken macros.  */
+#undef asctime_r
+#undef ctime_r
+#undef gmtime_r
+#undef localtime_r
+#undef rand_r
+#undef strtok_r
+
 #include <errno.h>
 #include <sched.h>
 #include <sys/types.h>
index 10561397c779eb22b93937044e94f9c7b45cc1e2..98ca30d46885217f1d128a0c04a24bfb5403e2d9 100644 (file)
 
 /* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3).
    Or they define it with the wrong member names or define it in <sys/time.h>
-   (e.g., FreeBSD circa 1997).  Stock Mingw does not define it, but the
-   pthreads-win32 library defines it in <pthread.h>.  */
+   (e.g., FreeBSD circa 1997).  Stock Mingw prior to 3.0 does not define it,
+   but the pthreads-win32 library defines it in <pthread.h>.  */
 # if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@
 #  if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
 #   include <sys/time.h>
 #  elif @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
 #   include <pthread.h>
-/* The pthreads-win32 <pthread.h> also defines a couple of broken macros.  */
-#   undef asctime_r
-#   undef ctime_r
-#   undef gmtime_r
-#   undef localtime_r
-#   undef rand_r
-#   undef strtok_r
 #  else
 
 #   ifdef __cplusplus
index 2141e53f14c5bafa95e6b4937ac535d79b322e82..1ed0dd335ed8091f39b412771b7b2bcbbe6c4381 100644 (file)
@@ -1,4 +1,4 @@
-# pthread.m4 serial 7
+# pthread.m4 serial 8
 dnl Copyright (C) 2009-2014 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -10,6 +10,19 @@ AC_DEFUN([gl_PTHREAD_CHECK],
    gl_CHECK_NEXT_HEADERS([pthread.h])
    if test $ac_cv_header_pthread_h = yes; then
      HAVE_PTHREAD_H=1
+     # mingw 3.0 uses winpthreads which installs broken macros via <pthread.h>
+     AC_CACHE_CHECK([whether <pthread.h> pollutes the namespace],
+      [gl_cv_header_pthread_h_pollution],
+      [AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM(
+          [[#include <pthread.h>
+            #ifdef strtok_r
+            #error
+             break me
+            #endif
+          ]])],
+        [gl_cv_header_pthread_h_pollution=no],
+        [gl_cv_header_pthread_h_pollution=yes])])
    else
      HAVE_PTHREAD_H=0
    fi
@@ -31,6 +44,8 @@ AC_DEFUN([gl_PTHREAD_CHECK],
       test $ac_cv_type_pthread_spinlock_t != yes; then
      PTHREAD_H='pthread.h'
      AC_LIBOBJ([pthread])
+   elif test $gl_cv_header_pthread_h_pollution = yes; then
+     PTHREAD_H=pthread.h
    else
      PTHREAD_H=
    fi