xref: /freebsd/contrib/llvm-project/libcxx/include/thread (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_THREAD
110b57cec5SDimitry Andric#define _LIBCPP_THREAD
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric
150b57cec5SDimitry Andric    thread synopsis
160b57cec5SDimitry Andric
170b57cec5SDimitry Andricnamespace std
180b57cec5SDimitry Andric{
190b57cec5SDimitry Andric
200b57cec5SDimitry Andricclass thread
210b57cec5SDimitry Andric{
220b57cec5SDimitry Andricpublic:
230b57cec5SDimitry Andric    class id;
240b57cec5SDimitry Andric    typedef pthread_t native_handle_type;
250b57cec5SDimitry Andric
260b57cec5SDimitry Andric    thread() noexcept;
270b57cec5SDimitry Andric    template <class F, class ...Args> explicit thread(F&& f, Args&&... args);
280b57cec5SDimitry Andric    ~thread();
290b57cec5SDimitry Andric
300b57cec5SDimitry Andric    thread(const thread&) = delete;
310b57cec5SDimitry Andric    thread(thread&& t) noexcept;
320b57cec5SDimitry Andric
330b57cec5SDimitry Andric    thread& operator=(const thread&) = delete;
340b57cec5SDimitry Andric    thread& operator=(thread&& t) noexcept;
350b57cec5SDimitry Andric
360b57cec5SDimitry Andric    void swap(thread& t) noexcept;
370b57cec5SDimitry Andric
380b57cec5SDimitry Andric    bool joinable() const noexcept;
390b57cec5SDimitry Andric    void join();
400b57cec5SDimitry Andric    void detach();
410b57cec5SDimitry Andric    id get_id() const noexcept;
420b57cec5SDimitry Andric    native_handle_type native_handle();
430b57cec5SDimitry Andric
440b57cec5SDimitry Andric    static unsigned hardware_concurrency() noexcept;
450b57cec5SDimitry Andric};
460b57cec5SDimitry Andric
470b57cec5SDimitry Andricvoid swap(thread& x, thread& y) noexcept;
480b57cec5SDimitry Andric
490b57cec5SDimitry Andricclass thread::id
500b57cec5SDimitry Andric{
510b57cec5SDimitry Andricpublic:
520b57cec5SDimitry Andric    id() noexcept;
530b57cec5SDimitry Andric};
540b57cec5SDimitry Andric
550b57cec5SDimitry Andricbool operator==(thread::id x, thread::id y) noexcept;
56bdd1243dSDimitry Andricbool operator!=(thread::id x, thread::id y) noexcept;             // removed in C++20
57bdd1243dSDimitry Andricbool operator< (thread::id x, thread::id y) noexcept;             // removed in C++20
58bdd1243dSDimitry Andricbool operator<=(thread::id x, thread::id y) noexcept;             // removed in C++20
59bdd1243dSDimitry Andricbool operator> (thread::id x, thread::id y) noexcept;             // removed in C++20
60bdd1243dSDimitry Andricbool operator>=(thread::id x, thread::id y) noexcept;             // removed in C++20
61bdd1243dSDimitry Andricstrong_ordering operator<=>(thread::id x, thread::id y) noexcept; // C++20
620b57cec5SDimitry Andric
630b57cec5SDimitry Andrictemplate<class charT, class traits>
640b57cec5SDimitry Andricbasic_ostream<charT, traits>&
650b57cec5SDimitry Andricoperator<<(basic_ostream<charT, traits>& out, thread::id id);
660b57cec5SDimitry Andric
6706c3fb27SDimitry Andrictemplate<class charT>
6806c3fb27SDimitry Andricstruct formatter<thread::id, charT>;
6906c3fb27SDimitry Andric
700b57cec5SDimitry Andricnamespace this_thread
710b57cec5SDimitry Andric{
720b57cec5SDimitry Andric
730b57cec5SDimitry Andricthread::id get_id() noexcept;
740b57cec5SDimitry Andric
750b57cec5SDimitry Andricvoid yield() noexcept;
760b57cec5SDimitry Andric
770b57cec5SDimitry Andrictemplate <class Clock, class Duration>
780b57cec5SDimitry Andricvoid sleep_until(const chrono::time_point<Clock, Duration>& abs_time);
790b57cec5SDimitry Andric
800b57cec5SDimitry Andrictemplate <class Rep, class Period>
810b57cec5SDimitry Andricvoid sleep_for(const chrono::duration<Rep, Period>& rel_time);
820b57cec5SDimitry Andric
830b57cec5SDimitry Andric}  // this_thread
840b57cec5SDimitry Andric
850b57cec5SDimitry Andric}  // std
860b57cec5SDimitry Andric
870b57cec5SDimitry Andric*/
880b57cec5SDimitry Andric
8981ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
9006c3fb27SDimitry Andric#include <__availability>
910b57cec5SDimitry Andric#include <__config>
9206c3fb27SDimitry Andric#include <__thread/formatter.h>
93*5f757f3fSDimitry Andric#include <__thread/jthread.h>
9406c3fb27SDimitry Andric#include <__thread/this_thread.h>
9506c3fb27SDimitry Andric#include <__thread/thread.h>
96fe6060f1SDimitry Andric#include <__threading_support>
9704eeddc0SDimitry Andric#include <version>
980b57cec5SDimitry Andric
9981ad6265SDimitry Andric// standard-mandated includes
100bdd1243dSDimitry Andric
101bdd1243dSDimitry Andric// [thread.syn]
10281ad6265SDimitry Andric#include <compare>
10381ad6265SDimitry Andric
1040b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1050b57cec5SDimitry Andric#  pragma GCC system_header
1060b57cec5SDimitry Andric#endif
1070b57cec5SDimitry Andric
1080b57cec5SDimitry Andric#ifdef _LIBCPP_HAS_NO_THREADS
10981ad6265SDimitry Andric# error "<thread> is not supported since libc++ has been configured without support for threads."
11081ad6265SDimitry Andric#endif
1110b57cec5SDimitry Andric
11206c3fb27SDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
11306c3fb27SDimitry Andric#  include <cstddef>
11406c3fb27SDimitry Andric#  include <ctime>
11506c3fb27SDimitry Andric#  include <iosfwd>
11606c3fb27SDimitry Andric#  include <ratio>
1170b57cec5SDimitry Andric#endif
1180b57cec5SDimitry Andric
119bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
120bdd1243dSDimitry Andric#  include <chrono>
121bdd1243dSDimitry Andric#endif
122bdd1243dSDimitry Andric
123bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
12406c3fb27SDimitry Andric#  include <cstring>
125bdd1243dSDimitry Andric#  include <functional>
12606c3fb27SDimitry Andric#  include <new>
12706c3fb27SDimitry Andric#  include <system_error>
12806c3fb27SDimitry Andric#  include <type_traits>
129bdd1243dSDimitry Andric#endif
130bdd1243dSDimitry Andric
1310b57cec5SDimitry Andric#endif // _LIBCPP_THREAD
132