Eric Fiselier | 66134e8 | 2017-01-06 20:05:40 +0000 | [diff] [blame] | 1 | ===================== |
| 2 | Threading Support API |
| 3 | ===================== |
| 4 | |
| 5 | .. contents:: |
| 6 | :local: |
| 7 | |
| 8 | Overview |
| 9 | ======== |
| 10 | |
| 11 | Libc++ supports using multiple different threading models and configurations |
| 12 | to implement the threading parts of libc++, including ``<thread>`` and ``<mutex>``. |
| 13 | These different models provide entirely different interfaces from each |
| 14 | other. To address this libc++ wraps the underlying threading API in a new and |
| 15 | consistent API, which it uses internally to implement threading primitives. |
| 16 | |
| 17 | The ``<__threading_support>`` header is where libc++ defines its internal |
| 18 | threading interface. It contains forward declarations of the internal threading |
| 19 | interface as well as definitions for the interface. |
| 20 | |
| 21 | External Threading API and the ``<__external_threading>`` header |
| 22 | ================================================================ |
| 23 | |
| 24 | In order to support vendors with custom threading API's libc++ allows the |
| 25 | entire internal threading interface to be provided by an external, |
| 26 | vendor provided, header. |
| 27 | |
| 28 | When ``_LIBCPP_HAS_THREAD_API_EXTERNAL`` is defined the ``<__threading_support>`` |
| 29 | header simply forwards to the ``<__external_threading>`` header (which must exist). |
| 30 | It is expected that the ``<__external_threading>`` header provide the exact |
| 31 | interface normally provided by ``<__threading_support>``. |
| 32 | |
| 33 | External Threading Library |
| 34 | ========================== |
| 35 | |
Asiri Rathnayake | 49a9e0c | 2017-01-16 12:44:08 +0000 | [diff] [blame] | 36 | libc++ can be compiled with its internal threading API delegating to an external |
| 37 | library. Such a configuration is useful for library vendors who wish to |
| 38 | distribute a thread-agnostic libc++ library, where the users of the library are |
| 39 | expected to provide the implementation of the libc++ internal threading API. |
Eric Fiselier | 66134e8 | 2017-01-06 20:05:40 +0000 | [diff] [blame] | 40 | |
Asiri Rathnayake | 49a9e0c | 2017-01-16 12:44:08 +0000 | [diff] [blame] | 41 | On a production setting, this would be achieved through a custom |
| 42 | ``<__external_threading>`` header, which declares the libc++ internal threading |
| 43 | API but leaves out the implementation. |
| 44 | |
| 45 | The ``-DLIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY`` option allows building libc++ in |
| 46 | such a configuration while allowing it to be tested on a platform that supports |
| 47 | any of the threading systems (e.g. pthread) supported in ``__threading_support`` |
| 48 | header. Therefore, the main purpose of this option is to allow testing of this |
| 49 | particular configuration of the library without being tied to a vendor-specific |
| 50 | threading system. This option is only meant to be used by libc++ library |
| 51 | developers. |
Eric Fiselier | 66134e8 | 2017-01-06 20:05:40 +0000 | [diff] [blame] | 52 | |
| 53 | Threading Configuration Macros |
| 54 | ============================== |
| 55 | |
| 56 | **_LIBCPP_HAS_NO_THREADS** |
| 57 | This macro is defined when libc++ is built without threading support. It |
| 58 | should not be manually defined by the user. |
| 59 | |
| 60 | **_LIBCPP_HAS_THREAD_API_EXTERNAL** |
| 61 | This macro is defined when libc++ should use the ``<__external_threading>`` |
| 62 | header to provide the internal threading API. This macro overrides |
| 63 | ``_LIBCPP_HAS_THREAD_API_PTHREAD``. |
| 64 | |
| 65 | **_LIBCPP_HAS_THREAD_API_PTHREAD** |
| 66 | This macro is defined when libc++ should use POSIX threads to implement the |
| 67 | internal threading API. |
| 68 | |
Martin Storsjo | 16eb426 | 2018-01-05 20:48:29 +0000 | [diff] [blame] | 69 | **_LIBCPP_HAS_THREAD_API_WIN32** |
| 70 | This macro is defined when libc++ should use Win32 threads to implement the |
| 71 | internal threading API. |
| 72 | |
Eric Fiselier | 66134e8 | 2017-01-06 20:05:40 +0000 | [diff] [blame] | 73 | **_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL** |
| 74 | This macro is defined when libc++ expects the definitions of the internal |
| 75 | threading API to be provided by an external library. When defined |
| 76 | ``<__threading_support>`` will only provide the forward declarations and |
| 77 | typedefs for the internal threading API. |
| 78 | |
| 79 | **_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL** |
| 80 | This macro is used to build an external threading library using the |
| 81 | ``<__threading_support>``. Specifically it exposes the threading API |
| 82 | definitions in ``<__threading_support>`` as non-inline definitions meant to |
| 83 | be compiled into a library. |