/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 | 43.4k | Data * find(const Key & key) { |
43 | 43.4k | D * cur = static_cast<D *>(first); |
44 | 48.8k | while (cur && !cur->cache_key_eq(key)) |
45 | 5.42k | cur = static_cast<D *>(cur->next); |
46 | 43.4k | return cur; |
47 | 43.4k | } acommon::GlobalCache<acommon::Decode>::find(acommon::ConvKey const&) Line | Count | Source | 42 | 3.45k | Data * find(const Key & key) { | 43 | 3.45k | D * cur = static_cast<D *>(first); | 44 | 5.96k | while (cur && !cur->cache_key_eq(key)) | 45 | 2.51k | cur = static_cast<D *>(cur->next); | 46 | 3.45k | return cur; | 47 | 3.45k | } |
acommon::GlobalCache<acommon::Encode>::find(acommon::ConvKey const&) Line | Count | Source | 42 | 9.11k | Data * find(const Key & key) { | 43 | 9.11k | D * cur = static_cast<D *>(first); | 44 | 10.6k | while (cur && !cur->cache_key_eq(key)) | 45 | 1.50k | cur = static_cast<D *>(cur->next); | 46 | 9.11k | return cur; | 47 | 9.11k | } |
acommon::GlobalCache<acommon::NormTables>::find(char const* const&) Line | Count | Source | 42 | 11.2k | Data * find(const Key & key) { | 43 | 11.2k | D * cur = static_cast<D *>(first); | 44 | 11.2k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 11.2k | return cur; | 47 | 11.2k | } |
acommon::GlobalCache<acommon::ConfigFilterModule>::find(acommon::String const&) Line | Count | Source | 42 | 5.73k | Data * find(const Key & key) { | 43 | 5.73k | D * cur = static_cast<D *>(first); | 44 | 5.73k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 5.73k | return cur; | 47 | 5.73k | } |
acommon::GlobalCache<acommon::FilterModeList>::find(acommon::String const&) Line | Count | Source | 42 | 2.98k | Data * find(const Key & key) { | 43 | 2.98k | D * cur = static_cast<D *>(first); | 44 | 3.40k | while (cur && !cur->cache_key_eq(key)) | 45 | 415 | cur = static_cast<D *>(cur->next); | 46 | 2.98k | return cur; | 47 | 2.98k | } |
acommon::GlobalCache<aspeller::Language>::find(acommon::String const&) Line | Count | Source | 42 | 6.95k | Data * find(const Key & key) { | 43 | 6.95k | D * cur = static_cast<D *>(first); | 44 | 6.95k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 6.95k | return cur; | 47 | 6.95k | } |
acommon::GlobalCache<aspeller::Dictionary>::find(aspeller::Dictionary::Id const&) Line | Count | Source | 42 | 1.98k | Data * find(const Key & key) { | 43 | 1.98k | D * cur = static_cast<D *>(first); | 44 | 2.97k | while (cur && !cur->cache_key_eq(key)) | 45 | 991 | cur = static_cast<D *>(cur->next); | 46 | 1.98k | return cur; | 47 | 1.98k | } |
acommon::GlobalCache<aspeller::TypoEditDistanceInfo>::find(char const* const&) Line | Count | Source | 42 | 1.92k | Data * find(const Key & key) { | 43 | 1.92k | D * cur = static_cast<D *>(first); | 44 | 1.92k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 1.92k | return cur; | 47 | 1.92k | } |
|
48 | 11.3k | void add(Data * n) {GlobalCacheBase::add(n);}acommon::GlobalCache<acommon::Decode>::add(acommon::Decode*) Line | Count | Source | 48 | 2.00k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<acommon::Encode>::add(acommon::Encode*) Line | Count | Source | 48 | 2.04k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<acommon::NormTables>::add(acommon::NormTables*) Line | Count | Source | 48 | 947 | 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.36k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<aspeller::Language>::add(aspeller::Language*) Line | Count | Source | 48 | 997 | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<aspeller::Dictionary>::add(aspeller::Dictionary*) Line | Count | Source | 48 | 1.98k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<aspeller::TypoEditDistanceInfo>::add(aspeller::TypoEditDistanceInfo*) Line | Count | Source | 48 | 964 | 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 | 39.5k | { |
59 | 39.5k | LOCK(&cache->lock); |
60 | 39.5k | Data * n = cache->find(key); |
61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; |
62 | 39.5k | if (n) { |
63 | 25.4k | n->refcount++; |
64 | 25.4k | return n; |
65 | 25.4k | } |
66 | 14.1k | PosibErr<Data *> res = Data::get_new(key, config); |
67 | 14.1k | if (res.has_err()) { |
68 | | //CERR << "ERROR\n"; |
69 | 5.76k | return res; |
70 | 5.76k | } |
71 | 8.35k | n = res.data; |
72 | 8.35k | cache->add(n); |
73 | | //CERR << "LOADED FROM DISK\n"; |
74 | 8.35k | return n; |
75 | 14.1k | } 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.45k | { | 59 | 3.45k | LOCK(&cache->lock); | 60 | 3.45k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 3.45k | if (n) { | 63 | 1.42k | n->refcount++; | 64 | 1.42k | return n; | 65 | 1.42k | } | 66 | 2.03k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 2.03k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 22 | return res; | 70 | 22 | } | 71 | 2.00k | n = res.data; | 72 | 2.00k | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 2.00k | return n; | 75 | 2.03k | } |
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 | 9.11k | { | 59 | 9.11k | LOCK(&cache->lock); | 60 | 9.11k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 9.11k | if (n) { | 63 | 7.07k | n->refcount++; | 64 | 7.07k | return n; | 65 | 7.07k | } | 66 | 2.04k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 2.04k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 2.04k | n = res.data; | 72 | 2.04k | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 2.04k | return n; | 75 | 2.04k | } |
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 | 11.2k | { | 59 | 11.2k | LOCK(&cache->lock); | 60 | 11.2k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 11.2k | if (n) { | 63 | 10.3k | n->refcount++; | 64 | 10.3k | return n; | 65 | 10.3k | } | 66 | 947 | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 947 | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 947 | n = res.data; | 72 | 947 | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 947 | return n; | 75 | 947 | } |
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.73k | { | 59 | 5.73k | LOCK(&cache->lock); | 60 | 5.73k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 5.73k | if (n) { | 63 | 0 | n->refcount++; | 64 | 0 | return n; | 65 | 0 | } | 66 | 5.73k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 5.73k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 5.73k | return res; | 70 | 5.73k | } | 71 | 0 | n = res.data; | 72 | 0 | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 0 | return n; | 75 | 5.73k | } |
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.98k | { | 59 | 2.98k | LOCK(&cache->lock); | 60 | 2.98k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 2.98k | if (n) { | 63 | 625 | n->refcount++; | 64 | 625 | return n; | 65 | 625 | } | 66 | 2.36k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 2.36k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 2.36k | n = res.data; | 72 | 2.36k | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 2.36k | return n; | 75 | 2.36k | } |
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.95k | { | 59 | 6.95k | LOCK(&cache->lock); | 60 | 6.95k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 6.95k | if (n) { | 63 | 5.95k | n->refcount++; | 64 | 5.95k | return n; | 65 | 5.95k | } | 66 | 998 | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 998 | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 1 | return res; | 70 | 1 | } | 71 | 997 | n = res.data; | 72 | 997 | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 997 | return n; | 75 | 998 | } |
|
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.92k | { |
83 | 1.92k | LOCK(&cache->lock); |
84 | 1.92k | Data * n = cache->find(key); |
85 | | //CERR << "Getting " << key << "\n"; |
86 | 1.92k | if (n) { |
87 | 964 | n->refcount++; |
88 | 964 | return n; |
89 | 964 | } |
90 | 965 | PosibErr<Data *> res = Data::get_new(key, config, config2); |
91 | 965 | if (res.has_err()) { |
92 | | //CERR << "ERROR\n"; |
93 | 1 | return res; |
94 | 1 | } |
95 | 964 | n = res.data; |
96 | 964 | cache->add(n); |
97 | | //CERR << "LOADED FROM DISK\n"; |
98 | 964 | return n; |
99 | 965 | } |
100 | | |
101 | | } |
102 | | |
103 | | #endif |