From 821e63d1c99e408b43bb941aafe08fc3d29b3ce0 Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 28 Jun 2007 02:12:15 +0000 Subject: [PATCH] better use of _info_set --- panda/src/express/memoryUsage.cxx | 89 ++++++++++++++++++++----------- panda/src/express/memoryUsage.h | 2 + 2 files changed, 61 insertions(+), 30 deletions(-) diff --git a/panda/src/express/memoryUsage.cxx b/panda/src/express/memoryUsage.cxx index 7f6ef3f063..853bb26e88 100644 --- a/panda/src/express/memoryUsage.cxx +++ b/panda/src/express/memoryUsage.cxx @@ -396,6 +396,7 @@ MemoryUsage() { } #endif + _info_set_dirty = false; _freeze_index = 0; _count = 0; _current_cpp_size = 0; @@ -439,11 +440,8 @@ ns_record_pointer(ReferenceCount *ptr) { assert(insert_result.first != _table.end()); if (insert_result.second) { - MemoryInfo *info = new MemoryInfo; - bool inserted = _info_set.insert(info).second; - assert(inserted); - - (*insert_result.first).second = info; + (*insert_result.first).second = new MemoryInfo; + _info_set_dirty = true; ++_count; } @@ -594,9 +592,7 @@ ns_remove_pointer(ReferenceCount *ptr) { _count--; } - InfoSet::iterator si = _info_set.find(info); - assert(si != _info_set.end()); - _info_set.erase(si); + _info_set_dirty = true; delete info; } } @@ -628,11 +624,8 @@ ns_record_void_pointer(void *ptr, size_t size) { assert(insert_result.first != _table.end()); if (insert_result.second) { - MemoryInfo *info = new MemoryInfo; - bool inserted = _info_set.insert(info).second; - assert(inserted); - - (*insert_result.first).second = info; + (*insert_result.first).second = new MemoryInfo; + _info_set_dirty = true; ++_count; } @@ -726,9 +719,7 @@ ns_remove_void_pointer(void *ptr) { _current_cpp_size -= info->_size; } - InfoSet::iterator si = _info_set.find(info); - assert(si != _info_set.end()); - _info_set.erase(si); + _info_set_dirty = true; delete info; } } @@ -866,6 +857,10 @@ ns_get_pointers(MemoryUsagePointers &result) { nassertv(_track_memory_usage); result.clear(); + if (_info_set_dirty) { + refresh_info_set(); + } + double now = TrueClock::get_global_ptr()->get_long_time(); InfoSet::iterator si; for (si = _info_set.begin(); si != _info_set.end(); ++si) { @@ -890,6 +885,10 @@ ns_get_pointers_of_type(MemoryUsagePointers &result, TypeHandle type) { nassertv(_track_memory_usage); result.clear(); + if (_info_set_dirty) { + refresh_info_set(); + } + double now = TrueClock::get_global_ptr()->get_long_time(); InfoSet::iterator si; for (si = _info_set.begin(); si != _info_set.end(); ++si) { @@ -919,6 +918,10 @@ ns_get_pointers_of_age(MemoryUsagePointers &result, nassertv(_track_memory_usage); result.clear(); + if (_info_set_dirty) { + refresh_info_set(); + } + double now = TrueClock::get_global_ptr()->get_long_time(); InfoSet::iterator si; for (si = _info_set.begin(); si != _info_set.end(); ++si) { @@ -962,6 +965,10 @@ ns_get_pointers_with_zero_count(MemoryUsagePointers &result) { nassertv(_track_memory_usage); result.clear(); + if (_info_set_dirty) { + refresh_info_set(); + } + double now = TrueClock::get_global_ptr()->get_long_time(); InfoSet::iterator si; for (si = _info_set.begin(); si != _info_set.end(); ++si) { @@ -1005,12 +1012,13 @@ ns_freeze() { void MemoryUsage:: ns_show_current_types() { nassertv(_track_memory_usage); - // We have to protect modifications to the table from recursive - // calls by toggling _recursion_protect while we adjust it. - _recursion_protect = true; - TypeHistogram hist; - + + if (_info_set_dirty) { + refresh_info_set(); + } + + _recursion_protect = true; InfoSet::iterator si; for (si = _info_set.begin(); si != _info_set.end(); ++si) { MemoryInfo *info = (*si); @@ -1018,7 +1026,6 @@ ns_show_current_types() { hist.add_info(info->get_type(), info); } } - hist.show(); _recursion_protect = false; } @@ -1045,13 +1052,10 @@ void MemoryUsage:: ns_show_current_ages() { nassertv(_track_memory_usage); - // We have to protect modifications to the table from recursive - // calls by toggling _recursion_protect while we adjust it. - _recursion_protect = true; - AgeHistogram hist; double now = TrueClock::get_global_ptr()->get_long_time(); + _recursion_protect = true; InfoSet::iterator si; for (si = _info_set.begin(); si != _info_set.end(); ++si) { MemoryInfo *info = (*si); @@ -1061,7 +1065,6 @@ ns_show_current_ages() { } hist.show(); - _recursion_protect = false; } @@ -1138,13 +1141,39 @@ consolidate_void_ptr(MemoryInfo *info) { _current_cpp_size -= info->_size; } - InfoSet::iterator si = _info_set.find(typed_info); - assert(si != _info_set.end()); - _info_set.erase(si); + _info_set_dirty = true; delete typed_info; (*ti).second = info; } +//////////////////////////////////////////////////////////////////// +// Function: MemoryUsage::refresh_info_set +// Access: Private +// Description: Recomputes the _info_set table, if necessary. This +// table stores a unique entry for each MemoryInfo +// object in _table. +//////////////////////////////////////////////////////////////////// +void MemoryUsage:: +refresh_info_set() { + if (!_info_set_dirty) { + return; + } + + // We have to protect modifications to the table from recursive + // calls by toggling _recursion_protect while we adjust it. + _recursion_protect = true; + + _info_set.clear(); + Table::iterator ti; + for (ti = _table.begin(); ti != _table.end(); ++ti) { + _info_set.insert((*ti).second); + } + + _recursion_protect = false; + + _info_set_dirty = false; +} + #endif // DO_MEMORY_USAGE diff --git a/panda/src/express/memoryUsage.h b/panda/src/express/memoryUsage.h index 0823d074d4..6e3c087e22 100644 --- a/panda/src/express/memoryUsage.h +++ b/panda/src/express/memoryUsage.h @@ -121,6 +121,7 @@ private: void ns_show_trend_ages(); void consolidate_void_ptr(MemoryInfo *info); + void refresh_info_set(); static MemoryUsage *_global_ptr; @@ -144,6 +145,7 @@ private: // iteration. typedef set, dallocator > InfoSet; InfoSet _info_set; + bool _info_set_dirty; int _freeze_index; int _count;