/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 | 30.0k | Data * find(const Key & key) { |
43 | 30.0k | D * cur = static_cast<D *>(first); |
44 | 33.9k | while (cur && !cur->cache_key_eq(key)) |
45 | 3.87k | cur = static_cast<D *>(cur->next); |
46 | 30.0k | return cur; |
47 | 30.0k | } acommon::GlobalCache<acommon::Decode>::find(acommon::ConvKey const&) Line | Count | Source | 42 | 2.57k | Data * find(const Key & key) { | 43 | 2.57k | D * cur = static_cast<D *>(first); | 44 | 4.48k | while (cur && !cur->cache_key_eq(key)) | 45 | 1.90k | cur = static_cast<D *>(cur->next); | 46 | 2.57k | return cur; | 47 | 2.57k | } |
acommon::GlobalCache<acommon::Encode>::find(acommon::ConvKey const&) Line | Count | Source | 42 | 6.57k | Data * find(const Key & key) { | 43 | 6.57k | D * cur = static_cast<D *>(first); | 44 | 7.74k | while (cur && !cur->cache_key_eq(key)) | 45 | 1.17k | cur = static_cast<D *>(cur->next); | 46 | 6.57k | return cur; | 47 | 6.57k | } |
acommon::GlobalCache<acommon::NormTables>::find(char const* const&) Line | Count | Source | 42 | 7.97k | Data * find(const Key & key) { | 43 | 7.97k | D * cur = static_cast<D *>(first); | 44 | 7.97k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 7.97k | return cur; | 47 | 7.97k | } |
acommon::GlobalCache<acommon::ConfigFilterModule>::find(acommon::String const&) Line | Count | Source | 42 | 3.42k | Data * find(const Key & key) { | 43 | 3.42k | D * cur = static_cast<D *>(first); | 44 | 3.42k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 3.42k | return cur; | 47 | 3.42k | } |
acommon::GlobalCache<acommon::FilterModeList>::find(acommon::String const&) Line | Count | Source | 42 | 1.72k | Data * find(const Key & key) { | 43 | 1.72k | D * cur = static_cast<D *>(first); | 44 | 1.81k | while (cur && !cur->cache_key_eq(key)) | 45 | 93 | cur = static_cast<D *>(cur->next); | 46 | 1.72k | return cur; | 47 | 1.72k | } |
acommon::GlobalCache<aspeller::Language>::find(acommon::String const&) Line | Count | Source | 42 | 4.97k | Data * find(const Key & key) { | 43 | 4.97k | D * cur = static_cast<D *>(first); | 44 | 4.97k | while (cur && !cur->cache_key_eq(key)) | 45 | 1 | cur = static_cast<D *>(cur->next); | 46 | 4.97k | return cur; | 47 | 4.97k | } |
acommon::GlobalCache<aspeller::Dictionary>::find(aspeller::Dictionary::Id const&) Line | Count | Source | 42 | 1.41k | Data * find(const Key & key) { | 43 | 1.41k | D * cur = static_cast<D *>(first); | 44 | 2.11k | while (cur && !cur->cache_key_eq(key)) | 45 | 702 | cur = static_cast<D *>(cur->next); | 46 | 1.41k | return cur; | 47 | 1.41k | } |
acommon::GlobalCache<aspeller::TypoEditDistanceInfo>::find(char const* const&) Line | Count | Source | 42 | 1.39k | Data * find(const Key & key) { | 43 | 1.39k | D * cur = static_cast<D *>(first); | 44 | 1.39k | while (cur && !cur->cache_key_eq(key)) | 45 | 0 | cur = static_cast<D *>(cur->next); | 46 | 1.39k | return cur; | 47 | 1.39k | } |
|
48 | 7.54k | void add(Data * n) {GlobalCacheBase::add(n);} acommon::GlobalCache<acommon::Decode>::add(acommon::Decode*) Line | Count | Source | 48 | 1.45k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<acommon::Encode>::add(acommon::Encode*) Line | Count | Source | 48 | 1.48k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<acommon::NormTables>::add(acommon::NormTables*) Line | Count | Source | 48 | 668 | 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 | 1.10k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<aspeller::Language>::add(aspeller::Language*) Line | Count | Source | 48 | 718 | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<aspeller::Dictionary>::add(aspeller::Dictionary*) Line | Count | Source | 48 | 1.41k | void add(Data * n) {GlobalCacheBase::add(n);} |
acommon::GlobalCache<aspeller::TypoEditDistanceInfo>::add(aspeller::TypoEditDistanceInfo*) Line | Count | Source | 48 | 694 | 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 | 27.2k | { |
59 | 27.2k | LOCK(&cache->lock); |
60 | 27.2k | Data * n = cache->find(key); |
61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; |
62 | 27.2k | if (n) { |
63 | 18.3k | n->refcount++; |
64 | 18.3k | return n; |
65 | 18.3k | } |
66 | 8.86k | PosibErr<Data *> res = Data::get_new(key, config); |
67 | 8.86k | if (res.has_err()) { |
68 | | //CERR << "ERROR\n"; |
69 | 3.42k | return res; |
70 | 3.42k | } |
71 | 5.43k | n = res.data; |
72 | 5.43k | cache->add(n); |
73 | | //CERR << "LOADED FROM DISK\n"; |
74 | 5.43k | return n; |
75 | 8.86k | } 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 | 2.57k | { | 59 | 2.57k | LOCK(&cache->lock); | 60 | 2.57k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 2.57k | if (n) { | 63 | 1.11k | n->refcount++; | 64 | 1.11k | return n; | 65 | 1.11k | } | 66 | 1.46k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 1.46k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 8 | return res; | 70 | 8 | } | 71 | 1.45k | n = res.data; | 72 | 1.45k | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 1.45k | return n; | 75 | 1.46k | } |
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 | 6.57k | { | 59 | 6.57k | LOCK(&cache->lock); | 60 | 6.57k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 6.57k | if (n) { | 63 | 5.08k | n->refcount++; | 64 | 5.08k | return n; | 65 | 5.08k | } | 66 | 1.48k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 1.48k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 1.48k | n = res.data; | 72 | 1.48k | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 1.48k | return n; | 75 | 1.48k | } |
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 | 7.97k | { | 59 | 7.97k | LOCK(&cache->lock); | 60 | 7.97k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 7.97k | if (n) { | 63 | 7.30k | n->refcount++; | 64 | 7.30k | return n; | 65 | 7.30k | } | 66 | 668 | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 668 | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 668 | n = res.data; | 72 | 668 | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 668 | return n; | 75 | 668 | } |
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 | 3.42k | { | 59 | 3.42k | LOCK(&cache->lock); | 60 | 3.42k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 3.42k | if (n) { | 63 | 0 | n->refcount++; | 64 | 0 | return n; | 65 | 0 | } | 66 | 3.42k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 3.42k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 3.42k | return res; | 70 | 3.42k | } | 71 | 0 | n = res.data; | 72 | 0 | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 0 | return n; | 75 | 3.42k | } |
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 | 1.72k | { | 59 | 1.72k | LOCK(&cache->lock); | 60 | 1.72k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 1.72k | if (n) { | 63 | 618 | n->refcount++; | 64 | 618 | return n; | 65 | 618 | } | 66 | 1.10k | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 1.10k | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 1.10k | n = res.data; | 72 | 1.10k | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 1.10k | return n; | 75 | 1.10k | } |
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 | 4.97k | { | 59 | 4.97k | LOCK(&cache->lock); | 60 | 4.97k | Data * n = cache->find(key); | 61 | | //CERR << "Getting " << key << " for " << cache->name << "\n"; | 62 | 4.97k | if (n) { | 63 | 4.25k | n->refcount++; | 64 | 4.25k | return n; | 65 | 4.25k | } | 66 | 718 | PosibErr<Data *> res = Data::get_new(key, config); | 67 | 718 | if (res.has_err()) { | 68 | | //CERR << "ERROR\n"; | 69 | 0 | return res; | 70 | 0 | } | 71 | 718 | n = res.data; | 72 | 718 | cache->add(n); | 73 | | //CERR << "LOADED FROM DISK\n"; | 74 | 718 | return n; | 75 | 718 | } |
|
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.39k | { |
83 | 1.39k | LOCK(&cache->lock); |
84 | 1.39k | Data * n = cache->find(key); |
85 | | //CERR << "Getting " << key << "\n"; |
86 | 1.39k | if (n) { |
87 | 694 | n->refcount++; |
88 | 694 | return n; |
89 | 694 | } |
90 | 698 | PosibErr<Data *> res = Data::get_new(key, config, config2); |
91 | 698 | if (res.has_err()) { |
92 | | //CERR << "ERROR\n"; |
93 | 4 | return res; |
94 | 4 | } |
95 | 694 | n = res.data; |
96 | 694 | cache->add(n); |
97 | | //CERR << "LOADED FROM DISK\n"; |
98 | 694 | return n; |
99 | 698 | } |
100 | | |
101 | | } |
102 | | |
103 | | #endif |