xref: /freebsd/contrib/llvm-project/libcxx/include/thread (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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
897a6dacacSDimitry Andric#include <__config>
907a6dacacSDimitry Andric
91*0fca6ea1SDimitry Andric#if !defined(_LIBCPP_HAS_NO_THREADS)
927a6dacacSDimitry Andric
9306c3fb27SDimitry Andric#  include <__thread/formatter.h>
945f757f3fSDimitry Andric#  include <__thread/jthread.h>
95*0fca6ea1SDimitry Andric#  include <__thread/support.h>
9606c3fb27SDimitry Andric#  include <__thread/this_thread.h>
9706c3fb27SDimitry Andric#  include <__thread/thread.h>
9804eeddc0SDimitry Andric#  include <version>
990b57cec5SDimitry Andric
10081ad6265SDimitry Andric// standard-mandated includes
101bdd1243dSDimitry Andric
102bdd1243dSDimitry Andric// [thread.syn]
10381ad6265SDimitry Andric#  include <compare>
10481ad6265SDimitry Andric
1050b57cec5SDimitry Andric#  if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1060b57cec5SDimitry Andric#    pragma GCC system_header
1070b57cec5SDimitry Andric#  endif
1080b57cec5SDimitry Andric
109*0fca6ea1SDimitry Andric#endif // !defined(_LIBCPP_HAS_NO_THREADS)
110*0fca6ea1SDimitry Andric
11106c3fb27SDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
11206c3fb27SDimitry Andric#  include <cstddef>
11306c3fb27SDimitry Andric#  include <ctime>
11406c3fb27SDimitry Andric#  include <iosfwd>
11506c3fb27SDimitry Andric#  include <ratio>
1160b57cec5SDimitry Andric#endif
1170b57cec5SDimitry Andric
118bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
119bdd1243dSDimitry Andric#  include <chrono>
120bdd1243dSDimitry Andric#endif
121bdd1243dSDimitry Andric
122bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
12306c3fb27SDimitry Andric#  include <cstring>
124bdd1243dSDimitry Andric#  include <functional>
12506c3fb27SDimitry Andric#  include <new>
12606c3fb27SDimitry Andric#  include <system_error>
12706c3fb27SDimitry Andric#  include <type_traits>
128bdd1243dSDimitry Andric#endif
129bdd1243dSDimitry Andric
1300b57cec5SDimitry Andric#endif // _LIBCPP_THREAD
131