00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef ADAPTIVELRU_H
00016 #define ADAPTIVELRU_H
00017
00018 #include "pandabase.h"
00019 #include "linkedListNode.h"
00020 #include "namable.h"
00021 #include "lightMutex.h"
00022 #include "lightMutexHolder.h"
00023
00024 class AdaptiveLruPage;
00025
00026
00027
00028 class EXPCL_PANDA_GOBJ AdaptiveLruPageDynamicList : public LinkedListNode {
00029 public:
00030 friend class AdaptiveLru;
00031 };
00032
00033 class EXPCL_PANDA_GOBJ AdaptiveLruPageStaticList : public LinkedListNode {
00034 public:
00035 friend class AdaptiveLru;
00036 };
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 class EXPCL_PANDA_GOBJ AdaptiveLru : public Namable {
00050 PUBLISHED:
00051 AdaptiveLru(const string &name, size_t max_size);
00052 ~AdaptiveLru();
00053
00054 INLINE size_t get_total_size() const;
00055 INLINE size_t get_max_size() const;
00056 INLINE void set_max_size(size_t max_size);
00057 size_t count_active_size() const;
00058
00059 INLINE void consider_evict();
00060 INLINE void evict_to(size_t target_size);
00061 void begin_epoch();
00062
00063 INLINE bool validate();
00064
00065 void output(ostream &out) const;
00066 void write(ostream &out, int indent_level) const;
00067
00068
00069
00070
00071
00072 INLINE void set_weight(PN_stdfloat weight);
00073 INLINE PN_stdfloat get_weight() const;
00074
00075 INLINE void set_max_updates_per_frame(int max_updates_per_frame);
00076 INLINE int get_max_updates_per_frame() const;
00077
00078 private:
00079 public:
00080 enum LruPagePriority {
00081 LPP_Highest = 0,
00082 LPP_High = 10,
00083 LPP_New = 20,
00084 LPP_Normal = 25,
00085 LPP_Intermediate = 30,
00086 LPP_Low = 40,
00087 LPP_TotalPriorities = 50,
00088 };
00089
00090 INLINE PN_stdfloat calculate_exponential_moving_average(PN_stdfloat value, PN_stdfloat average) const;
00091
00092 void do_partial_lru_update(int num_updates);
00093 void update_page(AdaptiveLruPage *page);
00094
00095 void do_add_page(AdaptiveLruPage *page);
00096 void do_remove_page(AdaptiveLruPage *page);
00097 void do_access_page(AdaptiveLruPage *page);
00098
00099 void do_evict_to(size_t target_size, bool hard_evict);
00100 bool do_validate();
00101
00102 LightMutex _lock;
00103
00104 size_t _total_size;
00105 size_t _max_size;
00106
00107 unsigned int _current_frame_identifier;
00108 double _weight;
00109 int _max_updates_per_frame;
00110
00111
00112
00113
00114 AdaptiveLruPageDynamicList _page_array[LPP_TotalPriorities];
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 AdaptiveLruPageStaticList _static_list;
00125
00126 friend class AdaptiveLruPage;
00127 };
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 class EXPCL_PANDA_GOBJ AdaptiveLruPage : public AdaptiveLruPageDynamicList, public AdaptiveLruPageStaticList {
00146 PUBLISHED:
00147 AdaptiveLruPage(size_t lru_size);
00148 AdaptiveLruPage(const AdaptiveLruPage ©);
00149 void operator = (const AdaptiveLruPage ©);
00150
00151 virtual ~AdaptiveLruPage();
00152
00153 INLINE AdaptiveLru *get_lru() const;
00154
00155 void enqueue_lru(AdaptiveLru *lru);
00156 INLINE void dequeue_lru();
00157
00158 INLINE void mark_used_lru() const;
00159 INLINE void mark_used_lru(AdaptiveLru *lru);
00160
00161 INLINE size_t get_lru_size() const;
00162 INLINE void set_lru_size(size_t lru_size);
00163
00164 virtual void evict_lru();
00165
00166 virtual void output(ostream &out) const;
00167 virtual void write(ostream &out, int indent_level) const;
00168
00169
00170 unsigned int get_num_frames() const;
00171 unsigned int get_num_inactive_frames() const;
00172
00173 private:
00174 AdaptiveLru *_lru;
00175
00176 size_t _lru_size;
00177 int _priority;
00178
00179 unsigned int _first_frame_identifier;
00180 unsigned int _current_frame_identifier;
00181 unsigned int _update_frame_identifier;
00182
00183 int _current_frame_usage;
00184 int _last_frame_usage;
00185 int _total_usage;
00186 int _update_total_usage;
00187
00188 PN_stdfloat _average_frame_utilization;
00189
00190 friend class AdaptiveLru;
00191 };
00192
00193 inline ostream &operator << (ostream &out, const AdaptiveLru &lru) {
00194 lru.output(out);
00195 return out;
00196 }
00197
00198 inline ostream &operator << (ostream &out, const AdaptiveLruPage &page) {
00199 page.output(out);
00200 return out;
00201 }
00202
00203 #if 0
00204 BEGIN_PUBLISH
00205 void test_adaptive_lru();
00206 END_PUBLISH
00207 #endif
00208
00209 #include "adaptiveLru.I"
00210
00211 #endif