FutureImpl::FutureImpl(uint64_t tag_tid, uint64_t entry_tid,
uint64_t commit_tid)
- : RefCountedObject(NULL, 0), m_tag_tid(tag_tid), m_entry_tid(entry_tid),
+ : m_tag_tid(tag_tid),
+ m_entry_tid(entry_tid),
m_commit_tid(commit_tid),
- m_lock("FutureImpl::m_lock", false, false), m_safe(false),
- m_consistent(false), m_return_value(0), m_flush_state(FLUSH_STATE_NONE),
- m_consistent_ack(this) {
+ m_consistent_ack(this)
+{
}
-void FutureImpl::init(const FutureImplPtr &prev_future) {
+void FutureImpl::init(const ceph::ref_t<FutureImpl> &prev_future) {
// chain ourself to the prior future (if any) to that we known when the
// journal is consistent
if (prev_future) {
bool complete;
FlushHandlers flush_handlers;
- FutureImplPtr prev_future;
+ ceph::ref_t<FutureImpl> prev_future;
{
- Mutex::Locker locker(m_lock);
+ std::lock_guard locker{m_lock};
complete = (m_safe && m_consistent);
if (!complete) {
if (on_safe != nullptr) {
}
}
-FutureImplPtr FutureImpl::prepare_flush(FlushHandlers *flush_handlers) {
- Mutex::Locker locker(m_lock);
+ceph::ref_t<FutureImpl> FutureImpl::prepare_flush(FlushHandlers *flush_handlers) {
+ std::lock_guard locker{m_lock};
return prepare_flush(flush_handlers, m_lock);
}
-FutureImplPtr FutureImpl::prepare_flush(FlushHandlers *flush_handlers,
- Mutex &lock) {
- ceph_assert(m_lock.is_locked());
+ceph::ref_t<FutureImpl> FutureImpl::prepare_flush(FlushHandlers *flush_handlers,
+ ceph::mutex &lock) {
+ ceph_assert(ceph_mutex_is_locked(m_lock));
if (m_flush_state == FLUSH_STATE_NONE) {
m_flush_state = FLUSH_STATE_REQUESTED;
- if (m_flush_handler && flush_handlers->count(m_flush_handler) == 0) {
- flush_handlers->insert({m_flush_handler, this});
+ auto h = m_flush_handler;
+ if (h) {
+ flush_handlers->try_emplace(std::move(h), this);
}
}
return m_prev_future;
void FutureImpl::wait(Context *on_safe) {
ceph_assert(on_safe != NULL);
{
- Mutex::Locker locker(m_lock);
+ std::lock_guard locker{m_lock};
if (!m_safe || !m_consistent) {
m_contexts.push_back(on_safe);
return;
}
bool FutureImpl::is_complete() const {
- Mutex::Locker locker(m_lock);
+ std::lock_guard locker{m_lock};
return m_safe && m_consistent;
}
int FutureImpl::get_return_value() const {
- Mutex::Locker locker(m_lock);
+ std::lock_guard locker{m_lock};
ceph_assert(m_safe && m_consistent);
return m_return_value;
}
-bool FutureImpl::attach(const FlushHandlerPtr &flush_handler) {
- Mutex::Locker locker(m_lock);
+bool FutureImpl::attach(FlushHandler::ref flush_handler) {
+ std::lock_guard locker{m_lock};
ceph_assert(!m_flush_handler);
- m_flush_handler = flush_handler;
+ m_flush_handler = std::move(flush_handler);
return m_flush_state != FLUSH_STATE_NONE;
}
void FutureImpl::safe(int r) {
- m_lock.Lock();
+ m_lock.lock();
ceph_assert(!m_safe);
m_safe = true;
if (m_return_value == 0) {
if (m_consistent) {
finish_unlock();
} else {
- m_lock.Unlock();
+ m_lock.unlock();
}
}
void FutureImpl::consistent(int r) {
- m_lock.Lock();
+ m_lock.lock();
ceph_assert(!m_consistent);
m_consistent = true;
m_prev_future.reset();
if (m_safe) {
finish_unlock();
} else {
- m_lock.Unlock();
+ m_lock.unlock();
}
}
void FutureImpl::finish_unlock() {
- ceph_assert(m_lock.is_locked());
+ ceph_assert(ceph_mutex_is_locked(m_lock));
ceph_assert(m_safe && m_consistent);
Contexts contexts;
contexts.swap(m_contexts);
- m_lock.Unlock();
+ m_lock.unlock();
for (Contexts::iterator it = contexts.begin();
it != contexts.end(); ++it) {
(*it)->complete(m_return_value);
return os;
}
-void intrusive_ptr_add_ref(FutureImpl::FlushHandler *p) {
- p->get();
-}
-
-void intrusive_ptr_release(FutureImpl::FlushHandler *p) {
- p->put();
-}
-
} // namespace journal