diff options
author | Benoit Foucher <benoit@zeroc.com> | 2009-08-21 15:55:01 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2009-08-21 15:55:01 +0200 |
commit | b9f2fa14fb3f222a6ec5e0a93bf25fe5ad12b56a (patch) | |
tree | 183215e2dbeadfbc871b800ce09726e58af38b91 /cpp/src/Ice/Network.h | |
parent | adding compression cookbook demo (diff) | |
download | ice-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.h | 67 |
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); |