]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/src/c++11/condition_variable.cc
Daily bump.
[thirdparty/gcc.git] / libstdc++-v3 / src / c++11 / condition_variable.cc
CommitLineData
88399079 1// condition_variable -*- C++ -*-
68a97d24 2
aa118a03 3// Copyright (C) 2008-2014 Free Software Foundation, Inc.
68a97d24
BK
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
748086b7 8// Free Software Foundation; either version 3, or (at your option)
68a97d24
BK
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
748086b7
JJ
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/>.
68a97d24
BK
24
25#include <condition_variable>
26
7b800287
CF
27#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
28
12ffa228
BK
29namespace std _GLIBCXX_VISIBILITY(default)
30{
31_GLIBCXX_BEGIN_NAMESPACE_VERSION
53dc5044 32
7b800287 33#ifdef __GTHREAD_COND_INIT
0fd72195 34 condition_variable::condition_variable() noexcept = default;
7b800287 35#else
b81e920e
JW
36 condition_variable::condition_variable() noexcept
37 {
b59cbd50 38 __GTHREAD_COND_INIT_FUNCTION(&_M_cond);
68a97d24 39 }
2942db63 40#endif
68a97d24 41
b81e920e 42 condition_variable::~condition_variable() noexcept
68a97d24 43 {
68a97d24 44 // XXX no thread blocked
7b800287 45 /* int __e = */ __gthread_cond_destroy(&_M_cond);
68a97d24 46 // if __e == EBUSY then blocked
68a97d24
BK
47 }
48
7b800287
CF
49 void
50 condition_variable::wait(unique_lock<mutex>& __lock)
51 {
52 int __e = __gthread_cond_wait(&_M_cond, __lock.mutex()->native_handle());
53
54 if (__e)
d5cf2021 55 __throw_system_error(__e);
7b800287 56 }
d5cf2021
BK
57
58 void
b81e920e 59 condition_variable::notify_one() noexcept
d5cf2021 60 {
7b800287 61 int __e = __gthread_cond_signal(&_M_cond);
68a97d24
BK
62
63 // XXX not in spec
64 // EINVAL
7b800287 65 if (__e)
68a97d24 66 __throw_system_error(__e);
68a97d24
BK
67 }
68
d5cf2021 69 void
b81e920e 70 condition_variable::notify_all() noexcept
d5cf2021 71 {
7b800287 72 int __e = __gthread_cond_broadcast(&_M_cond);
68a97d24
BK
73
74 // XXX not in spec
75 // EINVAL
7b800287 76 if (__e)
68a97d24 77 __throw_system_error(__e);
68a97d24
BK
78 }
79
12ffa228
BK
80_GLIBCXX_END_NAMESPACE_VERSION
81} // namespace
68a97d24 82
7b800287 83#endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1