/// <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(); } }
/// <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(); } }
/// <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(); } }
/// <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(); } }
/// <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(); } }
/// <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(); } }
/// <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(); } }
/// <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(); } }
/// <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(); } }
public RingResult Nop(SubmissionOption options = SubmissionOption.None) { RingResult result = CreateRingResult(); if (!_ring.TryPrepareNop(result.Handle, options)) { _pool.Return(result); return(_ringFullException); } return(result); }
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); }
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); }
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); }
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); }
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); }
/// <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; } }
/// <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; } }
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); }
/// <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); }
/// <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; } }
/// <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; } }
/// <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; } }
/// <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; } }
/// <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); }
/// <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); }
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); }
/// <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; } }
/// <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; } }
/// <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; } }
/// <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; } }