1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_JOURNAL_FUTURE_IMPL_H
5 #define CEPH_JOURNAL_FUTURE_IMPL_H
7 #include "include/int_types.h"
8 #include "common/Mutex.h"
9 #include "common/RefCountedObj.h"
10 #include "journal/Future.h"
13 #include <boost/noncopyable.hpp>
14 #include <boost/intrusive_ptr.hpp>
15 #include "include/assert.h"
22 typedef boost::intrusive_ptr<FutureImpl> FutureImplPtr;
24 class FutureImpl : public RefCountedObject, boost::noncopyable {
27 virtual ~FlushHandler() {}
28 virtual void flush(const FutureImplPtr &future) = 0;
29 virtual void get() = 0;
30 virtual void put() = 0;
32 typedef boost::intrusive_ptr<FlushHandler> FlushHandlerPtr;
34 FutureImpl(uint64_t tag_tid, uint64_t entry_tid, uint64_t commit_tid);
36 void init(const FutureImplPtr &prev_future);
38 inline uint64_t get_tag_tid() const {
41 inline uint64_t get_entry_tid() const {
44 inline uint64_t get_commit_tid() const {
48 void flush(Context *on_safe = NULL);
49 void wait(Context *on_safe);
51 bool is_complete() const;
52 int get_return_value() const;
54 inline bool is_flush_in_progress() const {
55 Mutex::Locker locker(m_lock);
56 return (m_flush_state == FLUSH_STATE_IN_PROGRESS);
58 inline void set_flush_in_progress() {
59 Mutex::Locker locker(m_lock);
60 assert(m_flush_handler);
61 m_flush_handler.reset();
62 m_flush_state = FLUSH_STATE_IN_PROGRESS;
65 bool attach(const FlushHandlerPtr &flush_handler);
66 inline void detach() {
67 Mutex::Locker locker(m_lock);
68 m_flush_handler.reset();
70 inline FlushHandlerPtr get_flush_handler() const {
71 Mutex::Locker locker(m_lock);
72 return m_flush_handler;
78 friend std::ostream &operator<<(std::ostream &, const FutureImpl &);
80 typedef std::map<FlushHandlerPtr, FutureImplPtr> FlushHandlers;
81 typedef std::list<Context *> Contexts;
85 FLUSH_STATE_REQUESTED,
86 FLUSH_STATE_IN_PROGRESS
89 struct C_ConsistentAck : public Context {
91 C_ConsistentAck(FutureImpl *_future) : future(_future) {}
92 void complete(int r) override {
93 future->consistent(r);
96 void finish(int r) override {}
100 uint64_t m_entry_tid;
101 uint64_t m_commit_tid;
103 mutable Mutex m_lock;
104 FutureImplPtr m_prev_future;
109 FlushHandlerPtr m_flush_handler;
110 FlushState m_flush_state;
112 C_ConsistentAck m_consistent_ack;
115 FutureImplPtr prepare_flush(FlushHandlers *flush_handlers);
116 FutureImplPtr prepare_flush(FlushHandlers *flush_handlers, Mutex &lock);
118 void consistent(int r);
119 void finish_unlock();
122 void intrusive_ptr_add_ref(FutureImpl::FlushHandler *p);
123 void intrusive_ptr_release(FutureImpl::FlushHandler *p);
125 std::ostream &operator<<(std::ostream &os, const FutureImpl &future);
127 } // namespace journal
129 using journal::operator<<;
131 #endif // CEPH_JOURNAL_FUTURE_IMPL_H