You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ri...@apache.org on 2009/10/28 16:39:01 UTC

svn commit: r830625 - in /qpid/branches/0.5.x-dev/qpid/cpp: include/qpid/sys/ src/qpid/sys/windows/ src/tests/

Author: ritchiem
Date: Wed Oct 28 15:39:00 2009
New Revision: 830625

URL: http://svn.apache.org/viewvc?rev=830625&view=rev
Log:
Tidied up dependencies in IOHandle so that it is no longer
dependent on the windows implementation classes.

Modified:
    qpid/branches/0.5.x-dev/qpid/cpp/include/qpid/sys/IOHandle.h
    qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp
    qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/AsynchIoResult.h
    qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/IoHandlePrivate.h
    qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/IocpPoller.cpp
    qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/Socket.cpp
    qpid/branches/0.5.x-dev/qpid/cpp/src/tests/SocketProxy.h

Modified: qpid/branches/0.5.x-dev/qpid/cpp/include/qpid/sys/IOHandle.h
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/cpp/include/qpid/sys/IOHandle.h?rev=830625&r1=830624&r2=830625&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/cpp/include/qpid/sys/IOHandle.h (original)
+++ qpid/branches/0.5.x-dev/qpid/cpp/include/qpid/sys/IOHandle.h Wed Oct 28 15:39:00 2009
@@ -31,25 +31,11 @@
  * This is a class intended to abstract the Unix concept of file descriptor
  * or the Windows concept of HANDLE
  */
