1 // Copyright (C) 2011 The Android Open Source Project 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions 6 // are met: 7 // 1. Redistributions of source code must retain the above copyright 8 // notice, this list of conditions and the following disclaimer. 9 // 2. Redistributions in binary form must reproduce the above copyright 10 // notice, this list of conditions and the following disclaimer in the 11 // documentation and/or other materials provided with the distribution. 12 // 3. Neither the name of the project nor the names of its contributors 13 // may be used to endorse or promote products derived from this software 14 // without specific prior written permission. 15 // 16 // THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 // ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 20 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 // SUCH DAMAGE. 27 // 28 29 #include <stdlib.h> 30 #include <new> 31 32 using std::new_handler; 33 namespace { 34 new_handler cur_handler; 35 } 36 37 namespace std { 38 39 #if !defined(GABIXX_LIBCXX) 40 const nothrow_t nothrow = {}; 41 #endif // !defined(GABIXX_LIBCXX) 42 43 bad_alloc::bad_alloc() throw() { 44 } 45 46 bad_alloc::~bad_alloc() throw() { 47 } 48 49 const char* bad_alloc::what() const throw() { 50 return "std::bad_alloc"; 51 } 52 53 new_handler set_new_handler(new_handler next_handler) throw() { 54 new_handler old_handler = cur_handler; 55 cur_handler = next_handler; 56 return old_handler; 57 } 58 59 } // namespace std 60 61 __attribute__ ((weak)) 62 void* operator new(std::size_t size) throw(std::bad_alloc) { 63 void* space; 64 do { 65 space = malloc(size); 66 if (space) { 67 return space; 68 } 69 new_handler handler = cur_handler; 70 if (handler == NULL) { 71 throw std::bad_alloc(); 72 } 73 handler(); 74 } while (space == 0); 75 } 76 77 __attribute__ ((weak)) 78 void* operator new(std::size_t size, const std::nothrow_t& no) throw() { 79 try { 80 ::operator new(size); 81 } catch (const std::bad_alloc&) { 82 return 0; 83 } 84 } 85 86 __attribute__ ((weak)) 87 void* operator new[](std::size_t size) throw(std::bad_alloc) { 88 return ::operator new(size); 89 } 90 91 __attribute__ ((weak)) 92 void* operator new[](std::size_t size, const std::nothrow_t& no) throw() { 93 return ::operator new(size, no); 94 } 95