summaryrefslogtreecommitdiff
path: root/M4-RCs/qpid/cpp/src/qpid/sys/windows/IocpPoller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'M4-RCs/qpid/cpp/src/qpid/sys/windows/IocpPoller.cpp')
-rwxr-xr-xM4-RCs/qpid/cpp/src/qpid/sys/windows/IocpPoller.cpp176
1 files changed, 0 insertions, 176 deletions
diff --git a/M4-RCs/qpid/cpp/src/qpid/sys/windows/IocpPoller.cpp b/M4-RCs/qpid/cpp/src/qpid/sys/windows/IocpPoller.cpp
deleted file mode 100755
index 44298ac8ea..0000000000
--- a/M4-RCs/qpid/cpp/src/qpid/sys/windows/IocpPoller.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "qpid/sys/Poller.h"
-#include "qpid/sys/Mutex.h"
-
-#include "AsynchIoResult.h"
-#include "IoHandlePrivate.h"
-#include "check.h"
-
-#include <winsock2.h>
-#include <windows.h>
-
-#include <assert.h>
-#include <vector>
-#include <exception>
-
-namespace qpid {
-namespace sys {
-
-class PollerHandlePrivate {
- friend class Poller;
- friend class PollerHandle;
-
- SOCKET fd;
- AsynchIoResult::Completer cb;
-
- PollerHandlePrivate(SOCKET f, AsynchIoResult::Completer cb0 = 0) :
- fd(f), cb(cb0)
- {
- }
-
-};
-
-PollerHandle::PollerHandle(const IOHandle& h) :
- impl(new PollerHandlePrivate(toFd(h.impl), h.impl->event))
-{}
-
-PollerHandle::~PollerHandle() {
- delete impl;
-}
-
-/**
- * Concrete implementation of Poller to use the Windows I/O Completion
- * port (IOCP) facility.
- */
-class PollerPrivate {
- friend class Poller;
-
- const HANDLE iocp;
-
- // The number of threads running the event loop.
- volatile LONG threadsRunning;
-
- // Shutdown request is handled by setting isShutdown and injecting a
- // well-formed completion event into the iocp.
- bool isShutdown;
-
- PollerPrivate() :
- iocp(::CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0)),
- threadsRunning(0),
- isShutdown(false) {
- QPID_WINDOWS_CHECK_NULL(iocp);
- }
-
- ~PollerPrivate() {
- // It's probably okay to ignore any errors here as there can't be
- // data loss
- ::CloseHandle(iocp);
- }
-};
-
-void Poller::addFd(PollerHandle& handle, Direction dir) {
- HANDLE h = (HANDLE)(handle.impl->fd);
- if (h != INVALID_HANDLE_VALUE) {
- HANDLE iocpHandle = ::CreateIoCompletionPort (h, impl->iocp, 0, 0);
- QPID_WINDOWS_CHECK_NULL(iocpHandle);
- }
- else {
- AsynchWriteWanted *result = new AsynchWriteWanted(handle.impl->cb);
- PostQueuedCompletionStatus(impl->iocp, 0, 0, result->overlapped());
- }
-}
-
-void Poller::shutdown() {
- // Allow sloppy code to shut us down more than once.
- if (impl->isShutdown)
- return;
- ULONG_PTR key = 1; // Tell wait() it's a shutdown, not I/O
- PostQueuedCompletionStatus(impl->iocp, 0, key, 0);
-}
-
-// All no-ops...
-void Poller::delFd(PollerHandle& handle) {}
-void Poller::modFd(PollerHandle& handle, Direction dir) {}
-void Poller::rearmFd(PollerHandle& handle) {}
-
-Poller::Event Poller::wait(Duration timeout) {
- DWORD timeoutMs = 0;
- DWORD numTransferred = 0;
- ULONG_PTR completionKey = 0;
- OVERLAPPED *overlapped = 0;
- AsynchResult *result = 0;
-
- // Wait for either an I/O operation to finish (thus signaling the
- // IOCP handle) or a shutdown request to be made (thus signaling the
- // shutdown event).
- if (timeout == TIME_INFINITE)
- timeoutMs = INFINITE;
- else
- timeoutMs = static_cast<DWORD>(timeout / TIME_MSEC);
-
- InterlockedIncrement(&impl->threadsRunning);
- bool goodOp = ::GetQueuedCompletionStatus (impl->iocp,
- &numTransferred,
- &completionKey,
- &overlapped,
- timeoutMs);
- LONG remainingThreads = InterlockedDecrement(&impl->threadsRunning);
- if (goodOp) {
- // Dequeued a successful completion. If it's a posted packet from
- // shutdown() the overlapped ptr is 0 and key is 1. Else downcast
- // the OVERLAPPED pointer to an AsynchIoResult and call the
- // completion handler.
- if (overlapped == 0 && completionKey == 1) {
- // If there are other threads still running this wait, re-post
- // the completion.
- if (remainingThreads > 0)
- PostQueuedCompletionStatus(impl->iocp, 0, completionKey, 0);
- return Event(0, SHUTDOWN);
- }
-
- result = AsynchResult::from_overlapped(overlapped);
- result->success (static_cast<size_t>(numTransferred));
- }
- else {
- if (overlapped != 0) {
- // Dequeued a completion for a failed operation. Downcast back
- // to the result object and inform it that the operation failed.
- DWORD status = ::GetLastError();
- result = AsynchResult::from_overlapped(overlapped);
- result->failure (static_cast<int>(status));
- }
- }
- return Event(0, INVALID); // TODO - this may need to be changed.
-
-}
-
-// Concrete constructors
-Poller::Poller() :
- impl(new PollerPrivate())
-{}
-
-Poller::~Poller() {
- delete impl;
-}
-
-}}