CACAO
Manager.hpp
Go to the documentation of this file.
1 /* src/vm/jit/compiler2/memory/MemoryManager.hpp - Custom new/delete handler
2 
3  Copyright (C) 2013
4  CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5 
6  This file is part of CACAO.
7 
8  This program is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License as
10  published by the Free Software Foundation; either version 2, or (at
11  your option) any later version.
12 
13  This program is distributed in the hope that it will be useful, but
14  WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21  02110-1301, USA.
22 
23 */
24 
25 #ifndef _JIT_COMPILER2_MEMORY_MANAGER
26 #define _JIT_COMPILER2_MEMORY_MANAGER
27 
28 
29 #include <new>
31 
32 namespace cacao {
33 namespace jit {
34 namespace compiler2 {
35 namespace memory {
36 
37 /**
38  * Custom new/delete handler mixin.
39  *
40  * @note See @cite Meyers2005 (Item 49-52) for more info.
41  */
42 template<typename T>
43 class ManagerMixin {
44 public:
45  /// normal new
46  static void* operator new(std::size_t size) throw(std::bad_alloc) {
47  void *p = ::operator new(size);
48  MM_STAT(stat_new<T>(size,p));
49  return p;
50  }
51  /// normal delete
52  static void operator delete(void *pMemory) throw() {
53  ::operator delete(pMemory);
54  MM_STAT(stat_delete<T>(pMemory));
55  }
56 
57  /// placement new
58  static void* operator new(std::size_t size, void *ptr) throw() {
59  void *p = ::operator new(size, ptr);
60  MM_STAT(stat_new<T>(size,p));
61  return p;
62  }
63  /// placement delete
64  static void operator delete(void *pMemory, void *ptr) throw() {
65  ::operator delete(pMemory, ptr);
66  MM_STAT(stat_delete<T>(pMemory));
67  }
68 
69  /// nothrow new
70  static void* operator new(std::size_t size, const std::nothrow_t& nt) throw() {
71  void *p = ::operator new(size, nt);
72  MM_STAT(stat_new<T>(size,p));
73  return p;
74  }
75  /// nothrow delete
76  static void operator delete(void *pMemory, const std::nothrow_t&) throw() {
77  ::operator delete(pMemory);
78  MM_STAT(stat_delete<T>(pMemory));
79  }
80 
81  ///////////////////
82  // array new/delete
83  ///////////////////
84 
85  /// normal new[]
86  static void* operator new[](std::size_t size) throw(std::bad_alloc) {
87  void *p = ::operator new[](size);
88  MM_STAT(stat_new<T>(size,p));
89  return p;
90  }
91  /// normal delete[]
92  static void operator delete[](void *pMemory) throw() {
93  ::operator delete[](pMemory);
94  MM_STAT(stat_delete<T>(pMemory));
95  }
96 
97  /// placement new[]
98  static void* operator new[](std::size_t size, void *ptr) throw() {
99  void *p = ::operator new[](size, ptr);
100  MM_STAT(stat_new<T>(size,p));
101  return p;
102  }
103  /// placement delete[]
104  static void operator delete[](void *pMemory, void *ptr) throw() {
105  ::operator delete[](pMemory, ptr);
106  MM_STAT(stat_delete<T>(pMemory));
107  }
108 
109  /// nothrow new[]
110  static void* operator new[](std::size_t size, const std::nothrow_t& nt) throw() {
111  void *p = ::operator new[](size, nt);
112  MM_STAT(stat_new<T>(size,p));
113  return p;
114  }
115  /// nothrow delete[]
116  static void operator delete[](void *pMemory, const std::nothrow_t&) throw() {
117  ::operator delete[](pMemory);
118  MM_STAT(stat_delete<T>(pMemory));
119  }
120 
121 };
122 
123 #undef MM_STAT
124 
125 } // end namespace memory
126 } // end namespace compiler2
127 } // end namespace jit
128 } // end namespace cacao
129 
130 #endif /* _JIT_COMPILER2_MEMORY_MANAGER */
131 
132 
133 /*
134  * These are local overrides for various environment variables in Emacs.
135  * Please do not remove this and leave it at the end of the file, where
136  * Emacs will automagically detect them.
137  * ---------------------------------------------------------------------
138  * Local variables:
139  * mode: c++
140  * indent-tabs-mode: t
141  * c-basic-offset: 4
142  * tab-width: 4
143  * End:
144  * vim:noexpandtab:sw=4:ts=4:
145  */
#define MM_STAT(x)
Definition: memstats.hpp:125
Custom new/delete handler mixin.
Definition: Manager.hpp:43
JNIEnv jthread jobject jclass jlong size
Definition: jvmti.h:387