Subversion Repositories Kolibri OS

Rev

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

  1. // <atomic> compatibility -*- 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 "gstdint.h"
  26. #include <atomic>
  27. #include <mutex>
  28.  
  29. // XXX GLIBCXX_ABI Deprecated
  30. // gcc-4.7.0
  31.  
  32. #ifdef _GLIBCXX_SHARED
  33.  
  34. #define LOGSIZE 4
  35.  
  36. namespace
  37. {
  38. #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
  39.   std::mutex&
  40.   get_atomic_mutex()
  41.   {
  42.     static std::mutex atomic_mutex;
  43.     return atomic_mutex;
  44.   }
  45. #endif
  46.  
  47.   std::__atomic_flag_base flag_table[ 1 << LOGSIZE ] =
  48.     {
  49.       ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT,
  50.       ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT,
  51.       ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT,
  52.       ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT,
  53.     };
  54. } // anonymous namespace
  55.  
  56. namespace std _GLIBCXX_VISIBILITY(default)
  57. {
  58. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  59.  
  60.   namespace __atomic0
  61.   {
  62.  
  63.     struct atomic_flag : public __atomic_flag_base
  64.     {
  65.      bool
  66.      test_and_set(memory_order) noexcept;
  67.      
  68.      void
  69.      clear(memory_order) noexcept;
  70.     };
  71.  
  72.     bool
  73.     atomic_flag::test_and_set(memory_order) noexcept
  74.     {
  75. #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
  76.       lock_guard<mutex> __lock(get_atomic_mutex());
  77. #endif
  78.       bool result = _M_i;
  79.       _M_i = true;
  80.       return result;
  81.     }
  82.  
  83.     void
  84.     atomic_flag::clear(memory_order) noexcept
  85.     {
  86. #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
  87.       lock_guard<mutex> __lock(get_atomic_mutex());
  88. #endif
  89.       _M_i = false;
  90.     }
  91.   } // namespace __atomic0
  92.  
  93.   _GLIBCXX_BEGIN_EXTERN_C
  94.  
  95.   bool
  96.   atomic_flag_test_and_set_explicit(__atomic_flag_base* __a,
  97.                                     memory_order __m) _GLIBCXX_NOTHROW
  98.   {
  99.     atomic_flag* d = static_cast<atomic_flag*>(__a);
  100.     return d->test_and_set(__m);
  101.   }
  102.  
  103.   void
  104.   atomic_flag_clear_explicit(__atomic_flag_base* __a,
  105.                              memory_order __m) _GLIBCXX_NOTHROW
  106.   {
  107.     atomic_flag* d = static_cast<atomic_flag*>(__a);
  108.     return d->clear(__m);
  109.   }
  110.  
  111.   void
  112.   __atomic_flag_wait_explicit(__atomic_flag_base* __a,
  113.                               memory_order __x) _GLIBCXX_NOTHROW
  114.   {
  115.     while (atomic_flag_test_and_set_explicit(__a, __x))
  116.       { };
  117.   }
  118.  
  119.   _GLIBCXX_CONST __atomic_flag_base*
  120.   __atomic_flag_for_address(const volatile void* __z) _GLIBCXX_NOTHROW
  121.   {
  122.     uintptr_t __u = reinterpret_cast<uintptr_t>(__z);
  123.     __u += (__u >> 2) + (__u << 4);
  124.     __u += (__u >> 7) + (__u << 5);
  125.     __u += (__u >> 17) + (__u << 13);
  126.     if (sizeof(uintptr_t) > 4)
  127.       __u += (__u >> 31);
  128.     __u &= ~((~uintptr_t(0)) << LOGSIZE);
  129.     return flag_table + __u;
  130.   }
  131.  
  132.   _GLIBCXX_END_EXTERN_C
  133.  
  134. _GLIBCXX_END_NAMESPACE_VERSION
  135. } // namespace std
  136.  
  137. #endif
  138.  
  139. // XXX GLIBCXX_ABI Deprecated
  140. // gcc-4.5.0
  141. // <atomic> signature changes
  142.  
  143. // The rename syntax for default exported names is
  144. //   asm (".symver name1,exportedname@GLIBCXX_3.4")
  145. //   asm (".symver name2,exportedname@@GLIBCXX_3.4.5")
  146. // In the future, GLIBCXX_ABI > 6 should remove all uses of
  147. // _GLIBCXX_*_SYMVER macros in this file.
  148.  
  149. #if defined(_GLIBCXX_SYMVER_GNU) && defined(_GLIBCXX_SHARED) \
  150.     && defined(_GLIBCXX_HAVE_AS_SYMVER_DIRECTIVE) \
  151.     && defined(_GLIBCXX_HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT)
  152.  
  153. #define _GLIBCXX_ASM_SYMVER(cur, old, version) \
  154.    asm (".symver " #cur "," #old "@@" #version);
  155.  
  156. _GLIBCXX_ASM_SYMVER(_ZNSt9__atomic011atomic_flag5clearESt12memory_order, _ZNVSt9__atomic011atomic_flag5clearESt12memory_order, GLIBCXX_3.4.11)
  157.  
  158. _GLIBCXX_ASM_SYMVER(_ZNSt9__atomic011atomic_flag12test_and_setESt12memory_order, _ZNVSt9__atomic011atomic_flag12test_and_setESt12memory_order, GLIBCXX_3.4.11)
  159.  
  160. #endif
  161.