// // Copyright (C) 2022 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include #include #include #include #include #include #include #ifndef __IO_URING_SQE_CPP_H #define __IO_URING_SQE_CPP_H namespace io_uring_cpp { struct [[nodiscard]] IoUringSubmitResult { constexpr bool IsOk() const { return ret > 0; } const char *ErrMsg() const { if (IsOk()) { return nullptr; } return strerror(-ret); } constexpr auto ErrCode() const { return std::min(ret, 0); } constexpr auto EntriesSubmitted() const { return std::max(ret, 0); } int ret; }; struct [[nodiscard]] Errno { constexpr Errno(int ret) : error_code(ret) { error_code = std::abs(error_code); } int error_code; constexpr int ErrCode() { return error_code; } const char *ErrMsg(); constexpr bool IsOk() const { return error_code == 0; } }; std::ostream &operator<<(std::ostream &, Errno err); struct [[nodiscard]] IoUringSQE { constexpr IoUringSQE(void *p) : sqe(p) {} IoUringSQE &SetFlags(unsigned int flags); template IoUringSQE &SetData(const T &data) { static_assert( std::is_trivially_copy_constructible_v, "Only trivially copiable types can be passed for io_uring data"); static_assert(sizeof(T) <= 8, "io_uring SQE's data field has size of 8 bytes, can't pass " "data larger than that."); return SetData(*reinterpret_cast(&data)); } IoUringSQE& SetData(uint64_t data); constexpr bool IsOk() const { return sqe != nullptr; } private: void *sqe; }; } // namespace io_uring_cpp #endif