1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
/* Copyright (c) 2000, 2001, 2003-2006 MySQL AB, 2009 Sun Microsystems, Inc.
Use is subject to license terms.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
/*
This is a replacement of new/delete operators to be used when compiling
with gcc 3.0.x to avoid including libstdc++
It is also used to make all memory allocations to go through
my_malloc/my_free wrappers (for debugging/safemalloc and accounting)
*/
#include "mysys_priv.h"
#include <new>
/*
We don't yet enable the my new operators by default.
The reasons (for MariaDB) are:
- There are several global objects in plugins (wsrep_info, InnoDB,
tpool) that allocates data with 'new'. These objects are not
freed properly before exit() is called and safemalloc will report
these as lost memory. The proper fix is to ensure that all plugins
either ensure that all objects frees there data or the global object are
changed to a pointer that as allocated and freed on demand.
Doing this will make it easier to find leaks and also speed up plugin
loads when we don't have to initialize a lot of objects until they
are really needed.
- Rocksdb calls malloc_usable_size, that will crash if used with new based
on my_malloc. One suggested fix would be to not define
ROCKSDB_MALLOC_USABLE_SIZE if MYSYS_USE_NEW is defined.
When the above is fixed, we can add enable ADD_DEFINITIONS(-DUSE_MYSYS_NEW)
in CMakeLists.txt
*/
#if defined(USE_MYSYS_NEW)
void *operator new (size_t sz)
{
return (void *) my_malloc(key_memory_new, sz ? sz : 1, MYF(0));
}
void *operator new[] (size_t sz)
{
return (void *) my_malloc(key_memory_new, sz ? sz : 1, MYF(0));
}
void* operator new(std::size_t sz, const std::nothrow_t&) throw()
{
return (void *) my_malloc(key_memory_new, sz ? sz : 1, MYF(0));
}
void* operator new[](std::size_t sz, const std::nothrow_t&) throw()
{
return (void *) my_malloc(key_memory_new, sz ? sz : 1, MYF(0));
}
void operator delete (void *ptr, std::size_t) throw ()
{
my_free(ptr);
}
void operator delete (void *ptr) throw ()
{
my_free(ptr);
}
void operator delete[] (void *ptr) throw ()
{
my_free(ptr);
}
void operator delete[] (void *ptr, std::size_t) throw ()
{
my_free(ptr);
}
void operator delete(void* ptr, const std::nothrow_t&) throw()
{
my_free(ptr);
}
void operator delete[](void* ptr, const std::nothrow_t&) throw()
{
my_free(ptr);
}
C_MODE_START
int __cxa_pure_virtual()
{
assert(! "Aborted: pure virtual method called.");
return 0;
}
C_MODE_END
#else
/*
Define a dummy symbol, just to avoid compiler/linker warnings
about compiling an essentially empty file.
*/
int my_new_cc_symbol;
#endif /* USE_MYSYS_NEW */
|