OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-dev/] [fsf-gcc-snapshot-1-mar-12/] [or1k-gcc/] [libstdc++-v3/] [src/] [c++11/] [thread.cc] - Blame information for rev 783

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 742 jeremybenn
// thread -*- C++ -*-
2
 
3
// Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4
//
5
// This file is part of the GNU ISO C++ Library.  This library is free
6
// software; you can redistribute it and/or modify it under the
7
// terms of the GNU General Public License as published by the
8
// Free Software Foundation; either version 3, or (at your option)
9
// any later version.
10
 
11
// This library is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
// GNU General Public License for more details.
15
 
16
// Under Section 7 of GPL version 3, you are granted additional
17
// permissions described in the GCC Runtime Library Exception, version
18
// 3.1, as published by the Free Software Foundation.
19
 
20
// You should have received a copy of the GNU General Public License and
21
// a copy of the GCC Runtime Library Exception along with this program;
22
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23
// <http://www.gnu.org/licenses/>.
24
 
25
 
26
#include <thread>
27
#include <system_error>
28
#include <cerrno>
29
 
30
#if defined(_GLIBCXX_USE_GET_NPROCS)
31
# include <sys/sysinfo.h>
32
# define _GLIBCXX_NPROCS get_nprocs()
33
#elif defined(_GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP)
34
# define _GLIBCXX_NPROCS pthread_num_processors_np()
35
#elif defined(_GLIBCXX_USE_SYSCTL_HW_NCPU)
36
# include <stddef.h>
37
# include <sys/sysctl.h>
38
static inline int get_nprocs()
39
{
40
 int count;
41
 size_t size = sizeof(count);
42
 int mib[] = { CTL_HW, HW_NCPU };
43
 if (!sysctl(mib, 2, &count, &size, NULL, 0))
44
   return count;
45
 return 0;
46
}
47
# define _GLIBCXX_NPROCS get_nprocs()
48
#elif defined(_GLIBCXX_USE_SC_NPROCESSORS_ONLN)
49
# include <unistd.h>
50
# define _GLIBCXX_NPROCS sysconf(_SC_NPROCESSORS_ONLN)
51
#elif defined(_GLIBCXX_USE_SC_NPROC_ONLN)
52
# include <unistd.h>
53
# define _GLIBCXX_NPROCS sysconf(_SC_NPROC_ONLN)
54
#else
55
# define _GLIBCXX_NPROCS 0
56
#endif
57
 
58
#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
59
 
60
namespace std _GLIBCXX_VISIBILITY(default)
61
{
62
  namespace
63
  {
64
    extern "C" void*
65
    execute_native_thread_routine(void* __p)
66
    {
67
      thread::_Impl_base* __t = static_cast<thread::_Impl_base*>(__p);
68
      thread::__shared_base_type __local;
69
      __local.swap(__t->_M_this_ptr);
70
 
71
      __try
72
        {
73
          __t->_M_run();
74
        }
75
      __catch(...)
76
        {
77
          std::terminate();
78
        }
79
 
80
      return 0;
81
    }
82
  }
83
 
84
_GLIBCXX_BEGIN_NAMESPACE_VERSION
85
 
86
  void
87
  thread::join()
88
  {
89
    int __e = EINVAL;
90
 
91
    if (_M_id != id())
92
      __e = __gthread_join(_M_id._M_thread, 0);
93
 
94
    if (__e)
95
      __throw_system_error(__e);
96
 
97
    _M_id = id();
98
  }
99
 
100
  void
101
  thread::detach()
102
  {
103
    int __e = EINVAL;
104
 
105
    if (_M_id != id())
106
      __e = __gthread_detach(_M_id._M_thread);
107
 
108
    if (__e)
109
      __throw_system_error(__e);
110
 
111
    _M_id = id();
112
  }
113
 
114
  void
115
  thread::_M_start_thread(__shared_base_type __b)
116
  {
117
    if (!__gthread_active_p())
118
      __throw_system_error(int(errc::operation_not_permitted));
119
 
120
    __b->_M_this_ptr = __b;
121
    int __e = __gthread_create(&_M_id._M_thread,
122
                               &execute_native_thread_routine, __b.get());
123
    if (__e)
124
    {
125
      __b->_M_this_ptr.reset();
126
      __throw_system_error(__e);
127
    }
128
  }
129
 
130
  unsigned int
131
  thread::hardware_concurrency() noexcept
132
  {
133
    int __n = _GLIBCXX_NPROCS;
134
    if (__n < 0)
135
      __n = 0;
136
    return __n;
137
  }
138
 
139
_GLIBCXX_END_NAMESPACE_VERSION
140
} // namespace std
141
 
142
#endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.