Esempio n. 1
0
 /// <summary>
 /// Adds the removal of a timeout to the Submission Queue without it being submitted.
 /// The actual submission can be deferred to avoid unnecessary memory barriers.
 /// </summary>
 /// <param name="timeoutUserData">userData of the timeout submission that should be removed</param>
 /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
 /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
 /// <exception cref="SubmissionQueueFullException">If no more free space in the Submission Queue is available</exception>
 public void PrepareTimeoutRemove(ulong timeoutUserData, ulong userData = 0, SubmissionOption options = SubmissionOption.None)
 {
     if (!TryPrepareTimeoutRemove(timeoutUserData, userData, options))
     {
         ThrowSubmissionQueueFullException();
     }
 }
Esempio n. 2
0
 /// <summary>
 /// Adds the cancellation of a previously submitted item to the Submission Queue without it being submitted.
 /// The actual submission can be deferred to avoid unnecessary memory barriers.
 /// </summary>
 /// <param name="opUserData">userData of the operation to cancel</param>
 /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
 /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
 /// <exception cref="SubmissionQueueFullException">If no more free space in the Submission Queue is available</exception>
 public void PrepareCancel(ulong opUserData, ulong userData = 0, SubmissionOption options = SubmissionOption.None)
 {
     if (!TryPrepareCancel(opUserData, userData, options))
     {
         ThrowSubmissionQueueFullException();
     }
 }
Esempio n. 3
0
 /// <summary>
 /// Adds a request for removal of a previously added poll request to the Submission Queue without it being submitted.
 /// The actual submission can be deferred to avoid unnecessary memory barriers.
 /// </summary>
 /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
 /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
 /// <exception cref="SubmissionQueueFullException">If no more free space in the Submission Queue is available</exception>
 public void PreparePollRemove(ulong userData = 0, SubmissionOption options = SubmissionOption.None)
 {
     if (!TryPreparePollRemove(userData, options))
     {
         ThrowSubmissionQueueFullException();
     }
 }
Esempio n. 4
0
 /// <summary>
 /// Adds a timeout to the Submission Queue without it being submitted.
 /// The actual submission can be deferred to avoid unnecessary memory barriers.
 /// </summary>
 /// <param name="ts">The amount of time after which the timeout should trigger if less than <paramref name="count"/> submissions completed.</param>
 /// <param name="count">The amount of completed submissions after which the timeout should trigger</param>
 /// <param name="timeoutOptions">Options on how <paramref name="ts"/> is interpreted</param>
 /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
 /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
 /// <exception cref="SubmissionQueueFullException">If no more free space in the Submission Queue is available</exception>
 public void PrepareTimeout(timespec *ts, uint count = 1, TimeoutOptions timeoutOptions = TimeoutOptions.Relative, ulong userData = 0,
                            SubmissionOption options = SubmissionOption.None)
 {
     if (!TryPrepareTimeout(ts, count, timeoutOptions, userData, options))
     {
         ThrowSubmissionQueueFullException();
     }
 }
Esempio n. 5
0
 /// <summary>
 /// Adds a one-shot poll of the file descriptor to the Submission Queue without it being submitted.
 /// The actual submission can be deferred to avoid unnecessary memory barriers.
 /// </summary>
 /// <param name="fd">File descriptor to poll</param>
 /// <param name="pollEvents">Events to poll for</param>
 /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
 /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
 /// <exception cref="SubmissionQueueFullException">If no more free space in the Submission Queue is available</exception>
 public void PreparePollAdd(int fd, ushort pollEvents, ulong userData = 0,
                            SubmissionOption options = SubmissionOption.None)
 {
     if (!TryPreparePollAdd(fd, pollEvents, userData, options))
     {
         ThrowSubmissionQueueFullException();
     }
 }
Esempio n. 6
0
 /// <summary>
 /// Adds a recvmsg to the Submission Queue without it being submitted.
 /// The actual submission can be deferred to avoid unnecessary memory barriers.
 /// </summary>
 /// <param name="fd">File descriptor to receive from</param>
 /// <param name="msg">Message to read to</param>
 /// <param name="flags">Flags for the operator (as per recvmsg)</param>
 /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
 /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
 /// <exception cref="SubmissionQueueFullException">If no more free space in the Submission Queue is available</exception>
 public void PrepareRecvMsg(int fd, msghdr *msg, int flags, ulong userData = 0,
                            SubmissionOption options = SubmissionOption.None)
 {
     if (!TryPrepareRecvMsg(fd, msg, flags, userData, options))
     {
         ThrowSubmissionQueueFullException();
     }
 }
