/src/aspell/common/cache-t.hpp
Line | Count | Source |
1 | | #ifndef ACOMMON_CACHE_T__HPP |
2 | | #define ACOMMON_CACHE_T__HPP |
3 | | |
4 | | #include "lock.hpp" |
5 | | #include "cache.hpp" |
6 | | |
7 | | //#include "iostream.hpp" |
8 | | |
9 | | namespace acommon { |
10 | | |
11 | | class GlobalCacheBase |
12 | | { |
13 | | public: |
14 | | mutable Mutex lock; |
15 | | public: // but don't use |
16 | | const char * name; |
17 | | GlobalCacheBase * next; |
18 | | GlobalCacheBase * * prev; |
19 | | // The global cache lock must exist while any cache instance is active |
20 | | static Mutex global_cache_lock; |
21 | | protected: |
22 | | Cacheable * first; |
23 | | void del(Cacheable * d); |
24 | | void add(Cacheable * n); |
25 | | GlobalCacheBase(const char * n); |
26 | | ~GlobalCacheBase(); |
27 | | public: |
28 | | void release(Cacheable * d); |
29 | | void detach(Cacheable * d); |
30 | | void detach_all(); |
31 | | }; |
32 | | |
33 | | template <class D> |
34 | | class GlobalCache : public GlobalCacheBase |
35 | | { |
36 | | public: |
37 | | typedef D Data; |
38 | | typedef typename Data::CacheKey Key; |
39 | | public: |
40 | 16 | GlobalCache(const char * n) : GlobalCacheBase(n) {}acommon::GlobalCache<acommon::Decode>::GlobalCache(char const*) Line | Count | Source | 40 | 2 | GlobalCache(const char * n) : GlobalCacheBase(n) {} |
acommon::GlobalCache<acommon::Encode>::GlobalCache(char const*) Line | Count | Source | 40 | 2 | GlobalCache(const char * n) : GlobalCacheBase(n) {} |
acommon::GlobalCache<acommon::NormTables>::GlobalCache(char const*) Line | Count | Source | 40 | 2 | GlobalCache(const char * n) : GlobalCacheBase(n) {} |
acommon::GlobalCache<acommon::ConfigFilterModule>::GlobalCache(char const*) Line | Count | Source | 40 | 2 | GlobalCache(const char * n) : GlobalCacheBase(n) {} |
acommon::GlobalCache<acommon::FilterModeList>::GlobalCache(char const*) Line | Count | Source | 40 | 2 | GlobalCache(const char * n) : GlobalCacheBase(n) {} |
acommon::GlobalCache<aspeller::Language>::GlobalCache(char const*) Line | Count | Source | 40 | 2 | GlobalCache(const char * n) : GlobalCacheBase(n) {} |
acommon::GlobalCache<aspeller::Dictionary>::GlobalCache(char const*) Line | Count | Source | 40 | 2 | GlobalCache(const char * n) : GlobalCacheBase(n) {} |
acommon::GlobalCache<aspeller::TypoEditDistanceInfo>::GlobalCache(char const*) Line | Count | Source | 40 | 2 | GlobalCache(const char * n) : GlobalCacheBase(n) {} |
|
41 | | // "find" and "add" will _not_ acquire a lock |
42 | 40.6k | Data * find(const Key & key) { |
43 | 40.6k | D * cur = static_cast<D *>(first); |
44 | 46.2k | while (cur && !cur->cache_key_eq(key)) |
45 | 5.62k | cur = static_cast<D *>(cur->next); |
46 | 40.6k | return cur; |
47 | 40.6k | } acommon::GlobalCache<acommon::Decode>::find(acommon::ConvKey const&) Line | Count | Source | 42 | 3.22k | Data * find(const Key & key) { | 43 | 3.22k | D * cur = static_cast<D *>(first); | 44 | 5.59k | while (cur && !cur->cache_key_eq(key)) | 45 | 2.37k | cur = static_cast<D *>(cur->next); | 46 | 3.22k | return cur; | 47 | 3.22k | } |
acommon::GlobalCache<acommon::Encode>::find(acommon::ConvKey const&) Line | Count | Source | 42 | 8.28k | Data * find(const Key & key) { | 43 | 8.28k | D * cur = static_cast<D *>(first); | 44 | 9.75k | while (cur && !cur->cache_key_eq(key)) | 45 | 1.46k | cur = static_cast<D *>(cur->next); | 46 | 8.28k | return cur; | 47 | 8.28k | } |
acommon::GlobalCache<acommon::NormTables>::find(char const* const&) Line | Count | Source | 42 | 10.1k | Data * find(const Key & key) { | 43 | 10.1k | D * cur = static_cast<D *>(first); | 44 | 10.1k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 10.1k | return cur; | 47 | 10.1k | } |
acommon::GlobalCache<acommon::ConfigFilterModule>::find(acommon::String const&) Line | Count | Source | 42 | 5.75k | Data * find(const Key & key) { | 43 | 5.75k | D * cur = static_cast<D *>(first); | 44 | 5.75k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 5.75k | return cur; | 47 | 5.75k | } |
acommon::GlobalCache<acommon::FilterModeList>::find(acommon::String const&) Line | Count | Source | 42 | 3.35k | Data * find(const Key & key) { | 43 | 3.35k | D * cur = static_cast<D *>(first); | 44 | 4.24k | while (cur && !cur->cache_key_eq(key)) | 45 | 894 | cur = static_cast<D *>(cur->next); | 46 | 3.35k | return cur; | 47 | 3.35k | } |
acommon::GlobalCache<aspeller::Language>::find(acommon::String const&) Line | Count | Source | 42 | 6.28k | Data * find(const Key & key) { | 43 | 6.28k | D * cur = static_cast<D *>(first); | 44 | 6.28k | while (cur && !cur->cache_key_eq(key)) | 45 | 1 | cur = static_cast<D *>(cur->next); | 46 | 6.28k | return cur; | 47 | 6.28k | } |
acommon::GlobalCache<aspeller::Dictionary>::find(aspeller::Dictionary::Id const&) Line | Count | Source | 42 | 1.79k | Data * find(const Key & key) { | 43 | 1.79k | D * cur = static_cast<D *>(first); | 44 | 2.68k | while (cur && !cur->cache_key_eq(key)) | 45 | 893 | cur = static_cast<D *>(cur->next); | 46 | 1.79k | return cur; | 47 | 1.79k | } |
acommon::GlobalCache<aspeller::TypoEditDistanceInfo>::find(char const* const&) Line | Count | Source | 42 | 1.76k | Data * find(const Key & key) { | 43 | 1.76k | D * cur = static_cast<D *>(first); | 44 | 1.76k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 1.76k | return cur; | 47 | 1.76k | } |
|
48 | 11.0k | void add(Data * n) {GlobalCacheBase::add(n);}acommon::GlobalCache<acommon::Decode>::add(acommon::Decode*) Line | Count | Source | 48 | 1.83k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<acommon::Encode>::add(acommon::Encode*) Line | Count | Source | 48 | 1.88k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<acommon::NormTables>::add(acommon::NormTables*) Line | Count | Source | 48 | 852 | void add(Data * n) {GlobalCacheBase::add(n);} |
Unexecuted instantiation: acommon::GlobalCache<acommon::ConfigFilterModule>::add(acommon::ConfigFilterModule*) acommon::GlobalCache<acommon::FilterModeList>::add(acommon::FilterModeList*) Line | Count | Source | 48 | 2.85k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<aspeller::Language>::add(aspeller::Language*) Line | Count | Source | 48 | 905 | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<aspeller::Dictionary>::add(aspeller::Dictionary*) Line | Count | Source | 48 | 1.79k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<aspeller::TypoEditDistanceInfo>::add(aspeller::TypoEditDistanceInfo*) Line | Count | Source | 48 | 882 | void add(Data * n) {GlobalCacheBase::add(n);} |
|
49 | | // "release" and "detach" _will_ acquire a lock |
50 | | void release(Data * d) {GlobalCacheBase::release(d);} |
51 | | void detach(Data * d) {GlobalCacheBase::detach(d);} |
52 | | }; |
53 | | |
54 | | template <class Data> |
55 | | PosibErr<Data *> get_cache_data(GlobalCache<Data> * cache, |
56 | | typename Data::CacheConfig * config, |
57 | | const typename Data::CacheKey & key) |
58 | 37.0k | { |
59 | 37.0k | LOCK(&cache->lock); |
60 | 37.0k | Data * n = cache->find(key); |
61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; |
62 | 37.0k | if (n) { |
63 | 22.9k | n->refcount++; |
64 | 22.9k | return n; |
65 | 22.9k | } |
66 | 14.0k | PosibErr<Data *> res = Data::get_new(key, config); |
67 | 14.0k | if (res.has_err()) { |
68 | | //CERR << "ERROR\n"; |
69 | 5.76k | return res; |
70 | 5.76k | } |
71 | 8.32k | n = res.data; |
72 | 8.32k | cache->add(n); |
73 | | //CERR << "LOADED FROM DISK\n"; |
74 | 8.32k | return n; |
75 | 14.0k | } acommon::PosibErr<acommon::Decode*> acommon::get_cache_data<acommon::Decode>(acommon::GlobalCache<acommon::Decode>*, acommon::Decode::CacheConfig*, acommon::Decode::CacheKey const&) Line | Count | Source | 58 | 3.22k | { | 59 | 3.22k | LOCK(&cache->lock); | 60 | 3.22k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 3.22k | if (n) { | 63 | 1.37k | n->refcount++; | 64 | 1.37k | return n; | 65 | 1.37k | } | 66 | 1.84k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 1.84k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 11 | return res; | 70 | 11 | } | 71 | 1.83k | n = res.data; | 72 | 1.83k | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 1.83k | return n; | 75 | 1.84k | } |
acommon::PosibErr<acommon::Encode*> acommon::get_cache_data<acommon::Encode>(acommon::GlobalCache<acommon::Encode>*, acommon::Encode::CacheConfig*, acommon::Encode::CacheKey const&) Line | Count | Source | 58 | 8.28k | { | 59 | 8.28k | LOCK(&cache->lock); | 60 | 8.28k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 8.28k | if (n) { | 63 | 6.40k | n->refcount++; | 64 | 6.40k | return n; | 65 | 6.40k | } | 66 | 1.88k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 1.88k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 1.88k | n = res.data; | 72 | 1.88k | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 1.88k | return n; | 75 | 1.88k | } |
acommon::PosibErr<acommon::NormTables*> acommon::get_cache_data<acommon::NormTables>(acommon::GlobalCache<acommon::NormTables>*, acommon::NormTables::CacheConfig*, acommon::NormTables::CacheKey const&) Line | Count | Source | 58 | 10.1k | { | 59 | 10.1k | LOCK(&cache->lock); | 60 | 10.1k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 10.1k | if (n) { | 63 | 9.29k | n->refcount++; | 64 | 9.29k | return n; | 65 | 9.29k | } | 66 | 852 | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 852 | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 852 | n = res.data; | 72 | 852 | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 852 | return n; | 75 | 852 | } |
acommon::PosibErr<acommon::ConfigFilterModule*> acommon::get_cache_data<acommon::ConfigFilterModule>(acommon::GlobalCache<acommon::ConfigFilterModule>*, acommon::ConfigFilterModule::CacheConfig*, acommon::ConfigFilterModule::CacheKey const&) Line | Count | Source | 58 | 5.75k | { | 59 | 5.75k | LOCK(&cache->lock); | 60 | 5.75k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 5.75k | if (n) { | 63 | 0 | n->refcount++; | 64 | 0 | return n; | 65 | 0 | } | 66 | 5.75k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 5.75k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 5.75k | return res; | 70 | 5.75k | } | 71 | 0 | n = res.data; | 72 | 0 | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 0 | return n; | 75 | 5.75k | } |
acommon::PosibErr<acommon::FilterModeList*> acommon::get_cache_data<acommon::FilterModeList>(acommon::GlobalCache<acommon::FilterModeList>*, acommon::FilterModeList::CacheConfig*, acommon::FilterModeList::CacheKey const&) Line | Count | Source | 58 | 3.35k | { | 59 | 3.35k | LOCK(&cache->lock); | 60 | 3.35k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 3.35k | if (n) { | 63 | 494 | n->refcount++; | 64 | 494 | return n; | 65 | 494 | } | 66 | 2.85k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 2.85k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 2.85k | n = res.data; | 72 | 2.85k | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 2.85k | return n; | 75 | 2.85k | } |
acommon::PosibErr<aspeller::Language*> acommon::get_cache_data<aspeller::Language>(acommon::GlobalCache<aspeller::Language>*, aspeller::Language::CacheConfig*, aspeller::Language::CacheKey const&) Line | Count | Source | 58 | 6.28k | { | 59 | 6.28k | LOCK(&cache->lock); | 60 | 6.28k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 6.28k | if (n) { | 63 | 5.37k | n->refcount++; | 64 | 5.37k | return n; | 65 | 5.37k | } | 66 | 905 | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 905 | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 905 | n = res.data; | 72 | 905 | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 905 | return n; | 75 | 905 | } |
|
76 | | |
77 | | template <class Data> |
78 | | PosibErr<Data *> get_cache_data(GlobalCache<Data> * cache, |
79 | | typename Data::CacheConfig * config, |
80 | | typename Data::CacheConfig2 * config2, |
81 | | const typename Data::CacheKey & key) |
82 | 1.76k | { |
83 | 1.76k | LOCK(&cache->lock); |
84 | 1.76k | Data * n = cache->find(key); |
85 | | //CERR << "Getting " << key << "\n"; |
86 | 1.76k | if (n) { |
87 | 882 | n->refcount++; |
88 | 882 | return n; |
89 | 882 | } |
90 | 885 | PosibErr<Data *> res = Data::get_new(key, config, config2); |
91 | 885 | if (res.has_err()) { |
92 | | //CERR << "ERROR\n"; |
93 | 3 | return res; |
94 | 3 | } |
95 | 882 | n = res.data; |
96 | 882 | cache->add(n); |
97 | | //CERR << "LOADED FROM DISK\n"; |
98 | 882 | return n; |
99 | 885 | } |
100 | | |
101 | | } |
102 | | |
103 | | #endif |