#include <map>
#include <memory>
-#include "common/Mutex.h"
-#include "common/Cond.h"
+#include "common/ceph_mutex.h"
/**
* Provides a registry of shared_ptr<V> indexed by K while
typedef std::weak_ptr<V> WeakVPtr;
int waiting;
private:
- Mutex lock;
- Cond cond;
- map<K, pair<WeakVPtr, V*>, C> contents;
+ ceph::mutex lock = ceph::make_mutex("SharedPtrRegistry::lock");
+ ceph::condition_variable cond;
+ std::map<K, std::pair<WeakVPtr, V*>, C> contents;
class OnRemoval {
SharedPtrRegistry<K,V,C> *parent;
parent(parent), key(key) {}
void operator()(V *to_remove) {
{
- Mutex::Locker l(parent->lock);
- typename map<K, pair<WeakVPtr, V*>, C>::iterator i =
+ std::lock_guard l(parent->lock);
+ typename std::map<K, std::pair<WeakVPtr, V*>, C>::iterator i =
parent->contents.find(key);
if (i != parent->contents.end() &&
i->second.second == to_remove) {
parent->contents.erase(i);
- parent->cond.Signal();
+ parent->cond.notify_all();
}
}
delete to_remove;
public:
SharedPtrRegistry() :
- waiting(0),
- lock("SharedPtrRegistry::lock")
+ waiting(0)
{}
bool empty() {
- Mutex::Locker l(lock);
+ std::lock_guard l(lock);
return contents.empty();
}
- bool get_next(const K &key, pair<K, VPtr> *next) {
- pair<K, VPtr> r;
+ bool get_next(const K &key, std::pair<K, VPtr> *next) {
+ std::pair<K, VPtr> r;
{
- Mutex::Locker l(lock);
+ std::lock_guard l(lock);
VPtr next_val;
- typename map<K, pair<WeakVPtr, V*>, C>::iterator i =
+ typename std::map<K, std::pair<WeakVPtr, V*>, C>::iterator i =
contents.upper_bound(key);
while (i != contents.end() &&
!(next_val = i->second.first.lock()))
if (i == contents.end())
return false;
if (next)
- r = make_pair(i->first, next_val);
+ r = std::make_pair(i->first, next_val);
}
if (next)
*next = r;
}
- bool get_next(const K &key, pair<K, V> *next) {
+ bool get_next(const K &key, std::pair<K, V> *next) {
VPtr next_val;
- Mutex::Locker l(lock);
- typename map<K, pair<WeakVPtr, V*>, C>::iterator i =
+ std::lock_guard l(lock);
+ typename std::map<K, std::pair<WeakVPtr, V*>, C>::iterator i =
contents.upper_bound(key);
while (i != contents.end() &&
!(next_val = i->second.first.lock()))
if (i == contents.end())
return false;
if (next)
- *next = make_pair(i->first, *next_val);
+ *next = std::make_pair(i->first, *next_val);
return true;
}
VPtr lookup(const K &key) {
- Mutex::Locker l(lock);
+ std::unique_lock l(lock);
waiting++;
while (1) {
- typename map<K, pair<WeakVPtr, V*>, C>::iterator i =
+ typename std::map<K, std::pair<WeakVPtr, V*>, C>::iterator i =
contents.find(key);
if (i != contents.end()) {
VPtr retval = i->second.first.lock();
} else {
break;
}
- cond.Wait(lock);
+ cond.wait(l);
}
waiting--;
return VPtr();
}
VPtr lookup_or_create(const K &key) {
- Mutex::Locker l(lock);
+ std::unique_lock l(lock);
waiting++;
while (1) {
- typename map<K, pair<WeakVPtr, V*>, C>::iterator i =
+ typename std::map<K, std::pair<WeakVPtr, V*>, C>::iterator i =
contents.find(key);
if (i != contents.end()) {
VPtr retval = i->second.first.lock();
} else {
break;
}
- cond.Wait(lock);
+ cond.wait(l);
}
V *ptr = new V();
VPtr retval(ptr, OnRemoval(this, key));
- contents.insert(make_pair(key, make_pair(retval, ptr)));
+ contents.insert(std::make_pair(key, make_pair(retval, ptr)));
waiting--;
return retval;
}
unsigned size() {
- Mutex::Locker l(lock);
+ std::lock_guard l(lock);
return contents.size();
}
void remove(const K &key) {
- Mutex::Locker l(lock);
+ std::lock_guard l(lock);
contents.erase(key);
- cond.Signal();
+ cond.notify_all();
}
template<class A>
VPtr lookup_or_create(const K &key, const A &arg) {
- Mutex::Locker l(lock);
+ std::unique_lock l(lock);
waiting++;
while (1) {
- typename map<K, pair<WeakVPtr, V*>, C>::iterator i =
+ typename std::map<K, std::pair<WeakVPtr, V*>, C>::iterator i =
contents.find(key);
if (i != contents.end()) {
VPtr retval = i->second.first.lock();
} else {
break;
}
- cond.Wait(lock);
+ cond.wait(l);
}
V *ptr = new V(arg);
VPtr retval(ptr, OnRemoval(this, key));
- contents.insert(make_pair(key, make_pair(retval, ptr)));
+ contents.insert(std::make_pair(key, make_pair(retval, ptr)));
waiting--;
return retval;
}