/// <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); }
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(); }
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 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); }
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); }
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) { } } }
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 } } }
private RingResult Create() => RingResult.Create(_ioScheduler);
public void Return(RingResult result) => _pool.Return(result);