Пример #1
0
 private SubmissionQueue(uint *head, uint *tail, uint *ringMask, uint *ringEntries, uint *flags, uint *dropped, uint *array, io_uring_sqe *sqes)
 {
     _head         = head;
     _tail         = tail;
     _ringMask     = ringMask;
     _ringEntries  = ringEntries;
     _flags        = flags;
     _dropped      = dropped;
     _array        = array;
     _sqes         = sqes;
     _tailInternal = 0;
     _headInternal = 0;
 }
Пример #2
0
 public SubmissionQueue(int ringFd, void *ringBase, io_sqring_offsets *offsets, io_uring_sqe *elements, bool sqPolled, bool ioPolled)
     : this(ringBase, offsets)
 {
     _ringFd       = ringFd;
     _head         = Add <uint>(ringBase, offsets->head);
     _tail         = Add <uint>(ringBase, offsets->tail);
     _ringMask     = *Add <uint>(ringBase, offsets->ring_mask);
     _ringEntries  = *Add <uint>(ringBase, offsets->ring_entries);
     _flags        = Add <uint>(ringBase, offsets->flags);
     _dropped      = Add <uint>(ringBase, offsets->dropped);
     _array        = Add <uint>(ringBase, offsets->array);
     _sqes         = elements;
     _tailInternal = 0;
     _headInternal = 0;
     _sqPolled     = sqPolled;
     _ioPolled     = ioPolled;
 }
Пример #3
0
        private bool NextSubmissionQueueEntry(out io_uring_sqe *sqe)
        {
            sqe = _sq.NextSubmissionQueueEntry();
            if (sqe == NULL)
            {
                if (Flush(Submit()) > 0)
                {
                    // Flushed one more item, retry to get an entry
                    sqe = _sq.NextSubmissionQueueEntry();
                    if (sqe == NULL)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
Пример #4
0
        private SubmissionAcquireResult NextSubmissionQueueEntry(out io_uring_sqe *sqe)
        {
            sqe = (io_uring_sqe *)NULL;

            if (!CheckAndIncrementOperationsInFlight())
            {
                return(SubmissionAcquireResult.TooManyOperationsInFlight);
            }

            var result = _sq.NextSubmissionQueueEntry();

            if (result == NULL)
            {
                return(SubmissionAcquireResult.SubmissionQueueFull);
            }

            sqe = result;
            return(SubmissionAcquireResult.SubmissionAcquired);
        }
Пример #5
0
 internal Submission(io_uring_sqe *sqe)
 {
     _sqe = sqe;
 }
Пример #6
0
 public static SubmissionQueue CreateSubmissionQueue(void *ringBase, io_sqring_offsets *offsets, io_uring_sqe *elements)
 => new SubmissionQueue(
     head: Add <uint>(ringBase, offsets->head),
     tail: Add <uint>(ringBase, offsets->tail),
     ringMask: Add <uint>(ringBase, offsets->ring_mask),
     ringEntries: Add <uint>(ringBase, offsets->ring_entries),
     flags: Add <uint>(ringBase, offsets->flags),
     dropped: Add <uint>(ringBase, offsets->dropped),
     array: Add <uint>(ringBase, offsets->array),
     sqes: elements
     );
Пример #7
0
 internal Submission(io_uring_sqe *sqe, uint index)
 {
     _sqe  = sqe;
     Index = index;
 }