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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libstdc++-v3/] [include/] [std/] [thread] - Blame information for rev 742

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 742 jeremybenn
//  -*- 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
// .
24
 
25
/** @file include/thread
26
 *  This is a Standard C++ Library header.
27
 */
28
 
29
#ifndef _GLIBCXX_THREAD
30
#define _GLIBCXX_THREAD 1
31
 
32
#pragma GCC system_header
33
 
34
#ifndef __GXX_EXPERIMENTAL_CXX0X__
35
# include 
36
#else
37
 
38
#include 
39
#include 
40
#include 
41
#include 
42
#include 
43
#include 
44
 
45
#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
46
 
47
namespace std _GLIBCXX_VISIBILITY(default)
48
{
49
_GLIBCXX_BEGIN_NAMESPACE_VERSION
50
 
51
  /**
52
   * @defgroup threads Threads
53
   * @ingroup concurrency
54
   *
55
   * Classes for thread support.
56
   * @{
57
   */
58
 
59
  /// thread
60
  class thread
61
  {
62
  public:
63
    typedef __gthread_t                 native_handle_type;
64
    struct _Impl_base;
65
    typedef shared_ptr<_Impl_base>  __shared_base_type;
66
 
67
    /// thread::id
68
    class id
69
    {
70
      native_handle_type        _M_thread;
71
 
72
    public:
73
      id() noexcept : _M_thread() { }
74
 
75
      explicit
76
      id(native_handle_type __id) : _M_thread(__id) { }
77
 
78
    private:
79
      friend class thread;
80
      friend class hash;
81
 
82
      friend bool
83
      operator==(thread::id __x, thread::id __y) noexcept
84
      { return __gthread_equal(__x._M_thread, __y._M_thread); }
85
 
86
      friend bool
87
      operator<(thread::id __x, thread::id __y) noexcept
88
      { return __x._M_thread < __y._M_thread; }
89
 
90
      template
91
        friend basic_ostream<_CharT, _Traits>&
92
        operator<<(basic_ostream<_CharT, _Traits>& __out, thread::id __id);
93
    };
94
 
95
    // Simple base type that the templatized, derived class containing
96
    // an arbitrary functor can be converted to and called.
97
    struct _Impl_base
98
    {
99
      __shared_base_type        _M_this_ptr;
100
 
101
      inline virtual ~_Impl_base();
102
 
103
      virtual void _M_run() = 0;
104
    };
105
 
106
    template
107
      struct _Impl : public _Impl_base
108
      {
109
        _Callable               _M_func;
110
 
111
        _Impl(_Callable&& __f) : _M_func(std::forward<_Callable>(__f))
112
        { }
113
 
114
        void
115
        _M_run() { _M_func(); }
116
      };
117
 
118
  private:
119
    id                          _M_id;
120
 
121
  public:
122
    thread() noexcept = default;
123
    thread(thread&) = delete;
124
    thread(const thread&) = delete;
125
 
126
    thread(thread&& __t) noexcept
127
    { swap(__t); }
128
 
129
    template
130
      explicit
131
      thread(_Callable&& __f, _Args&&... __args)
132
      {
133
        _M_start_thread(_M_make_routine(std::__bind_simple(
134
                std::forward<_Callable>(__f),
135
                std::forward<_Args>(__args)...)));
136
      }
137
 
138
    ~thread()
139
    {
140
      if (joinable())
141
        std::terminate();
142
    }
143
 
144
    thread& operator=(const thread&) = delete;
145
 
146
    thread& operator=(thread&& __t) noexcept
147
    {
148
      if (joinable())
149
        std::terminate();
150
      swap(__t);
151
      return *this;
152
    }
153
 
154
    void
155
    swap(thread& __t) noexcept
156
    { std::swap(_M_id, __t._M_id); }
157
 
158
    bool
159
    joinable() const noexcept
160
    { return !(_M_id == id()); }
161
 
162
    void
163
    join();
164
 
165
    void
166
    detach();
167
 
168
    thread::id
169
    get_id() const noexcept
170
    { return _M_id; }
171
 
172
    /** @pre thread is joinable
173
     */
174
    native_handle_type
175
    native_handle()
176
    { return _M_id._M_thread; }
177
 
178
    // Returns a value that hints at the number of hardware thread contexts.
179
    static unsigned int
180
    hardware_concurrency() noexcept;
181
 
182
  private:
183
    void
184
    _M_start_thread(__shared_base_type);
185
 
186
    template
187
      shared_ptr<_Impl<_Callable>>
188
      _M_make_routine(_Callable&& __f)
189
      {
190
        // Create and allocate full data structure, not base.
191
        return make_shared<_Impl<_Callable>>(std::forward<_Callable>(__f));
192
      }
193
  };
194
 
195
  inline thread::_Impl_base::~_Impl_base() = default;
196
 
197
  inline void
198
  swap(thread& __x, thread& __y) noexcept
199
  { __x.swap(__y); }
200
 
201
  inline bool
202
  operator!=(thread::id __x, thread::id __y) noexcept
203
  { return !(__x == __y); }
204
 
205
  inline bool
206
  operator<=(thread::id __x, thread::id __y) noexcept
207
  { return !(__y < __x); }
208
 
209
  inline bool
210
  operator>(thread::id __x, thread::id __y) noexcept
211
  { return __y < __x; }
212
 
213
  inline bool
214
  operator>=(thread::id __x, thread::id __y) noexcept
215
  { return !(__x < __y); }
216
 
217
  // DR 889.
218
  /// std::hash specialization for thread::id.
219
  template<>
220
    struct hash
221
    : public __hash_base
222
    {
223
      size_t
224
      operator()(const thread::id& __id) const noexcept
225
      { return std::_Hash_impl::hash(__id._M_thread); }
226
    };
227
 
228
  template
229
    inline basic_ostream<_CharT, _Traits>&
230
    operator<<(basic_ostream<_CharT, _Traits>& __out, thread::id __id)
231
    {
232
      if (__id == thread::id())
233
        return __out << "thread::id of a non-executing thread";
234
      else
235
        return __out << __id._M_thread;
236
    }
237
 
238
_GLIBCXX_END_NAMESPACE_VERSION
239
 
240
  /** @namespace std::this_thread
241
   *  @brief ISO C++ 0x entities sub namespace for thread.
242
   *  30.2.2 Namespace this_thread.
243
   */
244
  namespace this_thread
245
  {
246
  _GLIBCXX_BEGIN_NAMESPACE_VERSION
247
 
248
    /// get_id
249
    inline thread::id
250
    get_id() noexcept { return thread::id(__gthread_self()); }
251
 
252
#ifdef _GLIBCXX_USE_SCHED_YIELD
253
    /// yield
254
    inline void
255
    yield() noexcept
256
    { __gthread_yield(); }
257
#endif
258
 
259
#ifdef _GLIBCXX_USE_NANOSLEEP
260
    /// sleep_for
261
    template
262
      inline void
263
      sleep_for(const chrono::duration<_Rep, _Period>& __rtime)
264
      {
265
        chrono::seconds __s =
266
          chrono::duration_cast(__rtime);
267
 
268
        chrono::nanoseconds __ns =
269
          chrono::duration_cast(__rtime - __s);
270
 
271
        __gthread_time_t __ts =
272
          {
273
            static_cast(__s.count()),
274
            static_cast(__ns.count())
275
          };
276
 
277
        ::nanosleep(&__ts, 0);
278
      }
279
 
280
    /// sleep_until
281
    template
282
      inline void
283
      sleep_until(const chrono::time_point<_Clock, _Duration>& __atime)
284
      { sleep_for(__atime - _Clock::now()); }
285
#endif
286
 
287
  _GLIBCXX_END_NAMESPACE_VERSION
288
  }
289
 
290
  // @} group threads
291
 
292
} // namespace
293
 
294
#endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1
295
 
296
#endif // __GXX_EXPERIMENTAL_CXX0X__
297
 
298
#endif // _GLIBCXX_THREAD

powered by: WebSVN 2.1.0

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