private uint Complete()
        {
            // Reserve a submission to prepare operations on the eventFd later on
            var  eventFdSubmissionAvailable = _ring.TryGetSubmissionQueueEntryUnsafe(out var eventFdSubmission);
            uint skip = 1;

            foreach (var completion in _ring.Completions)
            {
                var(result, userData)      = completion;
                var(socket, operationType) = AsyncOperation.FromUlong(userData);
                if ((operationType & OperationType.EventFdOperation) == 0)
                {
                    // hot path
                    Complete(socket, operationType, result);
                }
                else
                {
                    if (!eventFdSubmissionAvailable)
                    {
                        ThrowHelper.ThrowNewSubmissionQueueFullException();
                    }
                    if (operationType == OperationType.EventFdReadPoll)
                    {
                        _unblockHandle.CompleteEventFdReadPoll(eventFdSubmission, result);
                    }
                    else
                    {
                        _unblockHandle.CompleteEventFdRead(eventFdSubmission, result);
                    }

                    skip = 0; // Don't skip eventFd submission, now that we used it
                }
            }

            return(skip);
        }