-// Windows-related classes
-class AsynchAcceptorPrivate;
-class AsynchAcceptResult;
-namespace windows {
-    class AsynchAcceptor;
-    class AsynchAcceptResult;
-    class AsynchIO;
-}
-
-// General classes
 class PollerHandle;
 class IOHandlePrivate;
 class IOHandle {
-
-    friend class windows::AsynchAcceptResult;
-    friend class windows::AsynchAcceptor;
-    friend class windows::AsynchIO;
-
     friend class PollerHandle;
+    friend class IOHandlePrivate;
 
 protected:
     IOHandlePrivate* const impl;

Modified: qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp?rev=830625&r1=830624&r2=830625&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp (original)
+++ qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp Wed Oct 28 15:39:00 2009
@@ -79,16 +79,7 @@
 /*
  * Asynch Acceptor
  *
- * TODO FIX this comment - is it still true?
- * This implementation uses knowledge that the DispatchHandle handle member
- * is derived from PollerHandle, which has a reference to the Socket.
- * No dispatching features of DispatchHandle are used - we just use the
- * conduit to the Socket.
- *
- * AsynchAcceptor uses an AsynchAcceptResult object to track completion
- * and status of each accept operation outstanding.
  */
-
 class AsynchAcceptor : public qpid::sys::AsynchAcceptor {
 
     friend class AsynchAcceptResult;
@@ -131,10 +122,10 @@
     DWORD bytesReceived = 0;  // Not used, needed for AcceptEx API
     AsynchAcceptResult *result = new AsynchAcceptResult(acceptedCallback,
                                                         this,
-                                                        toFd(socket.impl));
+                                                        toSocketHandle(socket));
     BOOL status;
-    status = ::fnAcceptEx(toFd(socket.impl),
-                          toFd(result->newSocket->impl),
+    status = ::fnAcceptEx(toSocketHandle(socket),
+                          toSocketHandle(*result->newSocket),
                           result->addressBuffer,
                           0,
                           AsynchAcceptResult::SOCKADDRMAXLEN,
@@ -153,7 +144,7 @@
 }
 
 void AsynchAcceptResult::success(size_t /*bytesTransferred*/) {
-    ::setsockopt (toFd(newSocket->impl),
+    ::setsockopt (toSocketHandle(*newSocket),
                   SOL_SOCKET,
                   SO_UPDATE_ACCEPT_CONTEXT,
                   (char*)&listener,
@@ -354,6 +345,15 @@
     void completion(AsynchIoResult *result);
 };
 
+// This is used to encapsulate pure callbacks into a handle
+class CallbackHandle : public IOHandle {
+public:
+    CallbackHandle(AsynchIoResult::Completer completeCb,
+                   AsynchIO::RequestCallback reqCb = 0) :
+    IOHandle(new IOHandlePrivate (INVALID_SOCKET, completeCb, reqCb))
+    {}
+};
+
 AsynchIO::AsynchIO(const Socket& s,
                    ReadCallback rCb,
                    EofCallback eofCb,
@@ -447,11 +447,7 @@
         return;
 
     InterlockedIncrement(&opsInProgress);
-    IOHandlePrivate *hp =
-        new IOHandlePrivate (INVALID_SOCKET,
-                             boost::bind(&AsynchIO::completion, this, _1));
-    IOHandle h(hp);
-    PollerHandle ph(h);
+    PollerHandle ph(CallbackHandle(boost::bind(&AsynchIO::completion, this, _1)));
     poller->monitorHandle(ph, Poller::OUTPUT);
 }
 
@@ -494,7 +490,7 @@
                                  readCount);
         DWORD bytesReceived = 0, flags = 0;
         InterlockedIncrement(&opsInProgress);
-        int status = WSARecv(toFd(socket.impl),
+        int status = WSARecv(toSocketHandle(socket),
                              const_cast<LPWSABUF>(result->getWSABUF()), 1,
                              &bytesReceived,
                              &flags,
@@ -534,12 +530,9 @@
         return;
 
     InterlockedIncrement(&opsInProgress);
-    IOHandlePrivate *hp =
-        new IOHandlePrivate (INVALID_SOCKET,
-                             boost::bind(&AsynchIO::completion, this, _1),
-                             callback);
-    IOHandle h(hp);
-    PollerHandle ph(h);
+    PollerHandle ph(CallbackHandle(
+        boost::bind(&AsynchIO::completion, this, _1),
+        callback));
     poller->monitorHandle(ph, Poller::INPUT);
 }
 
@@ -596,7 +589,7 @@
                               buff,
                               buff->dataCount);
     DWORD bytesSent = 0;
-    int status = WSASend(toFd(socket.impl),
+    int status = WSASend(toSocketHandle(socket),
                          const_cast<LPWSABUF>(result->getWSABUF()), 1,
                          &bytesSent,
                          0,

Modified: qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/AsynchIoResult.h
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/AsynchIoResult.h?rev=830625&r1=830624&r2=830625&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/AsynchIoResult.h (original)
+++ qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/AsynchIoResult.h Wed Oct 28 15:39:00 2009
@@ -74,6 +74,8 @@
     int status;
 };
 
+class AsynchAcceptor;
+
 class AsynchAcceptResult : public AsynchResult {
 
     friend class AsynchAcceptor;

Modified: qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/IoHandlePrivate.h
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/IoHandlePrivate.h?rev=830625&r1=830624&r2=830625&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/IoHandlePrivate.h (original)
+++ qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/IoHandlePrivate.h Wed Oct 28 15:39:00 2009
@@ -39,6 +39,9 @@
 // can be a RequestCallback set - this carries the callback object through
 // from AsynchIO::requestCallback() through to the I/O completion processing.
 class IOHandlePrivate {
+    friend QPID_COMMON_EXTERN SOCKET toSocketHandle(const Socket& s);
+    static IOHandlePrivate* getImpl(const IOHandle& h);
+
 public:
     IOHandlePrivate(SOCKET f = INVALID_SOCKET,
                     windows::AsynchIoResult::Completer cb = 0,
@@ -51,7 +54,7 @@
     AsynchIO::RequestCallback cbRequest;
 };
 
-QPID_COMMON_EXTERN SOCKET toFd(const IOHandlePrivate* h);
+QPID_COMMON_EXTERN SOCKET toSocketHandle(const Socket& s);
 
 }}
 

Modified: qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/IocpPoller.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/IocpPoller.cpp?rev=830625&r1=830624&r2=830625&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/IocpPoller.cpp (original)
+++ qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/IocpPoller.cpp Wed Oct 28 15:39:00 2009
@@ -55,7 +55,7 @@
 };
 
 PollerHandle::PollerHandle(const IOHandle& h) :
-  impl(new PollerHandlePrivate(toFd(h.impl), h.impl->event, h.impl->cbRequest))
+  impl(new PollerHandlePrivate(toSocketHandle(static_cast<const Socket&>(h)), h.impl->event, h.impl->cbRequest))
 {}
 
 PollerHandle::~PollerHandle() {

Modified: qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/Socket.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/Socket.cpp?rev=830625&r1=830624&r2=830625&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/Socket.cpp (original)
+++ qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/Socket.cpp Wed Oct 28 15:39:00 2009
@@ -330,4 +330,14 @@
     nodelay = true;
 }
 
+inline IOHandlePrivate* IOHandlePrivate::getImpl(const qpid::sys::IOHandle &h)
+{
+    return h.impl;
+}
+
+SOCKET toSocketHandle(const Socket& s)
+{
+    return IOHandlePrivate::getImpl(s)->fd;
+}
+
 }} // namespace qpid::sys

Modified: qpid/branches/0.5.x-dev/qpid/cpp/src/tests/SocketProxy.h
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/cpp/src/tests/SocketProxy.h?rev=830625&r1=830624&r2=830625&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/cpp/src/tests/SocketProxy.h (original)
+++ qpid/branches/0.5.x-dev/qpid/cpp/src/tests/SocketProxy.h Wed Oct 28 15:39:00 2009
@@ -47,7 +47,11 @@
     // Need a Socket we can get the fd from
     class LowSocket : public qpid::sys::Socket {
     public:
+#ifdef _WIN32
+        FdType getFd() { return toSocketHandle(*this); }
+#else
         FdType getFd() { return toFd(impl); }
+#endif
     };
 
   public:



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org