memory.cc revision 227995
1/**
2 * memory.cc - Contains stub definition of C++ new/delete operators.
3 *
4 * These definitions are intended to be used for testing and are weak symbols
5 * to allow them to be replaced by definitions from a STL implementation.
6 * These versions simply wrap malloc() and free(), they do not provide a
7 * C++-specific allocator.
8 */
9
10#include <stddef.h>
11#include <stdlib.h>
12#include "stdexcept.h"
13
14#if !__has_builtin(__sync_swap)
15#define __sync_swap __sync_lock_test_and_set
16#endif
17
18namespace std
19{
20	struct nothrow_t {};
21}
22
23
24/// The type of the function called when allocation fails.
25typedef void (*new_handler)();
26/**
27 * The function to call when allocation fails.  By default, there is no
28 * handler and a bad allocation exception is thrown if an allocation fails.
29 */
30static new_handler new_handl;
31
32namespace std
33{
34	/**
35	 * Sets a function to be called when there is a failure in new.
36	 */
37	__attribute__((weak))
38	new_handler set_new_handler(new_handler handler)
39	{
40		return __sync_swap(&new_handl, handler);
41	}
42}
43
44
45__attribute__((weak))
46void* operator new(size_t size)
47{
48	void * mem = malloc(size);
49	while (0 == mem)
50	{
51		if (0 != new_handl)
52		{
53			new_handl();
54		}
55		else
56		{
57			throw std::bad_alloc();
58		}
59		mem = malloc(size);
60	}
61
62	return mem;
63}
64
65__attribute__((weak))
66void* operator new(size_t size, const std::nothrow_t &) throw()
67{
68	void *mem = malloc(size);
69	while (0 == mem)
70	{
71		if (0 != new_handl)
72		{
73			try
74			{
75				new_handl();
76			}
77			catch (...)
78			{
79				// nothrow operator new should return NULL in case of
80				// std::bad_alloc exception in new handler
81				return NULL;
82			}
83		}
84		else
85		{
86			return NULL;
87		}
88		mem = malloc(size);
89	}
90
91	return mem;
92}
93
94
95__attribute__((weak))
96void operator delete(void * ptr)
97{
98	free(ptr);
99}
100
101
102__attribute__((weak))
103void * operator new[](size_t size)
104{
105	return ::operator new(size);
106}
107
108
109__attribute__((weak))
110void operator delete[](void * ptr) throw()
111{
112	::operator delete(ptr);
113}
114
115
116