Exemple #1
0
        /// <exception cref="ArgumentOutOfRangeException">The completionStatuses item must have a valid OperationType.</exception>
        private void Loop()
        {
            CompletionStatus[] completionStatuses = new CompletionStatus[Proactor.CompletionStatusArraySize];

            while (!this.m_stopping)
            {
                // Execute any due timers.
                int timeout = this.ExecuteTimers();

                int removed;

                if (!this.m_completionPort.GetMultipleQueuedCompletionStatus(timeout != 0 ? timeout : -1, completionStatuses, out removed))
                {
                    continue;
                }

                for (int i = 0; i < removed; i++)
                {
                    try
                    {
                        if (completionStatuses[i].OperationType == OperationType.Signal)
                        {
                            IOThreadMailbox mailbox = (IOThreadMailbox)completionStatuses[i].State;
                            mailbox.RaiseEvent();
                        }
                        // if the state is null we just ignore the completion status
                        else if (completionStatuses[i].State != null)
                        {
                            Item item = (Item)completionStatuses[i].State;

                            if (!item.Cancelled)
                            {
                                switch (completionStatuses[i].OperationType)
                                {
                                case OperationType.Accept:
                                case OperationType.Receive:
                                    item.ProactorEvents.InCompleted(
                                        completionStatuses[i].SocketError,
                                        completionStatuses[i].BytesTransferred);
                                    break;

                                case OperationType.Connect:
                                case OperationType.Disconnect:
                                case OperationType.Send:
                                    item.ProactorEvents.OutCompleted(
                                        completionStatuses[i].SocketError,
                                        completionStatuses[i].BytesTransferred);
                                    break;

                                default:
                                    throw new ArgumentOutOfRangeException();
                                }
                            }
                        }
                    }
                    catch (TerminatingException)
                    {
                    }
                }
            }
        }
Exemple #2
0
 public void SignalMailbox(IOThreadMailbox mailbox)
 {
     m_completionPort.Signal(mailbox);
 }
Exemple #3
0
 public void SignalMailbox(IOThreadMailbox mailbox)
 {
     m_completionPort.Signal(mailbox);
 }