Esempio n. 7
0
 /// <summary>
 /// Adds a write using a registered buffer/file to the Submission Queue without it being submitted.
 /// The actual submission can be deferred to avoid unnecessary memory barriers.
 /// </summary>
 /// <param name="fd">File descriptor to write to</param>
 /// <param name="buf">Buffers to write</param>
 /// <param name="count">Number of buffers</param>
 /// <param name="index"></param>
 /// <param name="offset">Offset in bytes into buffer (as per pwritev)</param>
 /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
 /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
 /// <exception cref="SubmissionQueueFullException">If no more free space in the Submission Queue is available</exception>
 public void PrepareWrite(int fd, void *buf, size_t count, int index, off_t offset = default,
                          ulong userData = 0, SubmissionOption options = SubmissionOption.None)
 {
     if (!TryPrepareWrite(fd, buf, count, index, offset, userData, options))
     {
         ThrowSubmissionQueueFullException();
     }
 }
Esempio n. 8
0
 /// <summary>
 /// Adds a fsync to the Submission Queue without it being submitted.
 /// The actual submission can be deferred to avoid unnecessary memory barriers.
 /// </summary>
 /// <param name="fd">File descriptor to synchronize</param>
 /// <param name="fsyncOptions">Integrity options</param>
 /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
 /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
 /// <exception cref="SubmissionQueueFullException">If no more free space in the Submission Queue is available</exception>
 public void PrepareFsync(int fd, FsyncOption fsyncOptions = FsyncOption.FileIntegrity,
                          ulong userData = 0, SubmissionOption options = SubmissionOption.None)
 {
     if (!TryPrepareFsync(fd, fsyncOptions, userData, options))
     {
         ThrowSubmissionQueueFullException();
     }
 }
Esempio n. 9
0
 /// <summary>
 /// Adds a readv, preadv or preadv2 to the Submission Queue without it being submitted.
 /// The actual submission can be deferred to avoid unnecessary memory barriers.
 /// </summary>
 /// <param name="fd">File descriptor to read from</param>
 /// <param name="iov">I/O vectors to read to</param>
 /// <param name="count">Number of I/O vectors</param>
 /// <param name="offset">Offset in bytes into the I/O vectors (as per preadv)</param>
 /// <param name="flags">Flags for the I/O (as per preadv2)</param>
 /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
 /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
 /// <exception cref="SubmissionQueueFullException">If no more free space in the Submission Queue is available</exception>
 public void PrepareReadV(
     int fd, iovec *iov, int count, off_t offset = default, int flags = 0,
     ulong userData = 0, SubmissionOption options = SubmissionOption.None)
 {
     if (!TryPrepareReadV(fd, iov, count, offset, flags, userData, options))
     {
         ThrowSubmissionQueueFullException();
     }
 }
Esempio n. 10
0
        public RingResult Nop(SubmissionOption options = SubmissionOption.None)
        {
            RingResult result = CreateRingResult();

            if (!_ring.TryPrepareNop(result.Handle, options))
            {
                _pool.Return(result);
                return(_ringFullException);
            }

            return(result);
        }
Esempio n. 11
0
        public RingResult PollAdd(int fd, ushort pollEvents, SubmissionOption options = SubmissionOption.None)
        {
            RingResult result = CreateRingResult();

            if (!_ring.TryPreparePollAdd(fd, pollEvents, result.Handle, options))
            {
                _pool.Return(result);
                return(_ringFullException);
            }

            return(result);
        }
Esempio n. 12
0
        public unsafe RingResult Write(int fd, void *buf, size_t count, int index, off_t offset = default,
                                       SubmissionOption options = SubmissionOption.None)
        {
            RingResult result = CreateRingResult();

            if (!_ring.TryPrepareWrite(fd, buf, count, index, offset, result.Handle, options))
            {
                _pool.Return(result);
                return(_ringFullException);
            }

            return(result);
        }
Esempio n. 13
0
        public RingResult Fsync(int fd, FsyncOption fsyncOptions = FsyncOption.FileIntegrity,
                                SubmissionOption options         = SubmissionOption.None)
        {
            RingResult result = CreateRingResult();

            if (!_ring.TryPrepareFsync(fd, fsyncOptions, result.Handle, options))
            {
                _pool.Return(result);
                return(_ringFullException);
            }

            return(result);
        }
