ioringapi.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /**
  2. * This file has no copyright assigned and is placed in the Public Domain.
  3. * This file is part of the mingw-w64 runtime package.
  4. * No warranty is given; refer to the file DISCLAIMER.PD within this package.
  5. */
  6. #ifndef _APISET_IORING_
  7. #define _APISET_IORING_
  8. #include <apiset.h>
  9. #include <apisetcconv.h>
  10. #include <minwindef.h>
  11. #include <minwinbase.h>
  12. #include <ntioring_x.h>
  13. #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
  14. #if NTDDI_VERSION >= NTDDI_WIN10_CO
  15. DECLARE_HANDLE(HIORING);
  16. typedef enum IORING_SQE_FLAGS {
  17. IOSQE_FLAGS_NONE = 0
  18. } IORING_SQE_FLAGS;
  19. DEFINE_ENUM_FLAG_OPERATORS(IORING_SQE_FLAGS)
  20. typedef enum IORING_CREATE_REQUIRED_FLAGS {
  21. IORING_CREATE_REQUIRED_FLAGS_NONE = 0
  22. } IORING_CREATE_REQUIRED_FLAGS;
  23. DEFINE_ENUM_FLAG_OPERATORS(IORING_CREATE_REQUIRED_FLAGS)
  24. typedef enum IORING_CREATE_ADVISORY_FLAGS {
  25. IORING_CREATE_ADVISORY_FLAGS_NONE = 0
  26. } IORING_CREATE_ADVISORY_FLAGS;
  27. DEFINE_ENUM_FLAG_OPERATORS(IORING_CREATE_ADVISORY_FLAGS)
  28. typedef struct IORING_CREATE_FLAGS {
  29. IORING_CREATE_REQUIRED_FLAGS Required;
  30. IORING_CREATE_ADVISORY_FLAGS Advisory;
  31. } IORING_CREATE_FLAGS;
  32. typedef struct IORING_INFO {
  33. IORING_VERSION IoRingVersion;
  34. IORING_CREATE_FLAGS Flags;
  35. UINT32 SubmissionQueueSize;
  36. UINT32 CompletionQueueSize;
  37. } IORING_INFO;
  38. typedef struct IORING_CAPABILITIES {
  39. IORING_VERSION MaxVersion;
  40. UINT32 MaxSubmissionQueueSize;
  41. UINT32 MaxCompletionQueueSize;
  42. IORING_FEATURE_FLAGS FeatureFlags;
  43. } IORING_CAPABILITIES;
  44. typedef enum IORING_REF_KIND {
  45. IORING_REF_RAW,
  46. IORING_REF_REGISTERED
  47. } IORING_REF_KIND;
  48. typedef struct IORING_HANDLE_REF {
  49. #ifdef __cplusplus
  50. explicit IORING_HANDLE_REF(HANDLE h) : Kind(IORING_REF_KIND::IORING_REF_RAW), Handle(h) {}
  51. explicit IORING_HANDLE_REF(UINT32 index) : Kind(IORING_REF_KIND::IORING_REF_REGISTERED), Handle(index) {}
  52. #endif
  53. IORING_REF_KIND Kind;
  54. union HandleUnion {
  55. #ifdef __cplusplus
  56. HandleUnion(HANDLE h) : Handle(h) {}
  57. HandleUnion(UINT32 index) : Index(index) {}
  58. #endif
  59. HANDLE Handle;
  60. UINT32 Index;
  61. } Handle;
  62. } IORING_HANDLE_REF;
  63. #ifdef __cplusplus
  64. #define IoRingHandleRefFromHandle(h) IORING_HANDLE_REF(static_cast<HANDLE>(h))
  65. #define IoRingHandleRefFromIndex(i) IORING_HANDLE_REF(static_cast<UINT32>(i))
  66. #else
  67. #define IoRingHandleRefFromHandle(h) {IORING_REF_RAW, {.Handle = h}}
  68. #define IoRingHandleRefFromIndex(i) {IORING_REF_REGISTERED, {.Index = i}}
  69. #endif
  70. typedef struct IORING_BUFFER_REF {
  71. #ifdef __cplusplus
  72. explicit IORING_BUFFER_REF(void* address) : Kind(IORING_REF_KIND::IORING_REF_RAW), Buffer(address) {}
  73. explicit IORING_BUFFER_REF(IORING_REGISTERED_BUFFER registeredBuffer) : Kind(IORING_REF_KIND::IORING_REF_REGISTERED), Buffer(registeredBuffer) {}
  74. IORING_BUFFER_REF(UINT32 index, UINT32 offset) : IORING_BUFFER_REF(IORING_REGISTERED_BUFFER{index, offset}) {}
  75. #endif
  76. IORING_REF_KIND Kind;
  77. union BufferUnion {
  78. #ifdef __cplusplus
  79. BufferUnion(void* address) : Address(address) {}
  80. BufferUnion(IORING_REGISTERED_BUFFER indexAndOffset) : IndexAndOffset(indexAndOffset) {}
  81. #endif
  82. void* Address;
  83. IORING_REGISTERED_BUFFER IndexAndOffset;
  84. }Buffer;
  85. } IORING_BUFFER_REF;
  86. #ifdef __cplusplus
  87. #define IoRingBufferRefFromPointer(p) IORING_BUFFER_REF(static_cast<void*>(p))
  88. #define IoRingBufferRefFromIndexAndOffset(i,o) IORING_BUFFER_REF((i),(o))
  89. #else
  90. #define IoRingBufferRefFromPointer(p) {IORING_REF_RAW, {.Address = p}}
  91. #define IoRingBufferRefFromIndexAndOffset(i,o) {IORING_REF_REGISTERED, {.IndexAndOffset = {(i),(o)}}}
  92. #endif
  93. typedef struct IORING_CQE {
  94. UINT_PTR UserData;
  95. HRESULT ResultCode;
  96. ULONG_PTR Information;
  97. } IORING_CQE;
  98. #ifdef __cplusplus
  99. extern "C" {
  100. #endif
  101. STDAPI QueryIoRingCapabilities(IORING_CAPABILITIES* capabilities);
  102. STDAPI_(WINBOOL) IsIoRingOpSupported(HIORING ioRing, IORING_OP_CODE op);
  103. STDAPI CreateIoRing(IORING_VERSION ioringVersion, IORING_CREATE_FLAGS flags, UINT32 submissionQueueSize, UINT32 completionQueueSize, HIORING* h);
  104. STDAPI GetIoRingInfo(HIORING ioRing, IORING_INFO* info);
  105. STDAPI SubmitIoRing(HIORING ioRing, UINT32 waitOperations, UINT32 milliseconds, UINT32* submittedEntries);
  106. STDAPI CloseIoRing(HIORING ioRing);
  107. STDAPI PopIoRingCompletion(HIORING ioRing, IORING_CQE* cqe);
  108. STDAPI SetIoRingCompletionEvent(HIORING ioRing, HANDLE hEvent);
  109. STDAPI BuildIoRingCancelRequest(HIORING ioRing, IORING_HANDLE_REF file, UINT_PTR opToCancel, UINT_PTR userData);
  110. STDAPI BuildIoRingReadFile(HIORING ioRing, IORING_HANDLE_REF fileRef, IORING_BUFFER_REF dataRef, UINT32 numberOfBytesToRead, UINT64 fileOffset, UINT_PTR userData, IORING_SQE_FLAGS flags);
  111. STDAPI BuildIoRingRegisterFileHandles(HIORING ioRing, UINT32 count, HANDLE const handles[], UINT_PTR userData);
  112. STDAPI BuildIoRingRegisterBuffers(HIORING ioRing, UINT32 count, IORING_BUFFER_INFO const buffers[], UINT_PTR userData);
  113. #ifdef __cplusplus
  114. }
  115. #endif
  116. #endif /* NTDDI_WIN10_CO */
  117. #endif /* WINAPI_PARTITION_APP */
  118. #endif /* _APISET_IORING_ */