Panda3D
geomCacheManager.cxx
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file geomCacheManager.cxx
10  * @author drose
11  * @date 2005-03-11
12  */
13 
14 #include "geomCacheManager.h"
15 #include "geomCacheEntry.h"
16 #include "geomMunger.h"
17 #include "lightMutexHolder.h"
18 #include "lightReMutexHolder.h"
19 #include "clockObject.h"
20 
21 GeomCacheManager *GeomCacheManager::_global_ptr = nullptr;
22 
23 PStatCollector GeomCacheManager::_geom_cache_size_pcollector("Geom cache size");
24 PStatCollector GeomCacheManager::_geom_cache_active_pcollector("Geom cache size:Active");
25 PStatCollector GeomCacheManager::_geom_cache_record_pcollector("Geom cache operations:record");
26 PStatCollector GeomCacheManager::_geom_cache_erase_pcollector("Geom cache operations:erase");
27 PStatCollector GeomCacheManager::_geom_cache_evict_pcollector("Geom cache operations:evict");
28 
29 /**
30  *
31  */
32 GeomCacheManager::
33 GeomCacheManager() :
34  _lock("GeomCacheManager"),
35  _total_size(0)
36 {
37  // We deliberately hang on to this pointer forever.
38  _list = new GeomCacheEntry;
39  _list->ref();
40  _list->_next = _list;
41  _list->_prev = _list;
42 }
43 
44 /**
45  *
46  */
47 GeomCacheManager::
48 ~GeomCacheManager() {
49  // Shouldn't be deleting this global object.
50  nassert_raise("attempt to delete GeomCacheManager");
51 }
52 
53 /**
54  * Immediately empties all elements in the cache.
55  */
57 flush() {
58  // Prevent deadlock
59  LightReMutexHolder registry_holder(GeomMunger::get_registry()->_registry_lock);
60 
61  LightMutexHolder holder(_lock);
62  evict_old_entries(0, false);
63 }
64 
65 /**
66  * Returns the global cache manager pointer.
67  */
70  if (_global_ptr == nullptr) {
71  _global_ptr = new GeomCacheManager;
72  }
73  return _global_ptr;
74 }
75 
76 /**
77  * Trims the cache size down to the specified size by evicting old cache
78  * entries as needed. It is assumed that you already hold the lock before
79  * calling this method.
80  */
82 evict_old_entries(int max_size, bool keep_current) {
83  int current_frame = ClockObject::get_global_clock()->get_frame_count();
84  int min_frames = geom_cache_min_frames;
85 
86  while (_total_size > max_size) {
87  PT(GeomCacheEntry) entry = _list->_next;
88  nassertv(entry != _list);
89 
90  if (keep_current && current_frame - entry->_last_frame_used < min_frames) {
91  // Never mind, this one is too new.
92  if (gobj_cat.is_debug()) {
93  gobj_cat.debug()
94  << "Oldest element in cache is "
95  << current_frame - entry->_last_frame_used
96  << " frames; keeping cache at " << _total_size << " entries.\n";
97  }
98  break;
99  }
100 
101  entry->unref();
102 
103  if (gobj_cat.is_debug()) {
104  gobj_cat.debug()
105  << "cache total_size = " << _total_size << " entries, max_size = "
106  << max_size << ", removing " << *entry << "\n";
107  }
108 
109  entry->evict_callback();
110 
112  if (entry->_last_frame_used == current_frame) {
113  GeomCacheManager::_geom_cache_active_pcollector.sub_level(1);
114  }
115  }
116 
117  --_total_size;
118  entry->remove_from_list();
119  _geom_cache_evict_pcollector.add_level(1);
120  }
121  _geom_cache_size_pcollector.set_level(_total_size);
122 }
LightMutexHolder
Similar to MutexHolder, but for a light mutex.
Definition: lightMutexHolder.h:25
geomMunger.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
LightReMutexHolder
Similar to MutexHolder, but for a light reentrant mutex.
Definition: lightReMutexHolder.h:25
clockObject.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
ClockObject::get_global_clock
static ClockObject * get_global_clock()
Returns a pointer to the global ClockObject.
Definition: clockObject.I:215
GeomCacheEntry
This object contains a single cache entry in the GeomCacheManager.
Definition: geomCacheEntry.h:31
GeomCacheManager
This is used to keep track of, and limit the size of, the cache of munged vertices,...
Definition: geomCacheManager.h:37
lightMutexHolder.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PStatCollector
A lightweight class that represents a single element that may be timed and/or counted via stats.
Definition: pStatCollector.h:43
PStatClient::is_connected
static bool is_connected()
Returns true if the client believes it is connected to a working PStatServer, false otherwise.
Definition: pStatClient.h:291
ReferenceCount::ref
void ref() const
Explicitly increments the reference count.
Definition: referenceCount.I:151
ClockObject::get_frame_count
get_frame_count
Returns the number of times tick() has been called since the ClockObject was created,...
Definition: clockObject.h:94
GeomCacheManager::evict_old_entries
void evict_old_entries()
Trims the cache size down to get_max_size() by evicting old cache entries as needed.
Definition: geomCacheManager.I:53
geomCacheEntry.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
GeomCacheManager::flush
void flush()
Immediately empties all elements in the cache.
Definition: geomCacheManager.cxx:57
geomCacheManager.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
GeomCacheManager::get_global_ptr
static GeomCacheManager * get_global_ptr()
Returns the global cache manager pointer.
Definition: geomCacheManager.cxx:69
lightReMutexHolder.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.