Esempio n. 14
0
        public unsafe RingResult WriteV(int fd, iovec *iov, int count, off_t offset = default, int flags = 0,
                                        SubmissionOption options = SubmissionOption.None)
        {
            RingResult result = CreateRingResult();

            if (!_ring.TryPrepareWriteV(fd, iov, count, offset, flags, result.Handle, options))
            {
                _pool.Return(result);
                return(_ringFullException);
            }

            return(result);
        }
Esempio n. 15
0
        public RingResult SyncFileRange(int fd, off_t offset, off_t count, uint flags,
                                        SubmissionOption options = SubmissionOption.None)
        {
            RingResult result = CreateRingResult();

            if (!_ring.TryPrepareSyncFileRange(fd, offset, count, flags, result.Handle, options))
            {
                _pool.Return(result);
                return(_ringFullException);
            }

            return(result);
        }
Esempio n. 16
0
        /// <summary>
        /// Prepares this Submission Queue Entry as a close.
        /// </summary>
        /// <param name="fd">File descriptor to close</param>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <param name="personality">The personality to impersonate for this submission</param>
        public void PrepareClose(int fd, ulong userData = 0, SubmissionOption options = SubmissionOption.None, ushort personality = 0)
        {
            var sqe = _sqe;

            unchecked
            {
                sqe->opcode      = IORING_OP_CLOSE;
                sqe->flags       = (byte)options;
                sqe->fd          = fd;
                sqe->user_data   = userData;
                sqe->personality = personality;
            }
        }
Esempio n. 17
0
        /// <summary>
        /// Prepares this Submission Queue Entry as a NOP.
        /// </summary>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <param name="personality">The personality to impersonate for this submission</param>
        public void PrepareNop(ulong userData = 0, SubmissionOption options = SubmissionOption.None, ushort personality = 0)
        {
            var sqe = _sqe;

            unchecked
            {
                sqe->opcode      = IORING_OP_NOP;
                sqe->flags       = (byte)options;
                sqe->fd          = -1;
                sqe->user_data   = userData;
                sqe->personality = personality;
            }
        }
Esempio n. 18
0
        public unsafe RingResult RecvMsg(int fd, msghdr *msg, int flags,
                                         SubmissionOption options = SubmissionOption.None)
        {
            RingResult result = CreateRingResult();

            if (!_ring.TryPrepareRecvMsg(fd, msg, flags, result.Handle, options))
            {
                _pool.Return(result);
                return(_ringFullException);
            }

            return(result);
        }
Esempio n. 19
0
        /// <summary>
        /// Attempts to add a NOP to the Submission Queue without it being submitted.
        /// The actual submission can be deferred to avoid unnecessary memory barriers.
        /// </summary>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <returns><code>false</code> if the submission queue is full. <code>true</code> otherwise.</returns>
        public bool TryPrepareNop(ulong userData = 0, SubmissionOption options = SubmissionOption.None)
        {
            if (!NextSubmissionQueueEntry(out var sqe))
            {
                return(false);
            }

            sqe->opcode    = IORING_OP_NOP;
            sqe->user_data = userData;
            sqe->flags     = (byte)options;

            return(true);
        }
Esempio n. 20
0
        /// <summary>
        /// Prepares this Submission Queue Entry as a request to rmeove provided buffers for buffer selection.
        /// </summary>
        /// <param name="nr">Number of buffers to remove</param>
        /// <param name="bgid">Group ID of the buffers to remove</param>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <param name="personality">The personality to impersonate for this submission</param>
        public void PrepareRemoveBuffers(int nr, int bgid, ulong userData = 0, SubmissionOption options = SubmissionOption.None, ushort personality = 0)
        {
            var sqe = _sqe;

            unchecked
            {
                sqe->opcode      = IORING_OP_REMOVE_BUFFERS;
                sqe->flags       = (byte)options;
                sqe->fd          = nr;
                sqe->user_data   = userData;
                sqe->buf_group   = (ushort)bgid;
                sqe->personality = personality;
            }
        }
Esempio n. 21
0
        /// <summary>
        /// Prepares this Submission Queue Entry as the cancellation of a previously submitted item.
        /// </summary>
        /// <param name="opUserData">userData of the operation to cancel</param>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <param name="personality">The personality to impersonate for this submission</param>
        public void PrepareCancel(ulong opUserData, ulong userData = 0, SubmissionOption options = SubmissionOption.None, ushort personality = 0)
        {
            var sqe = _sqe;

            unchecked
            {
                sqe->opcode      = IORING_OP_ASYNC_CANCEL;
                sqe->flags       = (byte)options;
                sqe->fd          = -1;
                sqe->addr        = opUserData;
                sqe->user_data   = userData;
                sqe->personality = personality;
            }
        }
