00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef SIMPLELRU_H
00016 #define SIMPLELRU_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 SimpleLruPage;
00025
00026
00027
00028
00029
00030
00031 class EXPCL_PANDA_GOBJ SimpleLru : public LinkedListNode, public Namable {
00032 PUBLISHED:
00033 SimpleLru(const string &name, size_t max_size);
00034 ~SimpleLru();
00035
00036 INLINE size_t get_total_size() const;
00037 INLINE size_t get_max_size() const;
00038 INLINE void set_max_size(size_t max_size);
00039 size_t count_active_size() const;
00040
00041 INLINE void consider_evict();
00042 INLINE void evict_to(size_t target_size);
00043 INLINE void begin_epoch();
00044
00045 INLINE bool validate();
00046
00047 void output(ostream &out) const;
00048 void write(ostream &out, int indent_level) const;
00049
00050 public:
00051 static LightMutex &_global_lock;
00052
00053 private:
00054 void do_evict_to(size_t target_size, bool hard_evict);
00055 bool do_validate();
00056
00057 size_t _total_size;
00058 size_t _max_size;
00059 SimpleLruPage *_active_marker;
00060
00061 friend class SimpleLruPage;
00062 };
00063
00064
00065
00066
00067
00068
00069
00070 class EXPCL_PANDA_GOBJ SimpleLruPage : public LinkedListNode {
00071 PUBLISHED:
00072 INLINE SimpleLruPage(size_t lru_size);
00073 INLINE SimpleLruPage(const SimpleLruPage ©);
00074 INLINE void operator = (const SimpleLruPage ©);
00075
00076 virtual ~SimpleLruPage();
00077
00078 INLINE SimpleLru *get_lru() const;
00079
00080 void enqueue_lru(SimpleLru *lru);
00081 INLINE void dequeue_lru();
00082
00083 INLINE void mark_used_lru() const;
00084 INLINE void mark_used_lru(SimpleLru *lru);
00085
00086 INLINE size_t get_lru_size() const;
00087 INLINE void set_lru_size(size_t lru_size);
00088
00089 virtual void evict_lru();
00090
00091 virtual void output(ostream &out) const;
00092 virtual void write(ostream &out, int indent_level) const;
00093
00094 private:
00095 SimpleLru *_lru;
00096
00097 size_t _lru_size;
00098
00099 friend class SimpleLru;
00100 };
00101
00102 inline ostream &operator << (ostream &out, const SimpleLru &lru) {
00103 lru.output(out);
00104 return out;
00105 }
00106
00107 inline ostream &operator << (ostream &out, const SimpleLruPage &page) {
00108 page.output(out);
00109 return out;
00110 }
00111
00112 #include "simpleLru.I"
00113
00114 #endif