: m_image_ctx(image_ctx), m_on_finish(on_finish), m_canceled(false),
m_xlist_item(this) {
assert(m_on_finish != NULL);
- Mutex::Locker l(m_image_ctx.async_ops_lock);
- m_image_ctx.async_requests.push_back(&m_xlist_item);
+ start_request();
}
template <typename T>
AsyncRequest<T>::~AsyncRequest() {
- Mutex::Locker l(m_image_ctx.async_ops_lock);
- assert(m_xlist_item.remove_myself());
- m_image_ctx.async_requests_cond.Signal();
}
template <typename T>
_1));;
}
+template <typename T>
+void AsyncRequest<T>::start_request() {
+ Mutex::Locker async_ops_locker(m_image_ctx.async_ops_lock);
+ m_image_ctx.async_requests.push_back(&m_xlist_item);
+}
+
+template <typename T>
+void AsyncRequest<T>::finish_request() {
+ Mutex::Locker async_ops_locker(m_image_ctx.async_ops_lock);
+ assert(m_xlist_item.remove_myself());
+ m_image_ctx.async_requests_cond.Signal();
+}
+
} // namespace librbd
template class librbd::AsyncRequest<librbd::ImageCtx>;
if (should_complete(r)) {
r = filter_return_code(r);
finish(r);
+ finish_request();
m_on_finish->complete(r);
delete this;
}
private:
bool m_canceled;
typename xlist<AsyncRequest<ImageCtxT> *>::item m_xlist_item;
+
+ void start_request();
+ void finish_request();
};
} // namespace librbd