/// <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();
     }
 }
Exemple #2
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);
        }
        /// <summary>
        /// Prepares this Submission Queue Entry as a fsync.
        /// </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>
        /// <param name="personality">The personality to impersonate for this submission</param>
        public void PrepareFsync(int fd, FsyncOption fsyncOptions = FsyncOption.FileIntegrity, ulong userData = 0, SubmissionOption options = SubmissionOption.None, ushort personality = 0)
        {
            var sqe = _sqe;

            unchecked
            {
                sqe->opcode      = IORING_OP_FSYNC;
                sqe->flags       = (byte)options;
                sqe->fd          = fd;
                sqe->fsync_flags = (uint)fsyncOptions;
                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);
        }