On 2022-10-31 09:18, Eric Botcazou wrote:

Hi Eric!

thank you very much for the job!
I will try to build our (MinGW-Builds project) builds using this patch and will report back.

@Jonathan

what the next steps to be taken to accept this patch?



best!


I have attached a revised version of the original patch at:
  https://gcc.gnu.org/legacy-ml/gcc-patches/2019-06/msg01840.html

This reimplements the GNU threads library on native Windows (except for the Objective-C specific subset) using direct Win32 API calls, in lieu of the
implementation based on semaphores.  This base implementations requires
Windows XP/Server 2003, which was the default minimal setting of MinGW-W64 until end of 2020. This also adds the support required for the C++11 threads, using again direct Win32 API calls; this additional layer requires Windows
Vista/Server 2008 and is enabled only if _WIN32_WINNT >= 0x0600.

This also changes libstdc++ to pass -D_WIN32_WINNT=0x0600 but only when the switch --enable-libstdcxx-threads is passed, which means that C++11 threads are still disabled by default *unless* MinGW-W64 itself is configured for Windows Vista/Server 2008 or later by default (this has been the case in
the development version since end of 2020, for earlier versions you can
configure it --with-default-win32-winnt=0x0600 to get the same effect).

I only manually tested it on i686-w64-mingw32 and x86_64-w64-mingw32 but AdaCore has used it in their C/C++/Ada compilers for 3 years now and the
30_threads chapter of the libstdc++ testsuite was clean at the time.


2022-10-31  Eric Botcazou  <ebotca...@adacore.com>

libgcc/
        * config.host (i[34567]86-*-mingw*): Add thread fragment after EH one
        as well as new i386/t-slibgcc-mingw fragment.
        (x86_64-*-mingw*): Likewise.
        * config/i386/gthr-win32.h: If _WIN32_WINNT is at least 0x0600, define
        both __GTHREAD_HAS_COND and __GTHREADS_CXX0X to 1.
        Error out if _GTHREAD_USE_MUTEX_TIMEDLOCK is 1.
        Include stdlib.h instead of errno.h and do not include _mingw.h.
        (CONST_CAST2): Add specific definition for C++.
        (ATTRIBUTE_UNUSED): New macro.
        (__UNUSED_PARAM): Delete.
        Define WIN32_LEAN_AND_MEAN before including windows.h.
(__gthread_objc_data_tls): Use TLS_OUT_OF_INDEXES instead of (DWORD)-1.
        (__gthread_objc_init_thread_system): Likewise.
        (__gthread_objc_thread_get_data): Minor tweak.
        (__gthread_objc_condition_allocate): Use ATTRIBUTE_UNUSED.
        (__gthread_objc_condition_deallocate): Likewise.
        (__gthread_objc_condition_wait): Likewise.
        (__gthread_objc_condition_broadcast): Likewise.
        (__gthread_objc_condition_signal): Likewise.
        Include sys/time.h.
        (__gthr_win32_DWORD): New typedef.
        (__gthr_win32_HANDLE): Likewise.
        (__gthr_win32_CRITICAL_SECTION): Likewise.
        (__gthr_win32_CONDITION_VARIABLE): Likewise.
        (__gthread_t): Adjust.
        (__gthread_key_t): Likewise.
        (__gthread_mutex_t): Likewise.
        (__gthread_recursive_mutex_t): Likewise.
        (__gthread_cond_t): New typedef.
        (__gthread_time_t): Likewise.
        (__GTHREAD_MUTEX_INIT_DEFAULT): Delete.
        (__GTHREAD_RECURSIVE_MUTEX_INIT_DEFAULT): Likewise.
        (__GTHREAD_COND_INIT_FUNCTION): Define.
        (__GTHREAD_TIME_INIT): Likewise.
        (__gthr_i486_lock_cmp_xchg): Delete.
        (__gthr_win32_create): Declare.
        (__gthr_win32_join): Likewise.
        (__gthr_win32_self): Likewise.
        (__gthr_win32_detach): Likewise.
        (__gthr_win32_equal): Likewise.
        (__gthr_win32_yield): Likewise.
        (__gthr_win32_mutex_destroy): Likewise.
