Coverage Report

Created: 2025-11-09 07:04

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
50.2k
  Data * find(const Key & key) {
43
50.2k
    D * cur = static_cast<D *>(first);
44
56.6k
    while (cur && !cur->cache_key_eq(key))
45
6.34k
      cur = static_cast<D *>(cur->next);
46
50.2k
    return cur;
47
50.2k
  }
acommon::GlobalCache<acommon::Decode>::find(acommon::ConvKey const&)
Line
Count
Source
42
4.04k
  Data * find(const Key & key) {
43
4.04k
    D * cur = static_cast<D *>(first);
44
6.96k
    while (cur && !cur->cache_key_eq(key))
45
2.92k
      cur = static_cast<D *>(cur->next);
46
4.04k
    return cur;
47
4.04k
  }
acommon::GlobalCache<acommon::Encode>::find(acommon::ConvKey const&)
Line
Count
Source
42
10.5k
  Data * find(const Key & key) {
43
10.5k
    D * cur = static_cast<D *>(first);
44
12.3k
    while (cur && !cur->cache_key_eq(key))
45
1.75k
      cur = static_cast<D *>(cur->next);
46
10.5k
    return cur;
47
10.5k
  }
acommon::GlobalCache<acommon::NormTables>::find(char const* const&)
Line
Count
Source
42
13.1k
  Data * find(const Key & key) {
43
13.1k
    D * cur = static_cast<D *>(first);
44
13.1k
    while (cur && !cur->cache_key_eq(key))
45
0
      cur = static_cast<D *>(cur->next);
46
13.1k
    return cur;
47
13.1k
  }
acommon::GlobalCache<acommon::ConfigFilterModule>::find(acommon::String const&)
Line
Count
Source
42
6.48k
  Data * find(const Key & key) {
43
6.48k
    D * cur = static_cast<D *>(first);
44
6.48k
    while (cur && !cur->cache_key_eq(key))
45
0
      cur = static_cast<D *>(cur->next);
46
6.48k
    return cur;
47
6.48k
  }
acommon::GlobalCache<acommon::FilterModeList>::find(acommon::String const&)
Line
Count
Source
42
3.40k
  Data * find(const Key & key) {
43
3.40k
    D * cur = static_cast<D *>(first);
44
3.93k
    while (cur && !cur->cache_key_eq(key))
45
537
      cur = static_cast<D *>(cur->next);
46
3.40k
    return cur;
47
3.40k
  }
acommon::GlobalCache<aspeller::Language>::find(acommon::String const&)
Line
Count
Source
42
8.05k
  Data * find(const Key & key) {
43
8.05k
    D * cur = static_cast<D *>(first);
44
8.05k
    while (cur && !cur->cache_key_eq(key))
45
0
      cur = static_cast<D *>(cur->next);
46
8.05k
    return cur;
47
8.05k
  }
acommon::GlobalCache<aspeller::Dictionary>::find(aspeller::Dictionary::Id const&)
Line
Count
Source
42
2.28k
  Data * find(const Key & key) {
43
2.28k
    D * cur = static_cast<D *>(first);
44
3.42k
    while (cur && !cur->cache_key_eq(key))
45
1.13k
      cur = static_cast<D *>(cur->next);
46
2.28k
    return cur;
47
2.28k
  }
acommon::GlobalCache<aspeller::TypoEditDistanceInfo>::find(char const* const&)
Line
Count
Source
42
2.28k
  Data * find(const Key & key) {
43
2.28k
    D * cur = static_cast<D *>(first);
44
2.28k
    while (cur && !cur->cache_key_eq(key))
45
0
      cur = static_cast<D *>(cur->next);
46
2.28k
    return cur;
47
2.28k
  }
48
12.9k
  void add(Data * n) {GlobalCacheBase::add(n);}
acommon::GlobalCache<acommon::Decode>::add(acommon::Decode*)
Line
Count
Source
48
2.34k
  void add(Data * n) {GlobalCacheBase::add(n);}
acommon::GlobalCache<acommon::Encode>::add(acommon::Encode*)
Line
Count
Source
48
2.38k
  void add(Data * n) {GlobalCacheBase::add(n);}
acommon::GlobalCache<acommon::NormTables>::add(acommon::NormTables*)
Line
Count
Source
48
1.10k
  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.56k
  void add(Data * n) {GlobalCacheBase::add(n);}
acommon::GlobalCache<aspeller::Language>::add(aspeller::Language*)
Line
Count
Source
48
1.16k
  void add(Data * n) {GlobalCacheBase::add(n);}
acommon::GlobalCache<aspeller::Dictionary>::add(aspeller::Dictionary*)
Line
Count
Source
48
2.28k
  void add(Data * n) {GlobalCacheBase::add(n);}
acommon::GlobalCache<aspeller::TypoEditDistanceInfo>::add(aspeller::TypoEditDistanceInfo*)
Line
Count
Source
48
1.14k
  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
