| From 51eb50d174eed9942b5edb3f227e1866d9eee092 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= |
| <alexey.pawlow@gmail.com> |
| Date: Thu, 17 Jun 2021 18:51:12 +0530 |
| Subject: [PATCH 003/N] MINGW BASE use NT thread model |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Co-authored-by: Алексей <alexey.pawlow@gmail.com> |
| Co-authored-by: Christoph Reiter <reiter.christoph@gmail.com> |
| --- |
| Modules/_multiprocessing/multiprocessing.h | 3 + |
| configure.ac | 94 +++++++++++++++++++++- |
| pyconfig.h.in | 3 + |
| 3 files changed, 98 insertions(+), 2 deletions(-) |
| |
| diff --git a/Modules/_multiprocessing/multiprocessing.h b/Modules/_multiprocessing/multiprocessing.h |
| index fe78135..344b76e 100644 |
| --- a/Modules/_multiprocessing/multiprocessing.h |
| +++ b/Modules/_multiprocessing/multiprocessing.h |
| @@ -21,6 +21,9 @@ |
| # endif |
| # define SEM_HANDLE HANDLE |
| # define SEM_VALUE_MAX LONG_MAX |
| +# if defined(HAVE_SEM_OPEN) && defined(_POSIX_THREADS) |
| +# include <semaphore.h> |
| +# endif |
| #else |
| # include <fcntl.h> /* O_CREAT and O_EXCL */ |
| # if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED) |
| diff --git a/configure.ac b/configure.ac |
| index 6ae56e1..005fc8f 100644 |
| --- a/configure.ac |
| +++ b/configure.ac |
| @@ -2040,6 +2040,46 @@ then |
| BASECFLAGS="$BASECFLAGS $ac_arch_flags" |
| fi |
| |
| +dnl NOTE: |
| +dnl - GCC 4.4+ for mingw* require and use posix threads(pthreads-w32) |
| +dnl - Host may contain installed pthreads-w32. |
| +dnl - On windows platform only NT-thread model is supported. |
| +dnl To avoid miss detection scipt first will check for NT-thread model |
| +dnl and if is not found will try to detect build options for pthread |
| +dnl model. Autodetection could be overiden if variable with_nt_threads |
| +dnl is set in "Site Configuration" (see autoconf manual). |
| +dnl If NT-thread model is enabled script skips some checks that |
| +dnl impact build process. When a new functionality is added, developers |
| +dnl are responsible to update configure script to avoid thread models |
| +dnl to be mixed. |
| + |
| +AC_MSG_CHECKING([for NT threads]) |
| +AC_ARG_WITH(nt-threads, |
| + AS_HELP_STRING([--with-nt-threads], [build with windows threads]), |
| +[ |
| + case $withval in |
| + no) with_nt_threads=no;; |
| + yes) with_nt_threads=yes;; |
| + *) with_nt_threads=yes;; |
| + esac], [ |
| + with_nt_threads=no]) |
| +if test $with_nt_threads = yes ; then |
| +AC_LINK_IFELSE([ |
| + AC_LANG_PROGRAM([[]],[[_beginthread(0, 0, 0);]]) |
| + ], |
| + [with_nt_threads=yes], |
| + [with_nt_threads=no]) |
| +fi |
| +AC_MSG_RESULT([$with_nt_threads]) |
| + |
| +if test $with_nt_threads = yes ; then |
| + dnl temporary default flag to avoid additional pthread checks |
| + dnl and initilize other ac..thread flags to no |
| + ac_cv_pthread_is_default=no |
| + ac_cv_kthread=no |
| + ac_cv_pthread=no |
| + dnl ac_cv_kpthread is set to no if default is yes (see below) |
| +else |
| # On some compilers, pthreads are available without further options |
| # (e.g. MacOS X). On some of these systems, the compiler will not |
| # complain if unaccepted options are passed (e.g. gcc on Mac OS X). |
| @@ -2158,6 +2198,8 @@ CC="$ac_save_cc"]) |
| AC_MSG_RESULT($ac_cv_pthread) |
| fi |
| |
| +fi |
| + |
| # If we have set a CC compiler flag for thread support then |
| # check if it works for CXX, too. |
| ac_cv_cxx_thread=no |
| @@ -2178,6 +2220,10 @@ elif test "$ac_cv_pthread" = "yes" |
| then |
| CXX="$CXX -pthread" |
| ac_cv_cxx_thread=yes |
| +elif test $with_nt_threads = yes |
| +then |
| + dnl set to always to skip extra pthread check below |
| + ac_cv_cxx_thread=always |
| fi |
| |
| if test $ac_cv_cxx_thread = yes |
| @@ -2210,8 +2256,8 @@ dnl AC_MSG_RESULT($cpp_type) |
| AC_HEADER_STDC |
| AC_CHECK_HEADERS(asm/types.h crypt.h conio.h direct.h dlfcn.h errno.h \ |
| fcntl.h grp.h \ |
| -ieeefp.h io.h langinfo.h libintl.h process.h pthread.h \ |
| -sched.h shadow.h signal.h stropts.h termios.h \ |
| +ieeefp.h io.h langinfo.h libintl.h process.h \ |
| +shadow.h signal.h stropts.h termios.h \ |
| utime.h \ |
| poll.h sys/devpoll.h sys/epoll.h sys/poll.h \ |
| sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/ioctl.h \ |
| @@ -2225,6 +2271,14 @@ sys/endian.h sys/sysmacros.h linux/memfd.h linux/wait.h sys/memfd.h sys/mman.h) |
| AC_HEADER_DIRENT |
| AC_HEADER_MAJOR |
| |
| +# If using nt threads, don't look for pthread.h or thread.h |
| +if test "x$with_nt_threads" = xno ; then |
| +AC_HEADER_STDC |
| +AC_CHECK_HEADERS(pthread.h sched.h thread.h) |
| +AC_HEADER_DIRENT |
| +AC_HEADER_MAJOR |
| +fi |
| + |
| # bluetooth/bluetooth.h has been known to not compile with -std=c99. |
| # http://permalink.gmane.org/gmane.linux.bluez.kernel/22294 |
| SAVE_CFLAGS=$CFLAGS |
| @@ -2422,6 +2476,10 @@ fi |
| |
| AC_MSG_CHECKING(for pthread_t) |
| have_pthread_t=no |
| +if test $with_nt_threads = yes ; then |
| + dnl skip check for pthread_t if NT-thread model is enabled |
| + have_pthread_t=skip |
| +else |
| AC_COMPILE_IFELSE([ |
| AC_LANG_PROGRAM([[#include <pthread.h>]], [[pthread_t x; x = *(pthread_t*)0;]]) |
| ],[have_pthread_t=yes],[]) |
| @@ -2452,6 +2510,7 @@ if test "$ac_cv_sizeof_pthread_key_t" -eq "$ac_cv_sizeof_int" ; then |
| else |
| AC_MSG_RESULT(no) |
| fi |
| +fi |
| CC="$ac_save_cc" |
| |
| AC_SUBST(OTHER_LIBTOOL_OPT) |
| @@ -2897,10 +2956,15 @@ void *x = uuid_enc_be |
| [AC_MSG_RESULT(no)] |
| ) |
| |
| +if test $with_nt_threads = yes ; then |
| + dnl do not search for sem_init if NT-thread model is enabled |
| + : |
| +else |
| # 'Real Time' functions on Solaris |
| # posix4 on Solaris 2.6 |
| # pthread (first!) on Linux |
| AC_SEARCH_LIBS(sem_init, pthread rt posix4) |
| +fi |
| |
| # check if we need libintl for locale functions |
| AC_CHECK_LIB(intl, textdomain, |
| @@ -3232,6 +3296,11 @@ then |
| CXX="$CXX -pthread" |
| fi |
| posix_threads=yes |
| +elif test $with_nt_threads = yes |
| +then |
| + posix_threads=no |
| + AC_DEFINE(NT_THREADS, 1, |
| + [Define to 1 if you want to use native NT threads]) |
| else |
| if test ! -z "$withval" -a -d "$withval" |
| then LDFLAGS="$LDFLAGS -L$withval" |
| @@ -3692,6 +3761,15 @@ else |
| fi |
| |
| # checks for library functions |
| +if test $with_nt_threads = yes ; then |
| + dnl GCC(mingw) 4.4+ require and use posix threads(pthreads-w32) |
| + dnl and host may contain installed pthreads-w32. |
| + dnl Skip checks for some functions declared in pthreads-w32 if |
| + dnl NT-thread model is enabled. |
| + ac_cv_func_pthread_kill=skip |
| + ac_cv_func_sem_open=skip |
| + ac_cv_func_sched_setscheduler=skip |
| +fi |
| AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ |
| clock confstr copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \ |
| faccessat fchmod fchmodat fchown fchownat \ |
| @@ -4613,6 +4691,10 @@ AC_CHECK_DECLS([isinf, isnan, isfinite], [], [], [[#include <math.h>]]) |
| # the kernel module that provides POSIX semaphores |
| # isn't loaded by default, so an attempt to call |
| # sem_open results in a 'Signal 12' error. |
| +if test $with_nt_threads = yes ; then |
| + dnl skip posix semaphores test if NT-thread model is enabled |
| + ac_cv_posix_semaphores_enabled=no |
| +fi |
| AC_MSG_CHECKING(whether POSIX semaphores are enabled) |
| AC_CACHE_VAL(ac_cv_posix_semaphores_enabled, |
| AC_RUN_IFELSE([AC_LANG_SOURCE([[ |
| @@ -4646,6 +4728,14 @@ fi |
| |
| # Multiprocessing check for broken sem_getvalue |
| AC_MSG_CHECKING(for broken sem_getvalue) |
| +if test $with_nt_threads = yes ; then |
| + dnl Skip test if NT-thread model is enabled. |
| + dnl NOTE the test case below fail for pthreads-w32 as: |
| + dnl - SEM_FAILED is not defined; |
| + dnl - sem_open is a stub; |
| + dnl - sem_getvalue work(!). |
| + ac_cv_broken_sem_getvalue=skip |
| +fi |
| AC_CACHE_VAL(ac_cv_broken_sem_getvalue, |
| AC_RUN_IFELSE([AC_LANG_SOURCE([[ |
| #include <unistd.h> |
| diff --git a/pyconfig.h.in b/pyconfig.h.in |
| index 6358e56..5f63cae 100644 |
| --- a/pyconfig.h.in |
| +++ b/pyconfig.h.in |
| @@ -1359,6 +1359,9 @@ |
| /* Define if mvwdelch in curses.h is an expression. */ |
| #undef MVWDELCH_IS_EXPRESSION |
| |
| +/* Define to 1 if you want to use native NT threads */ |
| +#undef NT_THREADS |
| + |
| /* Define to the address where bug reports for this package should be sent. */ |
| #undef PACKAGE_BUGREPORT |
| |
| -- |
| 2.32.0 |
| |