m_watch_lock(util::unique_lock_name("librbd::ImageWatcher::m_watch_lock", this)),
m_watch_ctx(*this), m_watch_handle(0),
m_watch_state(WATCH_STATE_UNREGISTERED),
- m_task_finisher(new TaskFinisher<Task>(*m_image_ctx.cct)),
m_async_request_lock(util::unique_lock_name("librbd::ImageWatcher::m_async_request_lock", this)),
m_owner_client_id_lock(util::unique_lock_name("librbd::ImageWatcher::m_owner_client_id_lock", this))
{
+ m_image_ctx.cct->lookup_or_create_singleton_object<TaskFinisher<Task> >(
+ m_task_finisher, "librbd::task_finisher");
}
ImageWatcher::~ImageWatcher()
{
- delete m_task_finisher;
+ m_task_finisher = nullptr;
{
RWLock::RLocker l(m_watch_lock);
assert(m_watch_state != WATCH_STATE_REGISTERED);
template <typename Task>
class TaskFinisher {
public:
- TaskFinisher(CephContext &cct)
+ TaskFinisher(CephContext *cct)
: m_cct(cct), m_lock("librbd::TaskFinisher::m_lock"),
- m_finisher(new Finisher(&cct)),
- m_safe_timer(new SafeTimer(&cct, m_lock, false))
+ m_finisher(new Finisher(cct)),
+ m_safe_timer(new SafeTimer(cct, m_lock, false))
{
m_finisher->start();
m_safe_timer->init();
Task m_task;
};
- CephContext &m_cct;
+ CephContext *m_cct;
Mutex m_lock;
Finisher *m_finisher;