source: filezilla/trunk/fuentes/src/engine/pathcache.cpp @ 130

Last change on this file since 130 was 130, checked in by jrpelegrina, 3 years ago

First release to xenial

File size: 2.8 KB
Line 
1#include <filezilla.h>
2#include "pathcache.h"
3
4CPathCache::CPathCache()
5{
6}
7
8CPathCache::~CPathCache()
9{
10}
11
12void CPathCache::Store(CServer const& server, CServerPath const& target, CServerPath const& source, wxString const& subdir)
13{
14        scoped_lock lock(mutex_);
15
16        wxASSERT(!target.empty() && !source.empty());
17
18        tCacheIterator iter = m_cache.find(server);
19        if (iter == m_cache.cend())
20                iter = m_cache.emplace(std::make_pair(server, tServerCache())).first;
21        tServerCache &serverCache = iter->second;
22
23        CSourcePath sourcePath;
24
25        sourcePath.source = source;
26        sourcePath.subdir = subdir;
27
28        serverCache[sourcePath] = target;
29}
30
31CServerPath CPathCache::Lookup(CServer const& server, CServerPath const& source, wxString const& subdir)
32{
33        scoped_lock lock(mutex_);
34
35        const tCacheConstIterator iter = m_cache.find(server);
36        if (iter == m_cache.end())
37                return CServerPath();
38
39        CServerPath result = Lookup(iter->second, source, subdir);
40
41        if (result.empty())
42                m_misses++;
43        else
44                m_hits++;
45
46        return result;
47}
48
49CServerPath CPathCache::Lookup(tServerCache const& serverCache, CServerPath const& source, wxString const& subdir)
50{
51        CSourcePath sourcePath;
52        sourcePath.source = source;
53        sourcePath.subdir = subdir;
54
55        tServerCacheConstIterator serverIter = serverCache.find(sourcePath);
56        if (serverIter == serverCache.end())
57                return CServerPath();
58
59        return serverIter->second;
60}
61
62void CPathCache::InvalidateServer(CServer const& server)
63{
64        scoped_lock lock(mutex_);
65
66        tCacheIterator iter = m_cache.find(server);
67        if (iter == m_cache.end())
68                return;
69
70        m_cache.erase(iter);
71}
72
73void CPathCache::InvalidatePath(CServer const& server, CServerPath const& path, wxString const& subdir)
74{
75        scoped_lock lock(mutex_);
76
77        tCacheIterator iter = m_cache.find(server);
78        if (iter != m_cache.end()) {
79                InvalidatePath(iter->second, path, subdir);
80        }
81}
82
83void CPathCache::InvalidatePath(tServerCache & serverCache, CServerPath const& path, wxString const& subdir)
84{
85        CSourcePath sourcePath;
86
87        sourcePath.source = path;
88        sourcePath.subdir = subdir;
89
90        CServerPath target;
91        tServerCacheIterator serverIter = serverCache.find(sourcePath);
92        if (serverIter != serverCache.end()) {
93                target = serverIter->second;
94                serverCache.erase(serverIter);
95        }
96
97        if (target.empty() && !subdir.empty()) {
98                target = path;
99                if (!target.AddSegment(subdir))
100                        return;
101        }
102
103        if (!target.empty()) {
104                // Unfortunately O(n), don't know of a faster way.
105                for (serverIter = serverCache.begin(); serverIter != serverCache.end(); ) {
106                        if (serverIter->second == target || target.IsParentOf(serverIter->second, false))
107                                serverCache.erase(serverIter++);
108                        else if (serverIter->first.source == target || target.IsParentOf(serverIter->first.source, false))
109                                serverCache.erase(serverIter++);
110                        else
111                                ++serverIter;
112                }
113        }
114}
115
116void CPathCache::Clear()
117{
118        scoped_lock lock(mutex_);
119        m_cache.clear();
120}
Note: See TracBrowser for help on using the repository browser.