summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/Network.h
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2009-08-21 15:55:01 +0200
committerBenoit Foucher <benoit@zeroc.com>2009-08-21 15:55:01 +0200
commitb9f2fa14fb3f222a6ec5e0a93bf25fe5ad12b56a (patch)
tree183215e2dbeadfbc871b800ce09726e58af38b91 /cpp/src/Ice/Network.h
parentadding compression cookbook demo (diff)
downloadice-b9f2fa14fb3f222a6ec5e0a93bf25fe5ad12b56a.tar.bz2
ice-b9f2fa14fb3f222a6ec5e0a93bf25fe5ad12b56a.tar.xz
ice-b9f2fa14fb3f222a6ec5e0a93bf25fe5ad12b56a.zip
IOCP changes, bug 3501, 4200, 4156, 3101
Diffstat (limited to 'cpp/src/Ice/Network.h')
-rw-r--r--cpp/src/Ice/Network.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/cpp/src/Ice/Network.h b/cpp/src/Ice/Network.h
index a12948e35b5..7ad2de80828 100644
--- a/cpp/src/Ice/Network.h
+++ b/cpp/src/Ice/Network.h
@@ -34,6 +34,20 @@ typedef int ssize_t;
# include <netdb.h>
#endif
+#if defined(__linux) && !defined(ICE_NO_EPOLL)
+# define ICE_USE_EPOLL 1
+#elif defined(__APPLE__) && !defined(ICE_NO_KQUEUE)
+# define ICE_USE_KQUEUE 1
+#elif defined(_WIN32)
+# if !defined(ICE_NO_IOCP)
+# define ICE_USE_IOCP 1
+# else
+# define ICE_USE_SELECT 1
+# endif
+#else
+# define ICE_USE_POLL 1
+#endif
+
#if defined(_WIN32) || defined(__osf__)
typedef int socklen_t;
#endif
@@ -67,6 +81,55 @@ typedef int socklen_t;
namespace IceInternal
{
+enum SocketOperation
+{
+ SocketOperationNone = 0,
+ SocketOperationRead = 1,
+ SocketOperationWrite = 2,
+ SocketOperationConnect = 2
+};
+
+#ifdef ICE_USE_IOCP
+
+struct ICE_API AsyncInfo : WSAOVERLAPPED
+{
+ AsyncInfo(SocketOperation);
+
+ SocketOperation status;
+ WSABUF buf;
+ DWORD flags;
+ DWORD count;
+ int error;
+};
+
+#endif
+
+class ICE_API NativeInfo : virtual public IceUtil::Shared
+{
+public:
+
+ NativeInfo(SOCKET fd = INVALID_SOCKET) : _fd(fd)
+ {
+ }
+
+ SOCKET fd()
+ {
+ return _fd;
+ }
+
+#ifdef ICE_USE_IOCP
+ //
+ // This is implemented by transceiver and acceptor implementations.
+ //
+ virtual AsyncInfo* getAsyncInfo(SocketOperation) = 0;
+#endif
+
+protected:
+
+ SOCKET _fd;
+};
+typedef IceUtil::Handle<NativeInfo> NativeInfoPtr;
+
ICE_API bool interrupted();
ICE_API bool acceptInterrupted();
ICE_API bool noBuffers();
@@ -101,6 +164,10 @@ ICE_API struct sockaddr_storage doBind(SOCKET, const struct sockaddr_storage&);
ICE_API void doListen(SOCKET, int);
ICE_API bool doConnect(SOCKET, const struct sockaddr_storage&);
ICE_API void doFinishConnect(SOCKET);
+#ifdef ICE_USE_IOCP
+ICE_API void doConnectAsync(SOCKET, const struct sockaddr_storage&, AsyncInfo&);
+ICE_API void doFinishConnectAsync(SOCKET, AsyncInfo&);
+#endif
ICE_API SOCKET doAccept(SOCKET);
ICE_API struct sockaddr_storage getAddressForServer(const std::string&, int, ProtocolSupport);