Core: ValueCache

git-svn-id: svn://ultimatepp.org/upp/trunk@14573 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2020-06-09 14:55:33 +00:00
parent 0eaae761a1
commit 9a82b14059
6 changed files with 83 additions and 21 deletions

View file

@ -366,6 +366,8 @@ class JsonIO;
#include "Huge.h" #include "Huge.h"
#include "ValueCache.h"
#ifdef PLATFORM_WIN32 #ifdef PLATFORM_WIN32
NTL_MOVEABLE(POINT) NTL_MOVEABLE(POINT)
NTL_MOVEABLE(SIZE) NTL_MOVEABLE(SIZE)

View file

@ -163,6 +163,8 @@ file
Topic.cpp, Topic.cpp,
CoWork.h, CoWork.h,
CoWork.cpp, CoWork.cpp,
ValueCache.h,
ValueCache.cpp,
Hash.h, Hash.h,
MD5.cpp, MD5.cpp,
SHA1.cpp, SHA1.cpp,

View file

@ -155,21 +155,6 @@ void GetSystemMemoryStatus(uint64& total, uint64& available)
return; return;
} }
#endif #endif
#ifdef PLATFORM_FREEBSD
int64 page_size;
struct vmtotal vmt;
size_t vmt_size, uint_size;
vmt_size = sizeof(vmt);
uint_size = sizeof(page_size);
if(sysctlbyname("vm.vmtotal", &vmt, &vmt_size, NULL, 0) >= 0 &&
sysctlbyname("vm.stats.vm.v_page_size", &page_size, &uint_size, NULL, 0) >= 0) {
available = vmt.t_free * page_size;
total = vmt.t_avm * page_size;
return;
}
#endif
#ifdef PLATFORM_MACOS #ifdef PLATFORM_MACOS
mach_msg_type_number_t count = HOST_VM_INFO_COUNT; mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
vm_statistics_data_t vmstat; vm_statistics_data_t vmstat;
@ -191,6 +176,21 @@ void GetSystemMemoryStatus(uint64& total, uint64& available)
total = physical_memory; total = physical_memory;
return; return;
} }
#endif
#ifdef PLATFORM_FREEBSD
int64 page_size;
struct vmtotal vmt;
size_t vmt_size, uint_size;
vmt_size = sizeof(vmt);
uint_size = sizeof(page_size);
if(sysctlbyname("vm.vmtotal", &vmt, &vmt_size, NULL, 0) >= 0 &&
sysctlbyname("vm.stats.vm.v_page_size", &page_size, &uint_size, NULL, 0) >= 0) {
available = vmt.t_free * page_size;
total = vmt.t_avm * page_size;
return;
}
#endif #endif
total = 256*1024*1024; total = 256*1024*1024;
available = 16*1024*1024; available = 16*1024*1024;

View file

@ -349,10 +349,10 @@ private:
struct Key : Moveable<Key> { struct Key : Moveable<Key> {
K key; K key;
const void *type; String type;
bool operator==(const Key& b) const { return key == b.key && type == b.type; } bool operator==(const Key& b) const { return key == b.key && type == b.type; }
hash_t GetHashValue() const { return CombineHash(key, (uintptr_t)type); } hash_t GetHashValue() const { return CombineHash(key, type); }
}; };
Index<Key> key; Index<Key> key;
@ -366,6 +366,7 @@ private:
int newsize; int newsize;
bool flag; bool flag;
const int InternalSize = 3 * (sizeof(Item) + sizeof(Key) + 24) / 2;
void Unlink(int i); void Unlink(int i);
void LinkHead(int i); void LinkHead(int i);
@ -464,7 +465,7 @@ void LRUCache<T, K>::AdjustSize(P getsize)
if(!key.IsUnlinked(i)) { if(!key.IsUnlinked(i)) {
int sz = getsize(*data[i].data); int sz = getsize(*data[i].data);
if(sz >= 0) if(sz >= 0)
data[i].size = sz; data[i].size = sz + InternalSize;
size += data[i].size; size += data[i].size;
count++; count++;
} }
@ -540,12 +541,12 @@ T& LRUCache<T, K>::Get(const Maker& m)
{ {
Key k; Key k;
k.key = m.Key(); k.key = m.Key();
k.type = &typeid(m); k.type = typeid(m).name();
int q = key.Find(k); int q = key.Find(k);
if(q < 0) { if(q < 0) {
q = key.Put(k); q = key.Put(k);
Item& t = data.At(q); Item& t = data.At(q);
t.size = m.Make(t.data.Create()); t.size = m.Make(t.data.Create()) + InternalSize;
size += t.size; size += t.size;
newsize += t.size; newsize += t.size;
t.flag = flag; t.flag = flag;

View file

@ -0,0 +1,37 @@
#include "Core.h"
namespace Upp {
bool sFinished;
struct ValueMakeCacheClass : LRUCache<Value> {
~ValueMakeCacheClass() { sFinished = true; }
};
LRUCache<Value>& TheValueCache()
{
static ValueMakeCacheClass m;
return m;
}
int sMaxSize = 1000000;
void ShrinkValueCache()
{
TheValueCache().Shrink(sMaxSize, 2000);
}
void ShrinkValueCache(int maxsize)
{
sMaxSize = maxsize;
ShrinkValueCache();
}
Value MakeValue(ValueMaker& m)
{
Value v = TheValueCache().Get(m);
ShrinkValueCache();
return v;
}
};

20
uppsrc/Core/ValueCache.h Normal file
View file

@ -0,0 +1,20 @@
typedef LRUCache<Value>::Maker ValueMaker;
LRUCache<Value>& TheValueCache();
Value MakeValue(ValueMaker& m);
void ShrinkValueCache();
void ShrinkValueCache(int maxsize);
template <class P>
int ValueCacheRemove(P what)
{
return TheValueCache().Remove(what);
}
template <class P>
int ValueCacheRemoveOne(P what)
{
return TheValueCache().Remove(what);
}