public override bool GetMultipleQueuedCompletionStatus(int timeout, CompletionStatus[] completionStatuses, out int removed)
        {
            // Windows XP Has NO GetQueuedCompletionStatusEx
            // so we need dequeue IOPC one by one
            if (Environment.OSVersion.Version.Major == 5)
            {
                removed = 0;
                CompletionStatus completeStatus;
                bool             result = GetQueuedCompletionStatus(timeout, out completeStatus);
                if (result)
                {
                    completionStatuses[0] = completeStatus;
                    removed = 1;
                }
                return(result);
            }
            else
            {
                if (m_overlappedEntries == null || m_overlappedEntries.Length < completionStatuses.Length)
                {
                    if (m_overlappedEntries != null)
                    {
                        m_overlappedEntriesHandle.Free();
                    }

                    m_overlappedEntries = new OverlappedEntry[completionStatuses.Length];

                    m_overlappedEntriesHandle  = GCHandle.Alloc(m_overlappedEntries, GCHandleType.Pinned);
                    m_overlappedEntriesAddress = Marshal.UnsafeAddrOfPinnedArrayElement(m_overlappedEntries, 0);
                }

                bool result = UnsafeMethods.GetQueuedCompletionStatusEx(m_completionPortHandle,
                                                                        m_overlappedEntriesAddress,
                                                                        completionStatuses.Length, out removed, timeout,
                                                                        false);

                if (!result)
                {
                    int error = Marshal.GetLastWin32Error();

                    if (error == WaitTimeoutError)
                    {
                        removed = 0;
                        return(false);
                    }

                    throw new Win32Exception(error);
                }

                for (int i = 0; i < removed; i++)
                {
                    HandleCompletionStatus(out completionStatuses[i], m_overlappedEntries[i].Overlapped,
                                           m_overlappedEntries[i].CompletionKey, m_overlappedEntries[i].BytesTransferred);
                }
            }
            return(true);
        }
Exemple #2
0
        public override bool GetMultipleQueuedCompletionStatus(int timeout, CompletionStatus[] completionStatuses, out int removed)
        {
            if (m_overlappedEntries == null || m_overlappedEntries.Length < completionStatuses.Length)
            {
                if (m_overlappedEntries != null)
                {
                    m_overlappedEntriesHandle.Free();
                }

                m_overlappedEntries = new OverlappedEntry[completionStatuses.Length];

                m_overlappedEntriesHandle  = GCHandle.Alloc(m_overlappedEntries, GCHandleType.Pinned);
                m_overlappedEntriesAddress = Marshal.UnsafeAddrOfPinnedArrayElement(m_overlappedEntries, 0);
            }

            bool result = UnsafeMethods.GetQueuedCompletionStatusEx(m_completionPortHandle,
                                                                    m_overlappedEntriesAddress,
                                                                    completionStatuses.Length, out removed, timeout,
                                                                    false);

            if (!result)
            {
                int error = Marshal.GetLastWin32Error();

                if (error == WaitTimeoutError)
                {
                    removed = 0;
                    return(false);
                }

                throw new Win32Exception(error);
            }

            for (int i = 0; i < removed; i++)
            {
                HandleCompletionStatus(out completionStatuses[i], m_overlappedEntries[i].Overlapped,
                                       m_overlappedEntries[i].CompletionKey, m_overlappedEntries[i].BytesTransferred);
            }
            return(true);
        }