better use of _info_set

This commit is contained in:
David Rose 2007-06-28 02:12:15 +00:00
parent 173844002f
commit 821e63d1c9
2 changed files with 61 additions and 30 deletions

View File

@ -396,6 +396,7 @@ MemoryUsage() {
} }
#endif #endif
_info_set_dirty = false;
_freeze_index = 0; _freeze_index = 0;
_count = 0; _count = 0;
_current_cpp_size = 0; _current_cpp_size = 0;
@ -439,11 +440,8 @@ ns_record_pointer(ReferenceCount *ptr) {
assert(insert_result.first != _table.end()); assert(insert_result.first != _table.end());
if (insert_result.second) { if (insert_result.second) {
MemoryInfo *info = new MemoryInfo; (*insert_result.first).second = new MemoryInfo;
bool inserted = _info_set.insert(info).second; _info_set_dirty = true;
assert(inserted);
(*insert_result.first).second = info;
++_count; ++_count;
} }
@ -594,9 +592,7 @@ ns_remove_pointer(ReferenceCount *ptr) {
_count--; _count--;
} }
InfoSet::iterator si = _info_set.find(info); _info_set_dirty = true;
assert(si != _info_set.end());
_info_set.erase(si);
delete info; delete info;
} }
} }
@ -628,11 +624,8 @@ ns_record_void_pointer(void *ptr, size_t size) {
assert(insert_result.first != _table.end()); assert(insert_result.first != _table.end());
if (insert_result.second) { if (insert_result.second) {
MemoryInfo *info = new MemoryInfo; (*insert_result.first).second = new MemoryInfo;
bool inserted = _info_set.insert(info).second; _info_set_dirty = true;
assert(inserted);
(*insert_result.first).second = info;
++_count; ++_count;
} }
@ -726,9 +719,7 @@ ns_remove_void_pointer(void *ptr) {
_current_cpp_size -= info->_size; _current_cpp_size -= info->_size;
} }
InfoSet::iterator si = _info_set.find(info); _info_set_dirty = true;
assert(si != _info_set.end());
_info_set.erase(si);
delete info; delete info;
} }
} }
@ -866,6 +857,10 @@ ns_get_pointers(MemoryUsagePointers &result) {
nassertv(_track_memory_usage); nassertv(_track_memory_usage);
result.clear(); result.clear();
if (_info_set_dirty) {
refresh_info_set();
}
double now = TrueClock::get_global_ptr()->get_long_time(); double now = TrueClock::get_global_ptr()->get_long_time();
InfoSet::iterator si; InfoSet::iterator si;
for (si = _info_set.begin(); si != _info_set.end(); ++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); nassertv(_track_memory_usage);
result.clear(); result.clear();
if (_info_set_dirty) {
refresh_info_set();
}
double now = TrueClock::get_global_ptr()->get_long_time(); double now = TrueClock::get_global_ptr()->get_long_time();
InfoSet::iterator si; InfoSet::iterator si;
for (si = _info_set.begin(); si != _info_set.end(); ++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); nassertv(_track_memory_usage);
result.clear(); result.clear();
if (_info_set_dirty) {
refresh_info_set();
}
double now = TrueClock::get_global_ptr()->get_long_time(); double now = TrueClock::get_global_ptr()->get_long_time();
InfoSet::iterator si; InfoSet::iterator si;
for (si = _info_set.begin(); si != _info_set.end(); ++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); nassertv(_track_memory_usage);
result.clear(); result.clear();
if (_info_set_dirty) {
refresh_info_set();
}
double now = TrueClock::get_global_ptr()->get_long_time(); double now = TrueClock::get_global_ptr()->get_long_time();
InfoSet::iterator si; InfoSet::iterator si;
for (si = _info_set.begin(); si != _info_set.end(); ++si) { for (si = _info_set.begin(); si != _info_set.end(); ++si) {
@ -1005,12 +1012,13 @@ ns_freeze() {
void MemoryUsage:: void MemoryUsage::
ns_show_current_types() { ns_show_current_types() {
nassertv(_track_memory_usage); 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; TypeHistogram hist;
if (_info_set_dirty) {
refresh_info_set();
}
_recursion_protect = true;
InfoSet::iterator si; InfoSet::iterator si;
for (si = _info_set.begin(); si != _info_set.end(); ++si) { for (si = _info_set.begin(); si != _info_set.end(); ++si) {
MemoryInfo *info = (*si); MemoryInfo *info = (*si);
@ -1018,7 +1026,6 @@ ns_show_current_types() {
hist.add_info(info->get_type(), info); hist.add_info(info->get_type(), info);
} }
} }
hist.show(); hist.show();
_recursion_protect = false; _recursion_protect = false;
} }
@ -1045,13 +1052,10 @@ void MemoryUsage::
ns_show_current_ages() { ns_show_current_ages() {
nassertv(_track_memory_usage); 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; AgeHistogram hist;
double now = TrueClock::get_global_ptr()->get_long_time(); double now = TrueClock::get_global_ptr()->get_long_time();
_recursion_protect = true;
InfoSet::iterator si; InfoSet::iterator si;
for (si = _info_set.begin(); si != _info_set.end(); ++si) { for (si = _info_set.begin(); si != _info_set.end(); ++si) {
MemoryInfo *info = (*si); MemoryInfo *info = (*si);
@ -1061,7 +1065,6 @@ ns_show_current_ages() {
} }
hist.show(); hist.show();
_recursion_protect = false; _recursion_protect = false;
} }
@ -1138,13 +1141,39 @@ consolidate_void_ptr(MemoryInfo *info) {
_current_cpp_size -= info->_size; _current_cpp_size -= info->_size;
} }
InfoSet::iterator si = _info_set.find(typed_info); _info_set_dirty = true;
assert(si != _info_set.end());
_info_set.erase(si);
delete typed_info; delete typed_info;
(*ti).second = 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 #endif // DO_MEMORY_USAGE

View File

@ -121,6 +121,7 @@ private:
void ns_show_trend_ages(); void ns_show_trend_ages();
void consolidate_void_ptr(MemoryInfo *info); void consolidate_void_ptr(MemoryInfo *info);
void refresh_info_set();
static MemoryUsage *_global_ptr; static MemoryUsage *_global_ptr;
@ -144,6 +145,7 @@ private:
// iteration. // iteration.
typedef set<MemoryInfo *, less<MemoryInfo *>, dallocator<MemoryInfo *> > InfoSet; typedef set<MemoryInfo *, less<MemoryInfo *>, dallocator<MemoryInfo *> > InfoSet;
InfoSet _info_set; InfoSet _info_set;
bool _info_set_dirty;
int _freeze_index; int _freeze_index;
int _count; int _count;