[libcxx] r291275 - [libc++] Cleanup and document <__threading_support>

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 6 15:53:47 PST 2017


Thanks!

On Fri, Jan 6, 2017 at 3:26 PM Eric Fiselier <eric at efcs.ca> wrote:

> Should be fixed in r291298. Sorry for the breakage.
>
> /Eric
>
> On Fri, Jan 6, 2017 at 4:18 PM, Eric Fiselier <eric at efcs.ca> wrote:
>
> Hi David,
>
> Thanks for the information. Looking into it now.
>
> /Eric
>
> On Fri, Jan 6, 2017 at 4:02 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
>
> On Fri, Jan 6, 2017 at 12:16 PM Eric Fiselier via cfe-commits <
> cfe-commits at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170106/7aaa4979/attachment-0001.html>


More information about the cfe-commits mailing list