Release v0.6.35: reduce resident memory and compact shared dictionaries
This commit is contained in:
+66
-14
@@ -23,20 +23,6 @@ void rejects(const std::function<void()> &f, const char *name)
|
||||
bool thrown = false;
|
||||
try
|
||||
{
|
||||
{
|
||||
std::map<std::wstring,int> previews;
|
||||
std::set<std::wstring> visible;
|
||||
for(int i=0;i<40;++i) previews[std::to_wstring(i)]=i;
|
||||
for(int i=0;i<8;++i) visible.insert(std::to_wstring(i));
|
||||
ks::trimHistoryPreviews(previews,visible);
|
||||
require(previews.size()==32,"preview cache stays bounded");
|
||||
for(const auto &id:visible) require(previews.contains(id),"visible preview survives eviction");
|
||||
for(int i=0;i<40;++i) { auto id=std::to_wstring(i); previews[id]=i; visible.insert(id); }
|
||||
ks::trimHistoryPreviews(previews,visible);
|
||||
require(previews.size()==40,"tall viewport does not thrash visible previews");
|
||||
visible.clear(); ks::trimHistoryPreviews(previews,visible);
|
||||
require(previews.size()==32,"cache shrinks after leaving tall viewport");
|
||||
}
|
||||
f();
|
||||
}
|
||||
catch (...)
|
||||
@@ -60,6 +46,34 @@ int main(int argc, char **argv)
|
||||
}
|
||||
try
|
||||
{
|
||||
// Byte budgets must retain visible entries even when they alone exceed the budget.
|
||||
{
|
||||
std::map<std::wstring, size_t> cache{{L"a", 800}, {L"b", 800}, {L"c", 100}};
|
||||
std::set<std::wstring> visible{L"b"};
|
||||
auto weight=[](size_t bytes) { return bytes; };
|
||||
ks::trimHistoryPreviews(cache, visible, 32, 1000, weight);
|
||||
require(cache.size()==2 && cache.contains(L"b") && cache.contains(L"c"),
|
||||
"byte budget evicts offscreen previews below count limit");
|
||||
ks::trimHistoryPreviews(cache, visible, 32, 100, weight);
|
||||
require(cache.size()==1 && cache.contains(L"b"), "oversized visible preview never thrashes");
|
||||
visible.clear();
|
||||
ks::trimHistoryPreviews(cache, visible, 32, 100, weight);
|
||||
require(cache.empty(), "oversized preview is freed after leaving viewport");
|
||||
}
|
||||
{
|
||||
std::map<std::wstring,int> previews;
|
||||
std::set<std::wstring> visible;
|
||||
for(int i=0;i<40;++i) previews[std::to_wstring(i)]=i;
|
||||
for(int i=0;i<8;++i) visible.insert(std::to_wstring(i));
|
||||
ks::trimHistoryPreviews(previews,visible);
|
||||
require(previews.size()==32,"preview cache stays bounded");
|
||||
for(const auto &id:visible) require(previews.contains(id),"visible preview survives eviction");
|
||||
for(int i=0;i<40;++i) { auto id=std::to_wstring(i); previews[id]=i; visible.insert(id); }
|
||||
ks::trimHistoryPreviews(previews,visible);
|
||||
require(previews.size()==40,"tall viewport does not thrash visible previews");
|
||||
visible.clear(); ks::trimHistoryPreviews(previews,visible);
|
||||
require(previews.size()==32,"cache shrinks after leaving tall viewport");
|
||||
}
|
||||
{
|
||||
ks::DiagnosticJson record{{"attempt", "42"}, {"process", "editor.exe"}, {"command", "Convert / cycle"},
|
||||
{"source", "English"}, {"target", "Ukrainian"}, {"outcome", "Original text remained"},
|
||||
@@ -99,6 +113,10 @@ int main(int argc, char **argv)
|
||||
"large diagnostic selections are explicitly truncated");
|
||||
STARTUPINFOW startup{sizeof(startup)};
|
||||
ks::DiagnosticBuffer diagnostics;
|
||||
diagnostics.record(L"idle-expiry", false, 0);
|
||||
require(diagnostics.expire(30000)==0,"diagnostics remain available at expiry boundary");
|
||||
require(diagnostics.expire(30001)==1,"idle expiry releases context without another log event");
|
||||
require(diagnostics.expire(60000)==0,"repeated idle expiry is safe");
|
||||
require(diagnostics.record(L"successful-attempt", false, 100).empty(),
|
||||
"successful diagnostics stay in memory");
|
||||
auto incident = diagnostics.record(L"failed-attempt", true, 200);
|
||||
@@ -217,6 +235,26 @@ int main(int argc, char **argv)
|
||||
require(!autoSettings.autoCorrect, "auto-correction defaults off");
|
||||
autoSettings.cycle = {L"en", L"uk"};
|
||||
corrector.configure(L"dictionaries", autoSettings.autoLanguages);
|
||||
{
|
||||
ks::AutoCorrector consumer;
|
||||
consumer.shareDictionaries(corrector);
|
||||
require(consumer.suggest(L"ghbdsn ", 0, layouts, autoSettings).has_value(),
|
||||
"shared dictionaries produce the same correction");
|
||||
consumer.reject(L"ghbdsn");
|
||||
consumer.shareDictionaries(corrector);
|
||||
require(!consumer.suggest(L"ghbdsn ", 0, layouts, autoSettings),
|
||||
"refreshing shared dictionaries preserves consumer undo rejections");
|
||||
require(corrector.suggest(L"ghbdsn ", 0, layouts, autoSettings).has_value(),
|
||||
"consumer rejections do not affect the predictor");
|
||||
ks::AutoCorrector retained;
|
||||
retained.shareDictionaries(corrector);
|
||||
corrector.configure({}, {});
|
||||
require(retained.suggest(L"ghbdsn ", 0, layouts, autoSettings).has_value(),
|
||||
"in-flight dictionary snapshot survives source reset");
|
||||
consumer.shareDictionaries(corrector);
|
||||
require(consumer.memoryBytes() == 0, "disabled correction releases consumer dictionaries");
|
||||
corrector.shareDictionaries(retained);
|
||||
}
|
||||
{
|
||||
auto options = autoSettings;
|
||||
options.autoTypos = true;
|
||||
@@ -545,6 +583,20 @@ int main(int argc, char **argv)
|
||||
require(!ambiguous.suggest(L"hell ", 0, layouts, options), "frequency filter does not conceal ambiguous typo targets");
|
||||
}
|
||||
ks::Pixels pixels{2, 1, {10, 20, 30, 255, 40, 50, 60, 255}};
|
||||
{
|
||||
auto png = ks::encodePng(pixels);
|
||||
ks::Clip encoded{{{0, L"PNG", png}}};
|
||||
for (int i=0; i<3; ++i) {
|
||||
auto decoded=ks::decodeImage(encoded);
|
||||
require(decoded.bgra==pixels.bgra && decoded.width==2 && decoded.height==1,
|
||||
"borrowed PNG stream preserves decoded pixels on repeated reads");
|
||||
require(encoded.formats[0].data==png,"PNG decoder never modifies the borrowed input");
|
||||
}
|
||||
ks::Clip fallback{{{0,L"PNG",{}},ks::imageDib(pixels)}};
|
||||
require(ks::decodeImage(fallback).bgra==pixels.bgra,"empty PNG falls back to DIB");
|
||||
ks::Clip invalid{{{0,L"PNG",{1,2,3}}}};
|
||||
rejects([&] { ks::decodeImage(invalid); },"invalid borrowed PNG fails safely");
|
||||
}
|
||||
ks::Clip firstImage{{ks::imageDib(pixels), {0, L"Ole Private Data", {1, 2, 3}}}};
|
||||
auto thumbnail = ks::decodeImage(firstImage, 1, 1);
|
||||
require(thumbnail.width == 1 && thumbnail.height == 1 && thumbnail.bgra.size() == 4,
|
||||
|
||||
Reference in New Issue
Block a user