Signed-off-by: Igor Fedotov <ifedotov@mirantis.com>
/// track in-flight io
struct IOContext {
+private:
+ std::mutex lock;
+ std::condition_variable cond;
+
+public:
CephContext* cct;
void *priv;
#ifdef HAVE_SPDK
void *nvme_task_last = nullptr;
#endif
- std::mutex lock;
- std::condition_variable cond;
std::list<aio_t> pending_aios; ///< not yet submitted
std::list<aio_t> running_aios; ///< submitting or submitted
void aio_wait();
- void aio_wake() {
- std::lock_guard<std::mutex> l(lock);
- cond.notify_all();
- --num_running;
- assert(num_running == 0);
+ void try_aio_wake() {
+ if (num_running == 1) {
+ std::lock_guard<std::mutex> l(lock);
+ cond.notify_all();
+ --num_running;
+ assert(num_running == 0);
+ } else {
+ --num_running;
+ }
}
};
aio_callback(aio_callback_priv, ioc->priv);
}
} else {
- if (ioc->num_running == 1) {
- ioc->aio_wake();
- } else {
- --ioc->num_running;
- }
+ ioc->try_aio_wake();
}
}
}
task->device->aio_callback(task->device->aio_callback_priv, ctx->priv);
}
} else {
- if (ctx->num_running == 1) {
- ctx->aio_wake();
- } else {
- --ctx->num_running;
- }
+ ctx->try_aio_wake();
}
task->release_segs(queue);
delete task;
task->device->aio_callback(task->device->aio_callback_priv, ctx->priv);
}
} else {
- if (ctx->num_running == 1) {
- ctx->aio_wake();
- } else {
- --ctx->num_running;
- }
+ ctx->try_aio_wake();
}
delete task;
} else {