mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 00:32:57 -04:00
putil: Give SimpleHashMap a type handle to enable memory usage tracking
Previously SimpleHashMap were entirely absent from the PStats memory statistics.
This commit is contained in:
parent
ae3d8c2663
commit
e08282003b
@ -11,6 +11,9 @@
|
|||||||
* @date 2007-07-19
|
* @date 2007-07-19
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
template<class Key, class Value, class Compare>
|
||||||
|
TypeHandle SimpleHashMap<Key, Value, Compare>::_type_handle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@ -42,8 +45,9 @@ SimpleHashMap(const SimpleHashMap ©) :
|
|||||||
if (_table_size > 0) {
|
if (_table_size > 0) {
|
||||||
size_t alloc_size = _table_size * (sizeof(TableEntry) + sizeof(int) * sparsity);
|
size_t alloc_size = _table_size * (sizeof(TableEntry) + sizeof(int) * sparsity);
|
||||||
|
|
||||||
|
init_type();
|
||||||
_deleted_chain = memory_hook->get_deleted_chain(alloc_size);
|
_deleted_chain = memory_hook->get_deleted_chain(alloc_size);
|
||||||
_table = (TableEntry *)_deleted_chain->allocate(alloc_size, TypeHandle::none());
|
_table = (TableEntry *)_deleted_chain->allocate(alloc_size, _type_handle);
|
||||||
|
|
||||||
for (size_t i = 0; i < _num_entries; ++i) {
|
for (size_t i = 0; i < _num_entries; ++i) {
|
||||||
new(&_table[i]) TableEntry(copy._table[i]);
|
new(&_table[i]) TableEntry(copy._table[i]);
|
||||||
@ -101,8 +105,9 @@ operator = (const SimpleHashMap<Key, Value, Compare> ©) {
|
|||||||
// _table_size * 4 more ints at the end (for the index array).
|
// _table_size * 4 more ints at the end (for the index array).
|
||||||
size_t alloc_size = _table_size * (sizeof(TableEntry) + sizeof(int) * sparsity);
|
size_t alloc_size = _table_size * (sizeof(TableEntry) + sizeof(int) * sparsity);
|
||||||
|
|
||||||
|
init_type();
|
||||||
_deleted_chain = memory_hook->get_deleted_chain(alloc_size);
|
_deleted_chain = memory_hook->get_deleted_chain(alloc_size);
|
||||||
_table = (TableEntry *)_deleted_chain->allocate(alloc_size, TypeHandle::none());
|
_table = (TableEntry *)_deleted_chain->allocate(alloc_size, _type_handle);
|
||||||
for (size_t i = 0; i < _num_entries; ++i) {
|
for (size_t i = 0; i < _num_entries; ++i) {
|
||||||
new(&_table[i]) TableEntry(copy._table[i]);
|
new(&_table[i]) TableEntry(copy._table[i]);
|
||||||
}
|
}
|
||||||
@ -119,7 +124,7 @@ operator = (const SimpleHashMap<Key, Value, Compare> ©) {
|
|||||||
old_table[i].~TableEntry();
|
old_table[i].~TableEntry();
|
||||||
}
|
}
|
||||||
|
|
||||||
old_deleted_chain->deallocate(old_table, TypeHandle::none());
|
old_deleted_chain->deallocate(old_table, _type_handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
@ -355,7 +360,7 @@ clear() {
|
|||||||
_table[i].~TableEntry();
|
_table[i].~TableEntry();
|
||||||
}
|
}
|
||||||
|
|
||||||
_deleted_chain->deallocate(_table, TypeHandle::none());
|
_deleted_chain->deallocate(_table, _type_handle);
|
||||||
_table = nullptr;
|
_table = nullptr;
|
||||||
_deleted_chain = nullptr;
|
_deleted_chain = nullptr;
|
||||||
_table_size = 0;
|
_table_size = 0;
|
||||||
@ -685,8 +690,9 @@ new_table() {
|
|||||||
// _table_size * 4 more ints at the end (for the index array).
|
// _table_size * 4 more ints at the end (for the index array).
|
||||||
size_t alloc_size = _table_size * (sizeof(TableEntry) + sizeof(int) * sparsity);
|
size_t alloc_size = _table_size * (sizeof(TableEntry) + sizeof(int) * sparsity);
|
||||||
|
|
||||||
|
init_type();
|
||||||
_deleted_chain = memory_hook->get_deleted_chain(alloc_size);
|
_deleted_chain = memory_hook->get_deleted_chain(alloc_size);
|
||||||
_table = (TableEntry *)_deleted_chain->allocate(alloc_size, TypeHandle::none());
|
_table = (TableEntry *)_deleted_chain->allocate(alloc_size, _type_handle);
|
||||||
memset(get_index_array(), -1, _table_size * sizeof(int) * sparsity);
|
memset(get_index_array(), -1, _table_size * sizeof(int) * sparsity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -744,7 +750,7 @@ resize_table(size_t new_size) {
|
|||||||
// _table_size * sparsity more ints at the end (for the sparse index array).
|
// _table_size * sparsity more ints at the end (for the sparse index array).
|
||||||
size_t alloc_size = _table_size * sizeof(TableEntry) + _table_size * sparsity * sizeof(int);
|
size_t alloc_size = _table_size * sizeof(TableEntry) + _table_size * sparsity * sizeof(int);
|
||||||
_deleted_chain = memory_hook->get_deleted_chain(alloc_size);
|
_deleted_chain = memory_hook->get_deleted_chain(alloc_size);
|
||||||
_table = (TableEntry *)_deleted_chain->allocate(alloc_size, TypeHandle::none());
|
_table = (TableEntry *)_deleted_chain->allocate(alloc_size, _type_handle);
|
||||||
int *index_array = get_index_array();
|
int *index_array = get_index_array();
|
||||||
memset(index_array, -1, _table_size * sizeof(int) * sparsity);
|
memset(index_array, -1, _table_size * sizeof(int) * sparsity);
|
||||||
|
|
||||||
@ -757,7 +763,7 @@ resize_table(size_t new_size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// We don't need this old thing anymore.
|
// We don't need this old thing anymore.
|
||||||
old_chain->deallocate(old_table, TypeHandle::none());
|
old_chain->deallocate(old_table, _type_handle);
|
||||||
|
|
||||||
// Reindex the table.
|
// Reindex the table.
|
||||||
for (size_t i = 0; i < _num_entries; ++i) {
|
for (size_t i = 0; i < _num_entries; ++i) {
|
||||||
@ -772,3 +778,22 @@ resize_table(size_t new_size) {
|
|||||||
|
|
||||||
nassertv(validate());
|
nassertv(validate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
template<class Key, class Value, class Compare>
|
||||||
|
void SimpleHashMap<Key, Value, Compare>::
|
||||||
|
init_type() {
|
||||||
|
#if defined(HAVE_RTTI) && !defined(__EDG__)
|
||||||
|
// If we have RTTI, we can determine the name of the base type.
|
||||||
|
std::string key_name = typeid(Key).name();
|
||||||
|
std::string value_name = typeid(Value).name();
|
||||||
|
|
||||||
|
_type_handle =
|
||||||
|
register_dynamic_type("SimpleHashMap<" + key_name + ", " + value_name + ">");
|
||||||
|
#else
|
||||||
|
_type_handle =
|
||||||
|
register_dynamic_type("SimpleHashMap<unknown, unknown>");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
@ -141,6 +141,15 @@ public:
|
|||||||
size_t _num_entries;
|
size_t _num_entries;
|
||||||
|
|
||||||
Compare _comp;
|
Compare _comp;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static TypeHandle get_class_type() {
|
||||||
|
return _type_handle;
|
||||||
|
}
|
||||||
|
static void init_type();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static TypeHandle _type_handle;
|
||||||
#endif // CPPPARSER
|
#endif // CPPPARSER
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user