Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. // condition_variable -*- C++ -*-
  2.  
  3. // Copyright (C) 2008-2013 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. #include <condition_variable>
  26.  
  27. #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
  28.  
  29. namespace std _GLIBCXX_VISIBILITY(default)
  30. {
  31. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  32.  
  33. #ifdef __GTHREAD_COND_INIT
  34.   condition_variable::condition_variable() noexcept = default;
  35. #else
  36.   condition_variable::condition_variable() noexcept
  37.   {
  38.     __GTHREAD_COND_INIT_FUNCTION(&_M_cond);
  39.   }
  40. #endif
  41.  
  42.   condition_variable::~condition_variable() noexcept
  43.   {
  44.     // XXX no thread blocked
  45.     /* int __e = */ __gthread_cond_destroy(&_M_cond);
  46.     // if __e == EBUSY then blocked
  47.   }
  48.  
  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)
  55.       __throw_system_error(__e);
  56.   }
  57.  
  58.   void
  59.   condition_variable::notify_one() noexcept
  60.   {
  61.     int __e = __gthread_cond_signal(&_M_cond);
  62.  
  63.     // XXX not in spec
  64.     // EINVAL
  65.     if (__e)
  66.       __throw_system_error(__e);
  67.   }
  68.  
  69.   void
  70.   condition_variable::notify_all() noexcept
  71.   {
  72.     int __e = __gthread_cond_broadcast(&_M_cond);
  73.  
  74.     // XXX not in spec
  75.     // EINVAL
  76.     if (__e)
  77.       __throw_system_error(__e);
  78.   }
  79.  
  80.   condition_variable_any::condition_variable_any() noexcept = default;
  81.  
  82.   condition_variable_any::~condition_variable_any() noexcept = default;
  83.  
  84. _GLIBCXX_END_NAMESPACE_VERSION
  85. } // namespace
  86.  
  87. #endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1
  88.