Hi David, Thanks for the information. Looking into it now.
/Eric On Fri, Jan 6, 2017 at 4:02 PM, David Blaikie <dblai...@gmail.com> wrote: > > > On Fri, Jan 6, 2017 at 12:16 PM Eric Fiselier via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> Author: ericwf >> Date: Fri Jan 6 14:05:40 2017 >> New Revision: 291275 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=291275&view=rev >> Log: >> [libc++] Cleanup and document <__threading_support> >> >> Summary: >> This patch attempts to clean up the macro configuration mess in >> `<__threading_support>`, specifically the mess involving external threading >> variants. Additionally this patch adds design documentation for >> `<__threading_support>` and the configuration macros it uses. >> >> The primary change in this patch is separating the idea of an "external >> API" provided by `<__external_threading>` and the idea of having an >> external threading library. Now `_LIBCPP_HAS_THREAD_API_EXTERNAL` means >> that libc++ should use `<__external_threading>` and that the header is >> expected to exist. Additionally the new macro >> `_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL` >> is now used to configure for using an "external library" with the default >> threading API. >> >> Reviewers: compnerd, rmaprath >> >> Subscribers: smeenai, cfe-commits, mgorny >> >> Differential Revision: https://reviews.llvm.org/D28316 >> >> Added: >> libcxx/trunk/docs/DesignDocs/ThreadingSupportAPI.rst >> Modified: >> libcxx/trunk/CMakeLists.txt >> libcxx/trunk/docs/index.rst >> libcxx/trunk/include/__config >> libcxx/trunk/include/__config_site.in >> libcxx/trunk/include/__threading_support >> libcxx/trunk/lib/CMakeLists.txt >> libcxx/trunk/test/CMakeLists.txt >> libcxx/trunk/test/lit.site.cfg.in >> libcxx/trunk/test/support/external_threads.cpp >> >> Modified: libcxx/trunk/CMakeLists.txt >> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/ >> CMakeLists.txt?rev=291275&r1=291274&r2=291275&view=diff >> ============================================================ >> ================== >> --- libcxx/trunk/CMakeLists.txt (original) >> +++ libcxx/trunk/CMakeLists.txt Fri Jan 6 14:05:40 2017 >> @@ -169,6 +169,9 @@ option(LIBCXX_HAS_PTHREAD_API "Ignore au >> option(LIBCXX_HAS_EXTERNAL_THREAD_API >> "Build libc++ with an externalized threading API. >> This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON." OFF) >> +option(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY >> + "Build libc++ with an externalized threading library. >> + This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON" >> OFF) >> >> # Misc options ------------------------------ >> ---------------------------------- >> # FIXME: Turn -pedantic back ON. It is currently off because it warns >> @@ -230,6 +233,17 @@ if(NOT LIBCXX_ENABLE_THREADS) >> message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set >> to ON" >> " when LIBCXX_ENABLE_THREADS is also set to ON.") >> endif() >> + if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY) >> + message(FATAL_ERROR "LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY can only >> be set " >> + "to ON when LIBCXX_ENABLE_THREADS is also set to >> ON.") >> + endif() >> + >> +endif() >> + >> +if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY AND LIBCXX_HAS_EXTERNAL_THREAD_ >> API) >> + message(FATAL_ERROR "The options LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY >> and " >> + "LIBCXX_HAS_EXTERNAL_THREAD_API cannot both be ON >> at " >> + "the same time") >> endif() >> >> if(LIBCXX_HAS_PTHREAD_API AND LIBCXX_HAS_EXTERNAL_THREAD_API) >> @@ -520,6 +534,7 @@ config_define_if_not(LIBCXX_ENABLE_THREA >> >> config_define_if(LIBCXX_HAS_PTHREAD_API _LIBCPP_HAS_THREAD_API_PTHREAD) >> config_define_if(LIBCXX_HAS_EXTERNAL_THREAD_API _LIBCPP_HAS_THREAD_API_ >> EXTERNAL) >> +config_define_if(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY >> _LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) >> config_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC) >> >> # By default libc++ on Windows expects to use a shared library, which >> requires >> >> Added: libcxx/trunk/docs/DesignDocs/ThreadingSupportAPI.rst >> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/docs/DesignDocs/ >> ThreadingSupportAPI.rst?rev=291275&view=auto >> ============================================================ >> ================== >> --- libcxx/trunk/docs/DesignDocs/ThreadingSupportAPI.rst (added) >> +++ libcxx/trunk/docs/DesignDocs/ThreadingSupportAPI.rst Fri Jan 6 >> 14:05:40 2017 >> @@ -0,0 +1,70 @@ >> +===================== >> +Threading Support API >> +===================== >> + >> +.. contents:: >> + :local: >> + >> +Overview >> +======== >> + >> +Libc++ supports using multiple different threading models and >> configurations >> +to implement the threading parts of libc++, including ``<thread>`` and >> ``<mutex>``. >> +These different models provide entirely different interfaces from each >> +other. To address this libc++ wraps the underlying threading API in a >> new and >> +consistent API, which it uses internally to implement threading >> primitives. >> + >> +The ``<__threading_support>`` header is where libc++ defines its internal >> +threading interface. It contains forward declarations of the internal >> threading >> +interface as well as definitions for the interface. >> + >> +External Threading API and the ``<__external_threading>`` header >> +================================================================ >> + >> +In order to support vendors with custom threading API's libc++ allows the >> +entire internal threading interface to be provided by an external, >> +vendor provided, header. >> + >> +When ``_LIBCPP_HAS_THREAD_API_EXTERNAL`` is defined the >> ``<__threading_support>`` >> +header simply forwards to the ``<__external_threading>`` header (which >> must exist). >> +It is expected that the ``<__external_threading>`` header provide the >> exact >> +interface normally provided by ``<__threading_support>``. >> + >> +External Threading Library >> +========================== >> + >> +Normally ``<__threading_support>`` provides inline definitions to each >> internal >> +threading API function it declares. However libc++ also supports using an >> +external library to provide the definitions. >> + >> +When ``_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL`` libc++ does not provide >> inline >> +definitions for the internal API, instead assuming the definitions will >> be >> +provided by an external library. >> + >> +Threading Configuration Macros >> +============================== >> + >> +**_LIBCPP_HAS_NO_THREADS** >> + This macro is defined when libc++ is built without threading support. >> It >> + should not be manually defined by the user. >> + >> +**_LIBCPP_HAS_THREAD_API_EXTERNAL** >> + This macro is defined when libc++ should use the >> ``<__external_threading>`` >> + header to provide the internal threading API. This macro overrides >> + ``_LIBCPP_HAS_THREAD_API_PTHREAD``. >> + >> +**_LIBCPP_HAS_THREAD_API_PTHREAD** >> + This macro is defined when libc++ should use POSIX threads to >> implement the >> + internal threading API. >> + >> +**_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL** >> + This macro is defined when libc++ expects the definitions of the >> internal >> + threading API to be provided by an external library. When defined >> + ``<__threading_support>`` will only provide the forward declarations >> and >> + typedefs for the internal threading API. >> + >> +**_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL** >> + This macro is used to build an external threading library using the >> + ``<__threading_support>``. Specifically it exposes the threading API >> + definitions in ``<__threading_support>`` as non-inline definitions >> meant to >> + be compiled into a library. >> >> Modified: libcxx/trunk/docs/index.rst >> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/docs/ >> index.rst?rev=291275&r1=291274&r2=291275&view=diff >> ============================================================ >> ================== >> --- libcxx/trunk/docs/index.rst (original) >> +++ libcxx/trunk/docs/index.rst Fri Jan 6 14:05:40 2017 >> @@ -131,7 +131,7 @@ Design Documents >> DesignDocs/CapturingConfigInfo >> DesignDocs/ABIVersioning >> DesignDocs/VisibilityMacros >> - >> + DesignDocs/ThreadingSupportAPI >> >> * `<atomic> design <http://libcxx.llvm.org/atomic_design.html>`_ >> * `<type_traits> design <http://libcxx.llvm.org/type_traits_design.html >> >`_ >> >> Modified: libcxx/trunk/include/__config >> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/_ >> _config?rev=291275&r1=291274&r2=291275&view=diff >> ============================================================ >> ================== >> --- libcxx/trunk/include/__config (original) >> +++ libcxx/trunk/include/__config Fri Jan 6 14:05:40 2017 >> @@ -891,9 +891,7 @@ _LIBCPP_FUNC_VIS extern "C" void __sanit >> #endif >> >> // Thread API >> -#if !defined(_LIBCPP_HAS_NO_THREADS) && \ >> - !defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && \ >> - !defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) >> > > This change looks like it breaks existing functionality where if a user > defines _LIBCPP_HAS_THREAD_API_PTHREAD they don't need to have any of the > detected __FOO__ OS markers below. > > (with this change, even if you say you have pthreads, you still get "No > thread API" if you're not on one of those listed OSs) > > >> +#if !defined(_LIBCPP_HAS_NO_THREADS) >> # if defined(__FreeBSD__) || \ >> defined(__Fuchsia__) || \ >> defined(__NetBSD__) || \ >> @@ -901,7 +899,9 @@ _LIBCPP_FUNC_VIS extern "C" void __sanit >> defined(__APPLE__) || \ >> defined(__CloudABI__) || \ >> defined(__sun__) >> -# define _LIBCPP_HAS_THREAD_API_PTHREAD >> +# ifndef _LIBCPP_HAS_THREAD_API_PTHREAD >> +# define _LIBCPP_HAS_THREAD_API_PTHREAD >> +# endif >> # else >> # error "No thread API" >> # endif // _LIBCPP_HAS_THREAD_API >> >> Modified: libcxx/trunk/include/__config_site.in >> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/_ >> _config_site.in?rev=291275&r1=291274&r2=291275&view=diff >> ============================================================ >> ================== >> --- libcxx/trunk/include/__config_site.in (original) >> +++ libcxx/trunk/include/__config_site.in Fri Jan 6 14:05:40 2017 >> @@ -21,6 +21,7 @@ >> #cmakedefine _LIBCPP_HAS_MUSL_LIBC >> #cmakedefine _LIBCPP_HAS_THREAD_API_PTHREAD >> #cmakedefine _LIBCPP_HAS_THREAD_API_EXTERNAL >> +#cmakedefine _LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL >> #cmakedefine _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS >> >> #endif // _LIBCPP_CONFIG_SITE >> >> Modified: libcxx/trunk/include/__threading_support >> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/_ >> _threading_support?rev=291275&r1=291274&r2=291275&view=diff >> ============================================================ >> ================== >> --- libcxx/trunk/include/__threading_support (original) >> +++ libcxx/trunk/include/__threading_support Fri Jan 6 14:05:40 2017 >> @@ -17,39 +17,17 @@ >> #pragma GCC system_header >> #endif >> >> -#ifndef _LIBCPP_HAS_NO_THREADS >> - >> -#ifndef __libcpp_has_include >> - #ifndef __has_include >> - #define __libcpp_has_include(x) 0 >> - #else >> - #define __libcpp_has_include(x) __has_include(x) >> - #endif >> -#endif >> - >> -#if defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) && \ >> - !__libcpp_has_include(<__external_threading>) >> -// If the <__external_threading> header is absent, build libc++ against a >> -// pthread-oriented thread api but leave out its implementation. This >> setup >> -// allows building+testing of an externally-threaded library variant (on >> any >> -// platform that supports pthreads). Here, an 'externally-threaded' >> library >> -// variant is one where the implementation of the libc++ thread api is >> provided >> -// as a separate library. >> -#define _LIBCPP_HAS_THREAD_API_EXTERNAL_PTHREAD >> -#endif >> - >> -#if defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) && \ >> - __libcpp_has_include(<__external_threading>) >> -#include <__external_threading> >> -#else >> +#if defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) >> +# include <__external_threading> >> +#elif !defined(_LIBCPP_HAS_NO_THREADS) >> >> -#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) || \ >> - defined(_LIBCPP_HAS_THREAD_API_EXTERNAL_PTHREAD) >> -#include <pthread.h> >> -#include <sched.h> >> +#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) >> +# include <pthread.h> >> +# include <sched.h> >> #endif >> >> -#if defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) >> +#if defined(_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) || \ >> + defined(_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL) >> #define _LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_FUNC_VIS >> #else >> #define _LIBCPP_THREAD_ABI_VISIBILITY inline _LIBCPP_INLINE_VISIBILITY >> @@ -57,8 +35,7 @@ >> >> _LIBCPP_BEGIN_NAMESPACE_STD >> >> -#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) || \ >> - defined(_LIBCPP_HAS_THREAD_API_EXTERNAL_PTHREAD) >> +#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) >> // Mutex >> typedef pthread_mutex_t __libcpp_mutex_t; >> #define _LIBCPP_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER >> @@ -175,8 +152,10 @@ void *__libcpp_tls_get(__libcpp_tls_key >> _LIBCPP_THREAD_ABI_VISIBILITY >> int __libcpp_tls_set(__libcpp_tls_key __key, void *__p); >> >> -#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) || \ >> - defined(_LIBCPP_BUILDING_THREAD_API_EXTERNAL_PTHREAD) >> +#if !defined(_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) || \ >> + defined(_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL) >> + >> +#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) >> >> int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m) >> { >> @@ -344,10 +323,10 @@ int __libcpp_tls_set(__libcpp_tls_key __ >> >> #endif // _LIBCPP_HAS_THREAD_API_PTHREAD >> >> -_LIBCPP_END_NAMESPACE_STD >> +#endif // !_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL || >> _LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL >> >> -#endif // !_LIBCPP_HAS_THREAD_API_EXTERNAL || !__libcpp_has_include(<__ >> external_threading>) >> +_LIBCPP_END_NAMESPACE_STD >> >> -#endif // _LIBCPP_HAS_NO_THREADS >> +#endif // !_LIBCPP_HAS_NO_THREADS >> >> #endif // _LIBCPP_THREADING_SUPPORT >> >> Modified: libcxx/trunk/lib/CMakeLists.txt >> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/lib/ >> CMakeLists.txt?rev=291275&r1=291274&r2=291275&view=diff >> ============================================================ >> ================== >> --- libcxx/trunk/lib/CMakeLists.txt (original) >> +++ libcxx/trunk/lib/CMakeLists.txt Fri Jan 6 14:05:40 2017 >> @@ -275,7 +275,7 @@ if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY) >> ) >> endif() >> >> -if (LIBCXX_HAS_EXTERNAL_THREAD_API) >> +if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY) >> file(GLOB LIBCXX_EXTERNAL_THREADING_SUPPORT_SOURCES >> ../test/support/external_threads.cpp) >> >> if (LIBCXX_ENABLE_SHARED) >> >> Modified: libcxx/trunk/test/CMakeLists.txt >> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/ >> CMakeLists.txt?rev=291275&r1=291274&r2=291275&view=diff >> ============================================================ >> ================== >> --- libcxx/trunk/test/CMakeLists.txt (original) >> +++ libcxx/trunk/test/CMakeLists.txt Fri Jan 6 14:05:40 2017 >> @@ -34,7 +34,7 @@ pythonize_bool(LIBCXXABI_ENABLE_SHARED) >> pythonize_bool(LIBCXXABI_USE_LLVM_UNWINDER) >> pythonize_bool(LIBCXX_HAS_ATOMIC_LIB) >> pythonize_bool(LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB) >> -pythonize_bool(LIBCXX_HAS_EXTERNAL_THREAD_API) >> +pythonize_bool(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY) >> >> # By default, for non-standalone builds, libcxx and libcxxabi share a >> library >> # directory. >> >> Modified: libcxx/trunk/test/lit.site.cfg.in >> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/lit. >> site.cfg.in?rev=291275&r1=291274&r2=291275&view=diff >> ============================================================ >> ================== >> --- libcxx/trunk/test/lit.site.cfg.in (original) >> +++ libcxx/trunk/test/lit.site.cfg.in Fri Jan 6 14:05:40 2017 >> @@ -28,7 +28,7 @@ config.has_libatomic = "@LIBC >> config.use_libatomic = "@LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB@" >> >> config.libcxxabi_shared = "@LIBCXXABI_ENABLE_SHARED@" >> -config.cxx_ext_threads = "@LIBCXX_HAS_EXTERNAL_THREAD_API@" >> +config.cxx_ext_threads = "@LIBCXX_BUILD_EXTERNAL_ >> THREAD_LIBRARY@" >> >> # Let the main config do the real work. >> config.loaded_site_config = True >> >> Modified: libcxx/trunk/test/support/external_threads.cpp >> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/ >> support/external_threads.cpp?rev=291275&r1=291274&r2=291275&view=diff >> ============================================================ >> ================== >> --- libcxx/trunk/test/support/external_threads.cpp (original) >> +++ libcxx/trunk/test/support/external_threads.cpp Fri Jan 6 14:05:40 >> 2017 >> @@ -6,5 +6,5 @@ >> // Source Licenses. See LICENSE.TXT for details. >> // >> //===------------------------------------------------------ >> ----------------===// >> -#define _LIBCPP_BUILDING_THREAD_API_EXTERNAL_PTHREAD >> +#define _LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL >> #include <__threading_support> >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits