/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.7k | Data * find(const Key & key) { |
43 | 40.7k | D * cur = static_cast<D *>(first); |
44 | 46.1k | while (cur && !cur->cache_key_eq(key)) |
45 | 5.40k | cur = static_cast<D *>(cur->next); |
46 | 40.7k | return cur; |
47 | 40.7k | } acommon::GlobalCache<acommon::Decode>::find(acommon::ConvKey const&) Line | Count | Source | 42 | 3.27k | Data * find(const Key & key) { | 43 | 3.27k | D * cur = static_cast<D *>(first); | 44 | 5.64k | while (cur && !cur->cache_key_eq(key)) | 45 | 2.37k | cur = static_cast<D *>(cur->next); | 46 | 3.27k | return cur; | 47 | 3.27k | } |
acommon::GlobalCache<acommon::Encode>::find(acommon::ConvKey const&) Line | Count | Source | 42 | 8.56k | Data * find(const Key & key) { | 43 | 8.56k | D * cur = static_cast<D *>(first); | 44 | 10.0k | while (cur && !cur->cache_key_eq(key)) | 45 | 1.43k | cur = static_cast<D *>(cur->next); | 46 | 8.56k | return cur; | 47 | 8.56k | } |
acommon::GlobalCache<acommon::NormTables>::find(char const* const&) Line | Count | Source | 42 | 10.5k | Data * find(const Key & key) { | 43 | 10.5k | D * cur = static_cast<D *>(first); | 44 | 10.5k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 10.5k | return cur; | 47 | 10.5k | } |
acommon::GlobalCache<acommon::ConfigFilterModule>::find(acommon::String const&) Line | Count | Source | 42 | 5.15k | Data * find(const Key & key) { | 43 | 5.15k | D * cur = static_cast<D *>(first); | 44 | 5.15k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 5.15k | return cur; | 47 | 5.15k | } |
acommon::GlobalCache<acommon::FilterModeList>::find(acommon::String const&) Line | Count | Source | 42 | 2.95k | Data * find(const Key & key) { | 43 | 2.95k | D * cur = static_cast<D *>(first); | 44 | 3.61k | while (cur && !cur->cache_key_eq(key)) | 45 | 667 | cur = static_cast<D *>(cur->next); | 46 | 2.95k | return cur; | 47 | 2.95k | } |
acommon::GlobalCache<aspeller::Language>::find(acommon::String const&) Line | Count | Source | 42 | 6.53k | Data * find(const Key & key) { | 43 | 6.53k | D * cur = static_cast<D *>(first); | 44 | 6.53k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 6.53k | return cur; | 47 | 6.53k | } |
acommon::GlobalCache<aspeller::Dictionary>::find(aspeller::Dictionary::Id const&) Line | Count | Source | 42 | 1.86k | Data * find(const Key & key) { | 43 | 1.86k | D * cur = static_cast<D *>(first); | 44 | 2.79k | while (cur && !cur->cache_key_eq(key)) | 45 | 926 | cur = static_cast<D *>(cur->next); | 46 | 1.86k | return cur; | 47 | 1.86k | } |
acommon::GlobalCache<aspeller::TypoEditDistanceInfo>::find(char const* const&) Line | Count | Source | 42 | 1.80k | Data * find(const Key & key) { | 43 | 1.80k | D * cur = static_cast<D *>(first); | 44 | 1.80k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 1.80k | return cur; | 47 | 1.80k | } |
|
48 | 10.8k | void add(Data * n) {GlobalCacheBase::add(n);}acommon::GlobalCache<acommon::Decode>::add(acommon::Decode*) Line | Count | Source | 48 | 1.89k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<acommon::Encode>::add(acommon::Encode*) Line | Count | Source | 48 | 1.93k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<acommon::NormTables>::add(acommon::NormTables*) Line | Count | Source | 48 | 890 | 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.46k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<aspeller::Language>::add(aspeller::Language*) Line | Count | Source | 48 | 940 | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<aspeller::Dictionary>::add(aspeller::Dictionary*) Line | Count | Source | 48 | 1.86k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<aspeller::TypoEditDistanceInfo>::add(aspeller::TypoEditDistanceInfo*) Line | Count | Source | 48 | 899 | 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 | 23.7k | n->refcount++; |
64 | 23.7k | return n; |
65 | 23.7k | } |
66 | 13.2k | PosibErr<Data *> res = Data::get_new(key, config); |
67 | 13.2k | if (res.has_err()) { |
68 | | //CERR << "ERROR\n"; |
69 | 5.18k | return res; |
70 | 5.18k | } |
71 | 8.11k | n = res.data; |
72 | 8.11k | cache->add(n); |
73 | | //CERR << "LOADED FROM DISK\n"; |
74 | 8.11k | return n; |
75 | 13.2k | } 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.27k | { | 59 | 3.27k | LOCK(&cache->lock); | 60 | 3.27k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 3.27k | if (n) { | 63 | 1.35k | n->refcount++; | 64 | 1.35k | return n; | 65 | 1.35k | } | 66 | 1.91k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 1.91k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 23 | return res; | 70 | 23 | } | 71 | 1.89k | n = res.data; | 72 | 1.89k | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 1.89k | return n; | 75 | 1.91k | } |
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.56k | { | 59 | 8.56k | LOCK(&cache->lock); | 60 | 8.56k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 8.56k | if (n) { | 63 | 6.63k | n->refcount++; | 64 | 6.63k | return n; | 65 | 6.63k | } | 66 | 1.93k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 1.93k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 1.93k | n = res.data; | 72 | 1.93k | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 1.93k | return n; | 75 | 1.93k | } |
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.5k | { | 59 | 10.5k | LOCK(&cache->lock); | 60 | 10.5k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 10.5k | if (n) { | 63 | 9.70k | n->refcount++; | 64 | 9.70k | return n; | 65 | 9.70k | } | 66 | 890 | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 890 | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 890 | n = res.data; | 72 | 890 | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 890 | return n; | 75 | 890 | } |
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.15k | { | 59 | 5.15k | LOCK(&cache->lock); | 60 | 5.15k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 5.15k | if (n) { | 63 | 0 | n->refcount++; | 64 | 0 | return n; | 65 | 0 | } | 66 | 5.15k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 5.15k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 5.15k | return res; | 70 | 5.15k | } | 71 | 0 | n = res.data; | 72 | 0 | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 0 | return n; | 75 | 5.15k | } |
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 | 2.95k | { | 59 | 2.95k | LOCK(&cache->lock); | 60 | 2.95k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 2.95k | if (n) { | 63 | 488 | n->refcount++; | 64 | 488 | return n; | 65 | 488 | } | 66 | 2.46k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 2.46k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 2.46k | n = res.data; | 72 | 2.46k | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 2.46k | return n; | 75 | 2.46k | } |
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.53k | { | 59 | 6.53k | LOCK(&cache->lock); | 60 | 6.53k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 6.53k | if (n) { | 63 | 5.59k | n->refcount++; | 64 | 5.59k | return n; | 65 | 5.59k | } | 66 | 940 | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 940 | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 940 | n = res.data; | 72 | 940 | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 940 | return n; | 75 | 940 | } |
|
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.80k | { |
83 | 1.80k | LOCK(&cache->lock); |
84 | 1.80k | Data * n = cache->find(key); |
85 | | //CERR << "Getting " << key << "\n"; |
86 | 1.80k | if (n) { |
87 | 899 | n->refcount++; |
88 | 899 | return n; |
89 | 899 | } |
90 | 902 | PosibErr<Data *> res = Data::get_new(key, config, config2); |
91 | 902 | if (res.has_err()) { |
92 | | //CERR << "ERROR\n"; |
93 | 3 | return res; |
94 | 3 | } |
95 | 899 | n = res.data; |
96 | 899 | cache->add(n); |
97 | | //CERR << "LOADED FROM DISK\n"; |
98 | 899 | return n; |
99 | 902 | } |
100 | | |
101 | | } |
102 | | |
103 | | #endif |