#include <utility>
#include "common/Mutex.h"
#include "common/Cond.h"
+#include "include/unordered_map.h"
-template <class K, class V, class C = std::less<K> >
+template <class K, class V, class C = std::less<K>, class H = std::hash<K> >
class SharedLRU {
CephContext *cct;
typedef ceph::shared_ptr<V> VPtr;
public:
int waiting;
private:
- map<K, typename list<pair<K, VPtr> >::iterator, C> contents;
+ ceph::unordered_map<K, typename list<pair<K, VPtr> >::iterator, H> contents;
list<pair<K, VPtr> > lru;
map<K, pair<WeakVPtr, V*>, C> weak_refs;
}
void lru_remove(const K& key) {
- typename map<K, typename list<pair<K, VPtr> >::iterator, C>::iterator i =
+ typename ceph::unordered_map<K, typename list<pair<K, VPtr> >::iterator, H>::iterator i =
contents.find(key);
if (i == contents.end())
return;
}
void lru_add(const K& key, const VPtr& val, list<VPtr> *to_release) {
- typename map<K, typename list<pair<K, VPtr> >::iterator, C>::iterator i =
+ typename ceph::unordered_map<K, typename list<pair<K, VPtr> >::iterator, H>::iterator i =
contents.find(key);
if (i != contents.end()) {
lru.splice(lru.begin(), lru, i->second);
public:
SharedLRU(CephContext *cct = NULL, size_t max_size = 20)
: cct(cct), lock("SharedLRU::lock"), max_size(max_size),
- size(0), waiting(0) {}
+ size(0), waiting(0) {
+ contents.rehash(max_size);
+ }
~SharedLRU() {
contents.clear();
#include <memory>
#include "common/Mutex.h"
#include "common/Cond.h"
+#include "include/unordered_map.h"
-template <class K, class V, class C = std::less<K> >
+template <class K, class V, class C = std::less<K>, class H = std::hash<K> >
class SimpleLRU {
Mutex lock;
size_t max_size;
- map<K, typename list<pair<K, V> >::iterator, C> contents;
+ ceph::unordered_map<K, typename list<pair<K, V> >::iterator, H> contents;
list<pair<K, V> > lru;
map<K, V, C> pinned;
}
public:
- SimpleLRU(size_t max_size) : lock("SimpleLRU::lock"), max_size(max_size) {}
+ SimpleLRU(size_t max_size) : lock("SimpleLRU::lock"), max_size(max_size) {
+ contents.rehash(max_size);
+ }
void pin(K key, V val) {
Mutex::Locker l(lock);
void clear(K key) {
Mutex::Locker l(lock);
- typename map<K, typename list<pair<K, V> >::iterator, C>::iterator i =
+ typename ceph::unordered_map<K, typename list<pair<K, V> >::iterator, H>::iterator i =
contents.find(key);
if (i == contents.end())
return;