private static SubmissionQueue MapSq(int ringFd, size_t sqSize, io_uring_params *p, out UnmapHandle sqHandle, out UnmapHandle sqeHandle) { var ptr = mmap(NULL, sqSize, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, ringFd, (long)IORING_OFF_SQ_RING); if (ptr == MAP_FAILED) { ThrowErrnoException(); } sqHandle = new UnmapHandle(ptr, sqSize); size_t sqeSize = SqeSize(p); var sqePtr = mmap(NULL, sqeSize, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, ringFd, (long)IORING_OFF_SQES); if (sqePtr == MAP_FAILED) { ThrowErrnoException(); } sqeHandle = new UnmapHandle(sqePtr, sqeSize); return(SubmissionQueue.CreateSubmissionQueue(ptr, &p->sq_off, (io_uring_sqe *)sqePtr)); }
private static CompletionQueue MapCq(int ringFd, size_t cqSize, io_uring_params *p, UnmapHandle sqHandle, out UnmapHandle cqHandle) { void *ptr; if ((p->features & IORING_FEAT_SINGLE_MMAP) != 0) { ptr = sqHandle.DangerousGetHandle().ToPointer(); cqHandle = sqHandle; } else { ptr = mmap(NULL, cqSize, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, ringFd, (long)IORING_OFF_CQ_RING); if (ptr == MAP_FAILED) { ThrowErrnoException(); } cqHandle = new UnmapHandle(ptr, cqSize); } return(CompletionQueue.CreateCompletionQueue(ptr, &p->cq_off)); }