45.7k
{
59
45.7k
  LOCK(&cache->lock);
60
45.7k
  Data * n = cache->find(key);
61
  //CERR << "Getting " << key << " for " << cache->name << "\n";
62
45.7k
  if (n) {
63
29.6k
    n->refcount++;
64
29.6k
    return n;
65
29.6k
  }
66
16.0k
  PosibErr<Data *> res = Data::get_new(key, config);
67
16.0k
  if (res.has_err()) {
68
    //CERR << "ERROR\n"; 
69
6.50k
    return res;
70
6.50k
  }
71
9.56k
  n = res.data;
72
9.56k
  cache->add(n);
73
  //CERR << "LOADED FROM DISK\n";
74
9.56k
  return n;
75
16.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
4.04k
{
59
4.04k
  LOCK(&cache->lock);
60
4.04k
  Data * n = cache->find(key);
61
  //CERR << "Getting " << key << " for " << cache->name << "\n";
62
4.04k
  if (n) {
63
1.68k
    n->refcount++;
64
1.68k
    return n;
65
1.68k
  }
66
2.35k
  PosibErr<Data *> res = Data::get_new(key, config);
67
2.35k
  if (res.has_err()) {
68
    //CERR << "ERROR\n"; 
69
13
    return res;
70
13
  }
71
2.34k
  n = res.data;
72
2.34k
  cache->add(n);
73
  //CERR << "LOADED FROM DISK\n";
74
2.34k
  return n;
75
2.35k
}
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
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
8.19k
    n->refcount++;
64
8.19k
    return n;
65
8.19k
  }
66
2.38k
  PosibErr<Data *> res = Data::get_new(key, config);
67
2.38k
  if (res.has_err()) {
68
    //CERR << "ERROR\n"; 
69
0
    return res;
70
0
  }
71
2.38k
  n = res.data;
72
2.38k
  cache->add(n);
73
  //CERR << "LOADED FROM DISK\n";
74
2.38k
  return n;
75
2.38k
}
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
13.1k
{
59
13.1k
  LOCK(&cache->lock);
60
13.1k
  Data * n = cache->find(key);
61
  //CERR << "Getting " << key << " for " << cache->name << "\n";
62
13.1k
  if (n) {
63
12.0k
    n->refcount++;
64
12.0k
    return n;
65
12.0k
  }
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<acommon::ConfigFilterModule*> acommon::get_cache_data<acommon::ConfigFilterModule>(acommon::GlobalCache<acommon::ConfigFilterModule>*, acommon::ConfigFilterModule::CacheConfig*, acommon::ConfigFilterModule::CacheKey const&)
Line
Count
Source
58
6.48k
{
59
6.48k
  LOCK(&cache->lock);
60
6.48k
  Data * n = cache->find(key);
61
  //CERR << "Getting " << key << " for " << cache->name << "\n";
62
6.48k
  if (n) {
63
0
    n->refcount++;
64
0
    return n;
65
0
  }
66
6.48k
  PosibErr<Data *> res = Data::get_new(key, config);
67
6.48k
  if (res.has_err()) {
68
    //CERR << "ERROR\n"; 
69
6.48k
    return res;
70
6.48k
  }
71
0
  n = res.data;
72
0
  cache->add(n);
73
  //CERR << "LOADED FROM DISK\n";
74
0
  return n;
75
6.48k
}
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.40k
{
59
3.40k
  LOCK(&cache->lock);
60
3.40k
  Data * n = cache->find(key);
61
  //CERR << "Getting " << key << " for " << cache->name << "\n";
62
3.40k
  if (n) {
63
832
    n->refcount++;
64
832
    return n;
65
832
  }
66
2.56k
  PosibErr<Data *> res = Data::get_new(key, config);
67
2.56k
  if (res.has_err()) {
68
    //CERR << "ERROR\n"; 
69
0
    return res;
70
0
  }
71
2.56k
  n = res.data;
72
2.56k
  cache->add(n);
73
  //CERR << "LOADED FROM DISK\n";
74
2.56k
  return n;
75
2.56k
}
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
8.05k
{
59
8.05k
  LOCK(&cache->lock);
60
8.05k
  Data * n = cache->find(key);
61
  //CERR << "Getting " << key << " for " << cache->name << "\n";
62
8.05k
  if (n) {
63
6.89k
    n->refcount++;
64
6.89k
    return n;
65
6.89k
  }
66
1.16k
  PosibErr<Data *> res = Data::get_new(key, config);
67
1.16k
  if (res.has_err()) {
68
    //CERR << "ERROR\n"; 
69
1
    return res;
70
1
  }
71
1.16k
  n = res.data;
72
1.16k
  cache->add(n);
73
  //CERR << "LOADED FROM DISK\n";
74
1.16k
  return n;
75
1.16k
}
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
2.28k
{
83
2.28k
  LOCK(&cache->lock);
84
2.28k
  Data * n = cache->find(key);
85
  //CERR << "Getting " << key << "\n";
86
2.28k
  if (n) {
87
1.14k
    n->refcount++;
88
1.14k
    return n;
89
1.14k
  }
90
1.14k
  PosibErr<Data *> res = Data::get_new(key, config, config2);
91
1.14k
  if (res.has_err()) {
92
    //CERR << "ERROR\n"; 
93
2
    return res;
94
2
  }
95
1.14k
  n = res.data;
96
1.14k
  cache->add(n);
97
  //CERR << "LOADED FROM DISK\n";
98
1.14k
  return n;
99
1.14k
}
100
101
}
102
103
#endif