blob: 992976500e5bd623bd18a494ac25cd819e2d608d [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001//===------------------------- thread.cpp----------------------------------===//
2//
Howard Hinnantc566dc32010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnantc51e1022010-05-11 19:42:16 +00004//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "thread"
11#include "exception"
Howard Hinnantd031c582010-05-25 17:25:25 +000012#include <sys/types.h>
Howard Hinnantc51e1022010-05-11 19:42:16 +000013#include <sys/sysctl.h>
14
15_LIBCPP_BEGIN_NAMESPACE_STD
16
17thread::~thread()
18{
Howard Hinnant155c2af2010-05-24 17:49:41 +000019 if (__t_ != 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +000020 terminate();
21}
22
23void
24thread::join()
25{
26 int ec = pthread_join(__t_, 0);
Howard Hinnant72f73582010-08-11 17:04:31 +000027#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +000028 if (ec)
29 throw system_error(error_code(ec, system_category()), "thread::join failed");
Howard Hinnantffb308e2010-08-22 00:03:27 +000030#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant155c2af2010-05-24 17:49:41 +000031 __t_ = 0;
Howard Hinnantc51e1022010-05-11 19:42:16 +000032}
33
34void
35thread::detach()
36{
37 int ec = EINVAL;
38 if (__t_ != 0)
39 {
40 ec = pthread_detach(__t_);
41 if (ec == 0)
42 __t_ = 0;
43 }
Howard Hinnant72f73582010-08-11 17:04:31 +000044#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +000045 if (ec)
46 throw system_error(error_code(ec, system_category()), "thread::detach failed");
Howard Hinnantffb308e2010-08-22 00:03:27 +000047#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +000048}
49
50unsigned
51thread::hardware_concurrency()
52{
Howard Hinnant155c2af2010-05-24 17:49:41 +000053#if defined(CTL_HW) && defined(HW_NCPU)
Howard Hinnantc51e1022010-05-11 19:42:16 +000054 int n;
55 int mib[2] = {CTL_HW, HW_NCPU};
56 std::size_t s = sizeof(n);
57 sysctl(mib, 2, &n, &s, 0, 0);
58 return n;
Howard Hinnantffb308e2010-08-22 00:03:27 +000059#else // defined(CTL_HW) && defined(HW_NCPU)
Howard Hinnant155c2af2010-05-24 17:49:41 +000060 // TODO: grovel through /proc or check cpuid on x86 and similar
61 // instructions on other architectures.
62 return 0; // Means not computable [thread.thread.static]
Howard Hinnantffb308e2010-08-22 00:03:27 +000063#endif // defined(CTL_HW) && defined(HW_NCPU)
Howard Hinnantc51e1022010-05-11 19:42:16 +000064}
65
66namespace this_thread
67{
68
69void
70sleep_for(const chrono::nanoseconds& ns)
71{
72 using namespace chrono;
73 if (ns >= nanoseconds::zero())
74 {
75 timespec ts;
76 ts.tv_sec = static_cast<decltype(ts.tv_sec)>(duration_cast<seconds>(ns).count());
77 ts.tv_nsec = static_cast<decltype(ts.tv_nsec)>((ns - seconds(ts.tv_sec)).count());
78 nanosleep(&ts, 0);
79 }
80}
81
82} // this_thread
83
84_LIBCPP_END_NAMESPACE_STD