Home | History | Annotate | Line # | Download | only in libsupc++
      1 // Implementation file for the -*- C++ -*- dynamic memory management header.
      2 
      3 // Copyright (C) 1996-2024 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 = std::nothrow_t{ };
     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