Пример #1
0
        /// <summary>
        /// Creates a new instance of <see cref="RingResult"/>.
        /// </summary>
        /// <returns>A new instance of <see cref="RingResult"/></returns>
        internal static RingResult Create(PipeScheduler ioScheduler)
        {
            var res = new RingResult(ioScheduler);

            res._handle = GCHandle.Alloc(res, GCHandleType.Weak);
            return(res);
        }
Пример #2
0
        public RingHandler(Ring ring, PipeScheduler ioScheduler)
        {
            _ring = ring;
            _pool = new RingResultPool(ioScheduler, _ring.CompletionQueueSize);
            _ringFullException = RingResult.CreateForException(ioScheduler, new SubmissionQueueFullException());

            new Thread(ReadLoop)
            {
                IsBackground = true
            }.Start();
        }
Пример #3
0
        public RingResult Nop(SubmissionOption options = SubmissionOption.None)
        {
            RingResult result = CreateRingResult();

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

            return(result);
        }
Пример #4
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);
        }
Пример #5
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);
        }
Пример #6
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);
        }
Пример #7
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);
        }
Пример #8
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);
        }
Пример #9
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);
        }
Пример #10
0
        public void Return(RingResult obj)
        {
            if (obj.HasForcedException)
            {
                return;
            }
            if (obj.IsCompleted)
            {
                obj.Reset();
            }

            if (_firstItem != null || Interlocked.CompareExchange(ref _firstItem, obj, null) != null)
            {
                var items = _items;
                for (int i = 0; i < items.Length && Interlocked.CompareExchange(ref items[i], obj, null) != null; ++i)
                {
                }
            }
        }
Пример #11
0
        private void ReadLoop()
        {
            Completion completion = default;

            while (!_terminate)
            {
                if (!_ring.TryRead(ref completion))
                {
                    completion = _ring.Read();
                }

                try
                {
                    RingResult result = RingResult.TaskFromHandle(completion.userData);
                    result.Complete(completion.result);
                }
                catch (Exception)
                {
                    // swallow everything
                }
            }
        }
Пример #12
0
 private RingResult Create() => RingResult.Create(_ioScheduler);
Пример #13
0
 public void Return(RingResult result)
 => _pool.Return(result);