1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 #include "librbd/AsyncRequest.h"
4 #include "librbd/ImageCtx.h"
5 #include "librbd/Utils.h"
6 #include "librbd/asio/ContextWQ.h"
12 AsyncRequest
<T
>::AsyncRequest(T
&image_ctx
, Context
*on_finish
)
13 : m_image_ctx(image_ctx
), m_on_finish(on_finish
), m_canceled(false),
15 ceph_assert(m_on_finish
!= NULL
);
20 AsyncRequest
<T
>::~AsyncRequest() {
24 void AsyncRequest
<T
>::async_complete(int r
) {
25 m_image_ctx
.op_work_queue
->queue(create_callback_context(), r
);
29 librados::AioCompletion
*AsyncRequest
<T
>::create_callback_completion() {
30 return util::create_rados_callback(this);
34 Context
*AsyncRequest
<T
>::create_callback_context() {
35 return util::create_context_callback(this);
39 Context
*AsyncRequest
<T
>::create_async_callback_context() {
40 return util::create_context_callback
<AsyncRequest
<T
>,
41 &AsyncRequest
<T
>::async_complete
>(this);
45 void AsyncRequest
<T
>::start_request() {
46 std::lock_guard async_ops_locker
{m_image_ctx
.async_ops_lock
};
47 m_image_ctx
.async_requests
.push_back(&m_xlist_item
);
51 void AsyncRequest
<T
>::finish_request() {
52 decltype(m_image_ctx
.async_requests_waiters
) waiters
;
54 std::lock_guard async_ops_locker
{m_image_ctx
.async_ops_lock
};
55 ceph_assert(m_xlist_item
.remove_myself());
57 if (m_image_ctx
.async_requests
.empty()) {
58 waiters
= std::move(m_image_ctx
.async_requests_waiters
);
62 for (auto ctx
: waiters
) {
70 template class librbd::AsyncRequest
<librbd::ImageCtx
>;