Esempio n. 22
0
        /// <summary>
        /// Prepares this Submission Queue Entry as the removal of a timeout.
        /// </summary>
        /// <param name="timeoutUserData">userData of the timeout submission that should be removed</param>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <param name="personality">The personality to impersonate for this submission</param>
        public void PrepareTimeoutRemove(ulong timeoutUserData, ulong userData = 0, SubmissionOption options = SubmissionOption.None, ushort personality = 0)
        {
            var sqe = _sqe;

            unchecked
            {
                sqe->opcode      = IORING_OP_TIMEOUT_REMOVE;
                sqe->flags       = (byte)options;
                sqe->fd          = -1;
                sqe->addr        = timeoutUserData;
                sqe->user_data   = userData;
                sqe->personality = personality;
            }
        }
Esempio n. 23
0
        /// <summary>
        /// Prepares this Submission Queue Entry as a one-shot poll of the file descriptor.
        /// </summary>
        /// <param name="fd">File descriptor to poll</param>
        /// <param name="pollEvents">Events to poll for</param>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <param name="personality">The personality to impersonate for this submission</param>
        public void PreparePollAdd(int fd, ushort pollEvents, ulong userData = 0, SubmissionOption options = SubmissionOption.None, ushort personality = 0)
        {
            var sqe = _sqe;

            unchecked
            {
                sqe->opcode      = IORING_OP_POLL_ADD;
                sqe->flags       = (byte)options;
                sqe->fd          = fd;
                sqe->poll_events = pollEvents;
                sqe->user_data   = userData;
                sqe->personality = personality;
            }
        }
Esempio n. 24
0
        /// <summary>
        /// Attempts to add a fsync to the Submission Queue without it being submitted.
        /// The actual submission can be deferred to avoid unnecessary memory barriers.
        /// </summary>
        /// <param name="fd">File descriptor to synchronize</param>
        /// <param name="fsyncOptions">Integrity options</param>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <returns><code>false</code> if the submission queue is full. <code>true</code> otherwise.</returns>
        /// <exception cref="SubmissionQueueFullException">If no more free space in the Submission Queue is available</exception>
        public bool TryPrepareFsync(int fd, FsyncOption fsyncOptions = FsyncOption.FileIntegrity,
                                    ulong userData = 0, SubmissionOption options = SubmissionOption.None)
        {
            if (!NextSubmissionQueueEntry(out var sqe))
            {
                return(false);
            }

            sqe->opcode      = IORING_OP_FSYNC;
            sqe->user_data   = userData;
            sqe->flags       = (byte)options;
            sqe->fd          = fd;
            sqe->fsync_flags = (uint)fsyncOptions;

            return(true);
        }
Esempio n. 25
0
        /// <summary>
        /// Attempts to add a one-shot poll of the file descriptor to the Submission Queue without it being submitted.
        /// The actual submission can be deferred to avoid unnecessary memory barriers.
        /// </summary>
        /// <param name="fd">File descriptor to poll</param>
        /// <param name="pollEvents">Events to poll for</param>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <returns><code>false</code> if the submission queue is full. <code>true</code> otherwise.</returns>
        public bool TryPreparePollAdd(int fd, ushort pollEvents, ulong userData = 0,
                                      SubmissionOption options = SubmissionOption.None)
        {
            if (!NextSubmissionQueueEntry(out var sqe))
            {
                return(false);
            }

            sqe->opcode      = IORING_OP_POLL_ADD;
            sqe->user_data   = userData;
            sqe->flags       = (byte)options;
            sqe->fd          = fd;
            sqe->poll_events = pollEvents;

            return(true);
        }
Esempio n. 26
0
        private bool TryPrepareSendRecvMsg(byte op, int fd, msghdr *msg, int flags, ulong userData,
                                           SubmissionOption options)
        {
            if (!NextSubmissionQueueEntry(out var sqe))
            {
                return(false);
            }

            unchecked
            {
                sqe->opcode    = op;
                sqe->user_data = userData;
                sqe->flags     = (byte)options;
                sqe->fd        = fd;
                sqe->addr      = (ulong)msg;
                sqe->len       = 1;
                sqe->msg_flags = (uint)flags;
            }

            return(true);
        }