(__gthr_win32_cond_init_function): Likewise if __GTHREADS_HAS_COND is 1.
        (__gthr_win32_cond_broadcast): Likewise.
        (__gthr_win32_cond_signal): Likewise.
        (__gthr_win32_cond_wait): Likewise.
        (__gthr_win32_cond_timedwait): Likewise.
        (__gthr_win32_recursive_mutex_init_function): Delete.
        (__gthr_win32_recursive_mutex_lock): Likewise.
        (__gthr_win32_recursive_mutex_unlock): Likewise.
        (__gthr_win32_recursive_mutex_destroy): Likewise.
        (__gthread_create): New inline function.
        (__gthread_join): Likewise.
        (__gthread_self): Likewise.
        (__gthread_detach): Likewise.
        (__gthread_equal): Likewise.
        (__gthread_yield): Likewise.
        (__gthread_cond_init_function): Likewise if __GTHREADS_HAS_COND is 1.
        (__gthread_cond_broadcast): Likewise.
        (__gthread_cond_signal): Likewise.
        (__gthread_cond_wait): Likewise.
        (__gthread_cond_timedwait): Likewise.
        (__GTHREAD_WIN32_INLINE): New macro.
        (__GTHREAD_WIN32_COND_INLINE): Likewise.
        (__GTHREAD_WIN32_ACTIVE_P): Likewise.
        Define WIN32_LEAN_AND_MEAN before including windows.h.
        (__gthread_once): Minor tweaks.
        (__gthread_key_create): Use ATTRIBUTE_UNUSED and TLS_OUT_OF_INDEXES.
        (__gthread_key_delete): Minor tweak.
        (__gthread_getspecific): Likewise.
        (__gthread_setspecific): Likewise.
        (__gthread_mutex_init_function): Reimplement.
        (__gthread_mutex_destroy): Likewise.
        (__gthread_mutex_lock): Likewise.
        (__gthread_mutex_trylock): Likewise.
        (__gthread_mutex_unlock): Likewise.
        (__gthr_win32_abs_to_rel_time): Declare.
        (__gthread_recursive_mutex_init_function): Reimplement.
        (__gthread_recursive_mutex_destroy): Likewise.
        (__gthread_recursive_mutex_lock): Likewise.
        (__gthread_recursive_mutex_trylock): Likewise.
        (__gthread_recursive_mutex_unlock): Likewise.
        (__gthread_cond_destroy): New inline function.
        (__gthread_cond_wait_recursive): Likewise.
        * config/i386/gthr-win32.c: Delete everything.
Include gthr-win32.h to get the out-of-line version of inline routines.
        Add compile-time checks for the local version of the Win32 types.
        * config/i386/gthr-win32-cond.c: New file.
        * config/i386/gthr-win32-thread.c: Likewise.
        * config/i386/t-gthr-win32: Add config/i386/gthr-win32-thread.c to the
        EH part, config/i386/gthr-win32-cond.c and config/i386/gthr-win32.c to
        the static version of libgcc.
        * config/i386/t-slibgcc-mingw: New file.
        * config/i386/libgcc-mingw.ver: Likewise.
libstdc++-v3/
        * acinclude.m4 (GLIBCXX_EXPORT_FLAGS): Substitute CPPFLAGS.
        (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Set ac_has_sched_yield and
        ac_has_win32_sleep to yes for MinGW.  Change HAVE_WIN32_SLEEP
        into _GLIBCXX_USE_WIN32_SLEEP.
        (GLIBCXX_CHECK_GTHREADS): Add _WIN32_THREADS to compilation flags for
        Win32 threads and force _GTHREAD_USE_MUTEX_TIMEDLOCK to 0 for them.
        Add -D_WIN32_WINNT=0x0600 to compilation flags if yes was configured
        and add it to CPPFLAGS on success.
        * config.h.in: Regenerate.
        * configure: Likewise.
        * config/os/mingw32-w64/os_defines.h (_GLIBCXX_USE_GET_NPROCS_WIN32):
        Define to 1.
* config/os/mingw32/os_defines.h (_GLIBCXX_USE_GET_NPROCS_WIN32): Ditto
        * src/c++11/thread.cc (get_nprocs): Provide Win32 implementation if
        _GLIBCXX_USE_GET_NPROCS_WIN32 is defined.  Replace HAVE_WIN32_SLEEP
        with USE_WIN32_SLEEP.
        * testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc: Add
        missing conditional compilation.
        * testsuite/lib/libstdc++.exp (check_v3_target_sleep): Add support for
        _GLIBCXX_USE_WIN32_SLEEP.
        (check_v3_target_nprocs): Likewise for _GLIBCXX_USE_GET_NPROCS_WIN32.

Reply via email to