From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from latitanza.investici.org (latitanza.investici.org [IPv6:2001:888:2000:56::19]) by sourceware.org (Postfix) with ESMTPS id 78014385380B; Mon, 31 Oct 2022 15:22:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 78014385380B Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=autistici.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=autistici.org Received: from 1.mail-backend.investici.org (unknown [10.0.0.11]) by latitanza.investici.org (Postfix) with ESMTP id 4N1H286MXWzGp2Q; Mon, 31 Oct 2022 15:22:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=autistici.org; s=stigmate; t=1667229728; bh=eiLiQMQFCO9z623Jm9AEQ+9/OkNWZOzlwIxsIJXOd9A=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=fT/3okxt98zqcWuvY50xARkH9HNMpjTldKCFnUtZJCJW9fUwgHhtkRvr3LVCtEgob 5szT02BaxrqF8HyepxRL0VZXWr4G3aj0WBodqYGvaJQre7vJvjFgP18PtSrdq2ZkzR KP5GAxMtvjE9AN0ANH1zktFrag7jAEsAKuXeURnM= Received: from 1.webmail.investici.org (localhost [127.0.0.1]) (Authenticated sender: i.nixman@autistici.org) by 1.mail-backend.investici.org (Postfix) with ESMTPA id 4N1H284zS7z5t7N; Mon, 31 Oct 2022 15:22:08 +0000 (UTC) MIME-Version: 1.0 Date: Mon, 31 Oct 2022 15:22:08 +0000 From: i.nixman@autistici.org To: Eric Botcazou Cc: jwakely@redhat.com, libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: Re: Adding a new thread model to GCC In-Reply-To: <21655510.EfDdHjke4D@fomalhaut> References: <0f1f223a-3756-1da3-bd1d-b87edd34e1f9@126.com> <4435122.LvFx2qVVIh@fomalhaut> <5795a640ae545b07f11763c310825cc9@autistici.org> <21655510.EfDdHjke4D@fomalhaut> User-Agent: Roundcube Webmail Message-ID: X-Sender: i.nixman@autistici.org Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,KAM_SHORT,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: 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 > > 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.