Esempio n. 27
0
        /// <summary>
        /// Prepares this Submission Queue Entry as a writev, pwritev or pwritev2.
        /// </summary>
        /// <param name="fd">File descriptor to write to</param>
        /// <param name="iov">I/O vectors to write</param>
        /// <param name="count">Number of I/O vectors</param>
        /// <param name="offset">Offset at which the I/O is performed (as per pwritev)</param>
        /// <param name="flags">Flags for the I/O (as per pwritev2)</param>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <param name="personality">The personality to impersonate for this submission</param>
        public void PrepareWriteV(int fd, iovec *iov, int count, off_t offset = default, int flags = 0, ulong userData = 0, SubmissionOption options = SubmissionOption.None, ushort personality = 0)
        {
            var sqe = _sqe;

            unchecked
            {
                sqe->opcode      = IORING_OP_WRITEV;
                sqe->flags       = (byte)options;
                sqe->fd          = fd;
                sqe->off         = (ulong)(long)offset;
                sqe->addr        = (ulong)iov;
                sqe->len         = (uint)count;
                sqe->rw_flags    = flags;
                sqe->user_data   = userData;
                sqe->personality = personality;
            }
        }
Esempio n. 28
0
        /// <summary>
        /// Prepares this Submission Queue Entry as a request to add provided buffers for buffer selection.
        /// </summary>
        /// <param name="addr">Address of the first buffer to add</param>
        /// <param name="len">Length of each buffers to be added</param>
        /// <param name="nr">Number of buffers to add</param>
        /// <param name="bgid">Group ID of the buffers</param>
        /// <param name="bid">Buffer ID of the first buffer</param>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <param name="personality">The personality to impersonate for this submission</param>
        public void PrepareProvideBuffers(void *addr, int len, int nr, int bgid, int bid, ulong userData = 0, SubmissionOption options = SubmissionOption.None, ushort personality = 0)
        {
            var sqe = _sqe;

            unchecked
            {
                sqe->opcode      = IORING_OP_PROVIDE_BUFFERS;
                sqe->flags       = (byte)options;
                sqe->fd          = nr;
                sqe->off         = (uint)bid;
                sqe->addr        = (ulong)addr;
                sqe->len         = (uint)len;
                sqe->user_data   = userData;
                sqe->buf_group   = (ushort)bgid;
                sqe->personality = personality;
            }
        }
Esempio n. 29
0
        /// <summary>
        /// Prepares this Submission Queue Entry as a splice using a fixed file/buffer as source.
        /// </summary>
        /// <param name="fdIn">Fixed source file/buffer</param>
        /// <param name="offIn">Offset into the source</param>
        /// <param name="fdOut">Target file descriptor</param>
        /// <param name="offOut">Offset into the target</param>
        /// <param name="nbytes">Number of bytes to move</param>
        /// <param name="spliceFlags">Flags for the splice</param>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <param name="personality">The personality to impersonate for this submission</param>
        public void PrepareSpliceFixed(int fdIn, ulong offIn, int fdOut, ulong offOut, uint nbytes, uint spliceFlags, ulong userData = 0, SubmissionOption options = SubmissionOption.None, ushort personality = 0)
        {
            var sqe = _sqe;

            unchecked
            {
                sqe->opcode        = IORING_OP_SPLICE;
                sqe->flags         = (byte)options;
                sqe->fd            = fdOut;
                sqe->off           = offOut;
                sqe->splice_off_in = offIn;
                sqe->len           = nbytes;
                sqe->splice_flags  = spliceFlags | SPLICE_F_FD_IN_FIXED;
                sqe->user_data     = userData;
                sqe->splice_fd_in  = fdIn;
                sqe->personality   = personality;
            }
        }
Esempio n. 30
0
        /// <summary>
        /// Prepares this Submission Queue Entry as an epoll_ctl.
        /// </summary>
        /// <param name="epfd">epoll instance file descriptor</param>
        /// <param name="fd">File descriptor</param>
        /// <param name="op">Operation to be performed for the file descriptor</param>
        /// <param name="ev">Settings</param>
        /// <param name="userData">User data that will be returned with the respective <see cref="Completion"/></param>
        /// <param name="options">Options for the handling of the prepared Submission Queue Entry</param>
        /// <param name="personality">The personality to impersonate for this submission</param>
        public void PrepareEpollCtl(int epfd, int fd, int op, epoll_event *ev, ulong userData = 0, SubmissionOption options = SubmissionOption.None, ushort personality = 0)
        {
            var sqe = _sqe;

            unchecked
            {
                sqe->opcode      = IORING_OP_EPOLL_CTL;
                sqe->flags       = (byte)options;
                sqe->fd          = epfd;
                sqe->off         = (ulong)fd;
                sqe->addr        = (ulong)ev;
                sqe->len         = (uint)op;
                sqe->user_data   = userData;
                sqe->personality = personality;
            }
        }