Commit 00e6775a by Martin Liska Committed by Martin Liska

Fix vector memory statistics.

2018-11-05  Martin Liska  <mliska@suse.cz>

	* mem-stats.h (mem_alloc_description::release_instance_overhead):
	Return T *.
	* vec.c (struct vec_usage): Register m_element_size.
	(vec_prefix::register_overhead): New arguments: elements and
	element_size.
	(vec_prefix::release_overhead): Subtract elements.
	* vec.h (struct vec_prefix): Change signature.
	(va_heap::reserve): Pass proper arguments.
	(va_heap::release): Likewise.

From-SVN: r265799
parent 93ef36dc
2018-11-05 Martin Liska <mliska@suse.cz> 2018-11-05 Martin Liska <mliska@suse.cz>
* mem-stats.h (mem_alloc_description::release_instance_overhead):
Return T *.
* vec.c (struct vec_usage): Register m_element_size.
(vec_prefix::register_overhead): New arguments: elements and
element_size.
(vec_prefix::release_overhead): Subtract elements.
* vec.h (struct vec_prefix): Change signature.
(va_heap::reserve): Pass proper arguments.
(va_heap::release): Likewise.
2018-11-05 Martin Liska <mliska@suse.cz>
* mem-stats.h (mem_alloc_description::get_list): Fix GNU coding * mem-stats.h (mem_alloc_description::get_list): Fix GNU coding
style. style.
* vec.c: Likewise. * vec.c: Likewise.
...@@ -340,9 +340,10 @@ public: ...@@ -340,9 +340,10 @@ public:
void register_object_overhead (T *usage, size_t size, const void *ptr); void register_object_overhead (T *usage, size_t size, const void *ptr);
/* Release PTR pointer of SIZE bytes. If REMOVE_FROM_MAP is set to true, /* Release PTR pointer of SIZE bytes. If REMOVE_FROM_MAP is set to true,
remove the instance from reverse map. */ remove the instance from reverse map. Return memory usage that belongs
void release_instance_overhead (void *ptr, size_t size, to this memory description. */
bool remove_from_map = false); T * release_instance_overhead (void *ptr, size_t size,
bool remove_from_map = false);
/* Release intance object identified by PTR pointer. */ /* Release intance object identified by PTR pointer. */
void release_object_overhead (void *ptr); void release_object_overhead (void *ptr);
...@@ -503,7 +504,7 @@ mem_alloc_description<T>::register_overhead (size_t size, ...@@ -503,7 +504,7 @@ mem_alloc_description<T>::register_overhead (size_t size,
/* Release PTR pointer of SIZE bytes. */ /* Release PTR pointer of SIZE bytes. */
template <class T> template <class T>
inline void inline T *
mem_alloc_description<T>::release_instance_overhead (void *ptr, size_t size, mem_alloc_description<T>::release_instance_overhead (void *ptr, size_t size,
bool remove_from_map) bool remove_from_map)
{ {
...@@ -512,14 +513,16 @@ mem_alloc_description<T>::release_instance_overhead (void *ptr, size_t size, ...@@ -512,14 +513,16 @@ mem_alloc_description<T>::release_instance_overhead (void *ptr, size_t size,
if (!slot) if (!slot)
{ {
/* Due to PCH, it can really happen. */ /* Due to PCH, it can really happen. */
return; return NULL;
} }
mem_usage_pair<T> usage_pair = *slot; T *usage = (*slot).usage;
usage_pair.usage->release_overhead (size); usage->release_overhead (size);
if (remove_from_map) if (remove_from_map)
m_reverse_map->remove (ptr); m_reverse_map->remove (ptr);
return usage;
} }
/* Release intance object identified by PTR pointer. */ /* Release intance object identified by PTR pointer. */
......
...@@ -52,13 +52,14 @@ vnull vNULL; ...@@ -52,13 +52,14 @@ vnull vNULL;
struct vec_usage: public mem_usage struct vec_usage: public mem_usage
{ {
/* Default constructor. */ /* Default constructor. */
vec_usage (): m_items (0), m_items_peak (0) {} vec_usage (): m_items (0), m_items_peak (0), m_element_size (0) {}
/* Constructor. */ /* Constructor. */
vec_usage (size_t allocated, size_t times, size_t peak, vec_usage (size_t allocated, size_t times, size_t peak,
size_t items, size_t items_peak) size_t items, size_t items_peak, size_t element_size)
: mem_usage (allocated, times, peak), : mem_usage (allocated, times, peak),
m_items (items), m_items_peak (items_peak) {} m_items (items), m_items_peak (items_peak),
m_element_size (element_size) {}
/* Sum the usage with SECOND usage. */ /* Sum the usage with SECOND usage. */
vec_usage vec_usage
...@@ -68,7 +69,7 @@ struct vec_usage: public mem_usage ...@@ -68,7 +69,7 @@ struct vec_usage: public mem_usage
m_times + second.m_times, m_times + second.m_times,
m_peak + second.m_peak, m_peak + second.m_peak,
m_items + second.m_items, m_items + second.m_items,
m_items_peak + second.m_items_peak); m_items_peak + second.m_items_peak, 0);
} }
/* Dump usage coupled to LOC location, where TOTAL is sum of all rows. */ /* Dump usage coupled to LOC location, where TOTAL is sum of all rows. */
...@@ -81,7 +82,8 @@ struct vec_usage: public mem_usage ...@@ -81,7 +82,8 @@ struct vec_usage: public mem_usage
s[48] = '\0'; s[48] = '\0';
fprintf (stderr, "%-48s %10li:%4.1f%%%10li%10li:%4.1f%%%11li%11li\n", s, fprintf (stderr, "%-48s %10li%11li:%4.1f%%%10li%10li:%4.1f%%%11li%11li\n", s,
(long)m_element_size,
(long)m_allocated, m_allocated * 100.0 / total.m_allocated, (long)m_allocated, m_allocated * 100.0 / total.m_allocated,
(long)m_peak, (long)m_times, m_times * 100.0 / total.m_times, (long)m_peak, (long)m_times, m_times * 100.0 / total.m_times,
(long)m_items, (long)m_items_peak); (long)m_items, (long)m_items_peak);
...@@ -101,8 +103,8 @@ struct vec_usage: public mem_usage ...@@ -101,8 +103,8 @@ struct vec_usage: public mem_usage
static inline void static inline void
dump_header (const char *name) dump_header (const char *name)
{ {
fprintf (stderr, "%-48s %11s%15s%10s%17s%11s\n", name, "Leak", "Peak", fprintf (stderr, "%-48s %10s%11s%16s%10s%17s%11s\n", name, "sizeof(T)",
"Times", "Leak items", "Peak items"); "Leak", "Peak", "Times", "Leak items", "Peak items");
print_dash_line (); print_dash_line ();
} }
...@@ -110,6 +112,8 @@ struct vec_usage: public mem_usage ...@@ -110,6 +112,8 @@ struct vec_usage: public mem_usage
size_t m_items; size_t m_items;
/* Peak value of number of allocated items. */ /* Peak value of number of allocated items. */
size_t m_items_peak; size_t m_items_peak;
/* Size of element of the vector. */
size_t m_element_size;
}; };
/* Vector memory description. */ /* Vector memory description. */
...@@ -118,12 +122,14 @@ static mem_alloc_description <vec_usage> vec_mem_desc; ...@@ -118,12 +122,14 @@ static mem_alloc_description <vec_usage> vec_mem_desc;
/* Account the overhead. */ /* Account the overhead. */
void void
vec_prefix::register_overhead (void *ptr, size_t size, size_t elements vec_prefix::register_overhead (void *ptr, size_t elements,
MEM_STAT_DECL) size_t element_size MEM_STAT_DECL)
{ {
vec_mem_desc.register_descriptor (ptr, VEC_ORIGIN, false vec_mem_desc.register_descriptor (ptr, VEC_ORIGIN, false
FINAL_PASS_MEM_STAT); FINAL_PASS_MEM_STAT);
vec_usage *usage = vec_mem_desc.register_instance_overhead (size, ptr); vec_usage *usage
= vec_mem_desc.register_instance_overhead (elements * element_size, ptr);
usage->m_element_size = element_size;
usage->m_items += elements; usage->m_items += elements;
if (usage->m_items_peak < usage->m_items) if (usage->m_items_peak < usage->m_items)
usage->m_items_peak = usage->m_items; usage->m_items_peak = usage->m_items;
...@@ -132,13 +138,15 @@ vec_prefix::register_overhead (void *ptr, size_t size, size_t elements ...@@ -132,13 +138,15 @@ vec_prefix::register_overhead (void *ptr, size_t size, size_t elements
/* Notice that the memory allocated for the vector has been freed. */ /* Notice that the memory allocated for the vector has been freed. */
void void
vec_prefix::release_overhead (void *ptr, size_t size, bool in_dtor vec_prefix::release_overhead (void *ptr, size_t size, size_t elements,
MEM_STAT_DECL) bool in_dtor MEM_STAT_DECL)
{ {
if (!vec_mem_desc.contains_descriptor_for_instance (ptr)) if (!vec_mem_desc.contains_descriptor_for_instance (ptr))
vec_mem_desc.register_descriptor (ptr, VEC_ORIGIN, vec_mem_desc.register_descriptor (ptr, VEC_ORIGIN,
false FINAL_PASS_MEM_STAT); false FINAL_PASS_MEM_STAT);
vec_mem_desc.release_instance_overhead (ptr, size, in_dtor); vec_usage *usage = vec_mem_desc.release_instance_overhead (ptr, size,
in_dtor);
usage->m_items -= elements;
} }
/* Calculate the number of slots to reserve a vector, making sure that /* Calculate the number of slots to reserve a vector, making sure that
......
...@@ -195,7 +195,7 @@ struct vec_prefix ...@@ -195,7 +195,7 @@ struct vec_prefix
/* Memory allocation support routines in vec.c. */ /* Memory allocation support routines in vec.c. */
void register_overhead (void *, size_t, size_t CXX_MEM_STAT_INFO); void register_overhead (void *, size_t, size_t CXX_MEM_STAT_INFO);
void release_overhead (void *, size_t, bool CXX_MEM_STAT_INFO); void release_overhead (void *, size_t, size_t, bool CXX_MEM_STAT_INFO);
static unsigned calculate_allocation (vec_prefix *, unsigned, bool); static unsigned calculate_allocation (vec_prefix *, unsigned, bool);
static unsigned calculate_allocation_1 (unsigned, unsigned); static unsigned calculate_allocation_1 (unsigned, unsigned);
...@@ -276,12 +276,14 @@ inline void ...@@ -276,12 +276,14 @@ inline void
va_heap::reserve (vec<T, va_heap, vl_embed> *&v, unsigned reserve, bool exact va_heap::reserve (vec<T, va_heap, vl_embed> *&v, unsigned reserve, bool exact
MEM_STAT_DECL) MEM_STAT_DECL)
{ {
size_t elt_size = sizeof (T);
unsigned alloc unsigned alloc
= vec_prefix::calculate_allocation (v ? &v->m_vecpfx : 0, reserve, exact); = vec_prefix::calculate_allocation (v ? &v->m_vecpfx : 0, reserve, exact);
gcc_checking_assert (alloc); gcc_checking_assert (alloc);
if (GATHER_STATISTICS && v) if (GATHER_STATISTICS && v)
v->m_vecpfx.release_overhead (v, v->allocated (), false); v->m_vecpfx.release_overhead (v, elt_size * v->allocated (),
v->allocated (), false);
size_t size = vec<T, va_heap, vl_embed>::embedded_size (alloc); size_t size = vec<T, va_heap, vl_embed>::embedded_size (alloc);
unsigned nelem = v ? v->length () : 0; unsigned nelem = v ? v->length () : 0;
...@@ -289,7 +291,7 @@ va_heap::reserve (vec<T, va_heap, vl_embed> *&v, unsigned reserve, bool exact ...@@ -289,7 +291,7 @@ va_heap::reserve (vec<T, va_heap, vl_embed> *&v, unsigned reserve, bool exact
v->embedded_init (alloc, nelem); v->embedded_init (alloc, nelem);
if (GATHER_STATISTICS) if (GATHER_STATISTICS)
v->m_vecpfx.register_overhead (v, alloc, nelem PASS_MEM_STAT); v->m_vecpfx.register_overhead (v, alloc, elt_size PASS_MEM_STAT);
} }
...@@ -299,11 +301,13 @@ template<typename T> ...@@ -299,11 +301,13 @@ template<typename T>
void void
va_heap::release (vec<T, va_heap, vl_embed> *&v) va_heap::release (vec<T, va_heap, vl_embed> *&v)
{ {
size_t elt_size = sizeof (T);
if (v == NULL) if (v == NULL)
return; return;
if (GATHER_STATISTICS) if (GATHER_STATISTICS)
v->m_vecpfx.release_overhead (v, v->allocated (), true); v->m_vecpfx.release_overhead (v, elt_size * v->allocated (),
v->allocated (), true);
::free (v); ::free (v);
v = NULL; v = NULL;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment