diff --git a/emper/io/Future.hpp b/emper/io/Future.hpp index 06f9b45609f8354606a7f4c493f379e1cc56daaf..04999b92be6abebf1f690169c03679f21229e036 100644 --- a/emper/io/Future.hpp +++ b/emper/io/Future.hpp @@ -112,6 +112,11 @@ class Future : public Logger<LogSubsystem::IO> { virtual void prepareSqe(io_uring_sqe* sqe) = 0; + void submitAndForget() { + state.forgotten = true; + submit(); + } + void setCompletion(int32_t res) { assert(!state.completed); LOGD("Complete " << this); @@ -578,10 +583,7 @@ class CloseFuture : public Future { public: CloseFuture(int fildes) : Future(Operation::CLOSE, fildes, nullptr, 0, 0){}; - void submitAndForget() { - state.forgotten = true; - submit(); - } + void submitAndForget() { Future::submitAndForget(); } }; /* @@ -647,4 +649,17 @@ class CancelWrapper : public Future { public: CancelWrapper(Future& future) : Future(Operation::CANCEL, 0, &future, 0, 0){}; }; + +/* + * @brief Request a madvise operation + */ +class MadviseFuture : public Future { + void prepareSqe(io_uring_sqe* sqe) override { io_uring_prep_madvise(sqe, buf, len, flags); } + + public: + MadviseFuture(void* addr, size_t len, int advise) + : Future(Operation::MADVISE, 0, addr, len, advise){}; + + void submitAndForget() { Future::submitAndForget(); } +}; } // namespace emper::io diff --git a/emper/io/Operation.cpp b/emper/io/Operation.cpp index e881f1b1ab7cb5a39d03317d5b0f5e028e85f876..72cd9fef3faa146a59801838f7e37ca6560d7144 100644 --- a/emper/io/Operation.cpp +++ b/emper/io/Operation.cpp @@ -44,6 +44,9 @@ auto operator<<(std::ostream& os, const Operation& op) -> std::ostream& { case Operation::CANCEL: os << "cancel"; break; + case Operation::MADVISE: + os << "madvise"; + break; default: abort(); } diff --git a/emper/io/Operation.hpp b/emper/io/Operation.hpp index d193b1cf4c5b0a357e8716eaaaa5d511c692e6b3..8a9d22c319b535073a711ce75bd3459c3681006f 100644 --- a/emper/io/Operation.hpp +++ b/emper/io/Operation.hpp @@ -19,6 +19,7 @@ enum class Operation { LINK_TIMEOUT, TIMEOUT, CANCEL, + MADVISE, NUMBER_OF_OPERATIONS };