Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. // Implementation file for the -*- C++ -*- dynamic memory management header.
  2.  
  3. // Copyright (C) 1996-2015 Free Software Foundation, Inc.
  4. //
  5. // This file is part of GCC.
  6. //
  7. // GCC is free software; you can redistribute it and/or modify
  8. // it under the terms of the GNU General Public License as published by
  9. // the Free Software Foundation; either version 3, or (at your option)
  10. // any later version.
  11. //
  12. // GCC is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. // GNU General Public License for more details.
  16. //
  17. // Under Section 7 of GPL version 3, you are granted additional
  18. // permissions described in the GCC Runtime Library Exception, version
  19. // 3.1, as published by the Free Software Foundation.
  20.  
  21. // You should have received a copy of the GNU General Public License and
  22. // a copy of the GCC Runtime Library Exception along with this program;
  23. // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  24. // <http://www.gnu.org/licenses/>.
  25.  
  26. #include "new"
  27. #include <bits/atomic_lockfree_defines.h>
  28.  
  29. #if ATOMIC_POINTER_LOCK_FREE < 2
  30. #include <ext/concurrence.h>
  31. namespace
  32. {
  33.   __gnu_cxx::__mutex mx;
  34. }
  35. #endif
  36.  
  37. const std::nothrow_t std::nothrow = { };
  38.  
  39. using std::new_handler;
  40. namespace
  41. {
  42.   new_handler __new_handler;
  43. }
  44.  
  45. new_handler
  46. std::set_new_handler (new_handler handler) throw()
  47. {
  48.   new_handler prev_handler;
  49. #if ATOMIC_POINTER_LOCK_FREE > 1
  50.   __atomic_exchange (&__new_handler, &handler, &prev_handler,
  51.                      __ATOMIC_ACQ_REL);
  52. #else
  53.   __gnu_cxx::__scoped_lock l(mx);
  54.   prev_handler = __new_handler;
  55.   __new_handler = handler;
  56. #endif
  57.   return prev_handler;
  58. }
  59.  
  60. new_handler
  61. std::get_new_handler () noexcept
  62. {
  63.   new_handler handler;
  64. #if ATOMIC_POINTER_LOCK_FREE > 1
  65.   __atomic_load (&__new_handler, &handler, __ATOMIC_ACQUIRE);
  66. #else
  67.   __gnu_cxx::__scoped_lock l(mx);
  68.   handler = __new_handler;
  69. #endif
  70.   return handler;
  71. }
  72.