15
15
16
16
#include " arcane/utils/FatalErrorException.h"
17
17
#include " arcane/utils/PlatformUtils.h"
18
+ #include " arcane/utils/ValueConvert.h"
18
19
19
20
#include < unordered_map>
20
21
#include < map>
@@ -53,13 +54,27 @@ class MemoryPool::Impl
53
54
{
54
55
std::unique_lock<std::mutex> lg (m_mutex);
55
56
auto x = m_allocated_memory_map.find (ptr);
56
- if (x == m_allocated_memory_map.end ())
57
- ARCANE_FATAL (" MemoryPool '{0}': pointer {1} is not in the allocated map" , m_name, ptr);
57
+ if (x == m_allocated_memory_map.end ()) {
58
+ ++m_nb_error;
59
+ String str = String::format (" MemoryPool '{0}': pointer {1} is not in the allocated map" , m_name, ptr);
60
+ if (m_is_throw_on_error)
61
+ ARCANE_FATAL (str);
62
+ else {
63
+ std::cerr << " ERROR: " << str << " \n " ;
64
+ return ;
65
+ }
66
+ }
58
67
59
68
size_t allocated_size = x->second ;
60
- if (size != allocated_size)
61
- ARCANE_FATAL (" MemoryPool '{0}': Incoherent size saved_size={1} arg_size={2}" ,
62
- m_name, allocated_size, size);
69
+ if (size != allocated_size) {
70
+ ++m_nb_error;
71
+ String str = String::format (" MemoryPool '{0}': Incoherent size saved_size={1} arg_size={2}" ,
72
+ m_name, allocated_size, size);
73
+ if (m_is_throw_on_error)
74
+ ARCANE_FATAL (str);
75
+ else
76
+ std::cerr << " ERROR: " << str << " \n " ;
77
+ }
63
78
64
79
m_allocated_memory_map.erase (x);
65
80
}
@@ -81,10 +96,16 @@ class MemoryPool::Impl
81
96
return m_allocated_memory_map.size ();
82
97
}
83
98
99
+ bool isThrowOnError () const { return m_is_throw_on_error; }
100
+ void setIsThrowOnError (bool v) { m_is_throw_on_error = v; }
101
+ Int32 nbError () const { return m_nb_error; }
102
+
84
103
private:
85
104
86
105
MapType m_allocated_memory_map;
87
106
String m_name;
107
+ std::atomic<Int32> m_nb_error = 0 ;
108
+ bool m_is_throw_on_error = false ;
88
109
mutable std::mutex m_mutex;
89
110
};
90
111
@@ -168,6 +189,10 @@ class MemoryPool::Impl
168
189
, m_free_map(name)
169
190
, m_name(name)
170
191
{
192
+ if (auto v = Convert::Type<Int32>::tryParseFromEnvironment (" ARCANE_MEMORY_POOL_THROW_ON_ERROR" , true )) {
193
+ bool throw_on_error = (v.value () != 0 );
194
+ m_allocated_map.setIsThrowOnError (throw_on_error);
195
+ }
171
196
}
172
197
173
198
public:
@@ -271,6 +296,7 @@ dumpStats(std::ostream& ostr)
271
296
<< " nb_allocated=" << m_allocated_map.size ()
272
297
<< " nb_free=" << m_free_map.size ()
273
298
<< " nb_cached=" << m_nb_cached
299
+ << " nb_error=" << m_allocated_map.nbError ()
274
300
<< " \n " ;
275
301
}
276
302
0 commit comments