diff options
author | Benoit Foucher <benoit@zeroc.com> | 2007-11-27 11:58:35 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2007-11-27 11:58:35 +0100 |
commit | 47f800495093fd7679a315e2d730fea22f6135b7 (patch) | |
tree | a7b8d3488f3841367dd03d10cae293f36fd10481 /cpp/src/Ice/Selector.h | |
parent | Fixed SystemException to no longer derive from LocalException (diff) | |
download | ice-47f800495093fd7679a315e2d730fea22f6135b7.tar.bz2 ice-47f800495093fd7679a315e2d730fea22f6135b7.tar.xz ice-47f800495093fd7679a315e2d730fea22f6135b7.zip |
- Added support for non-blocking AMI/batch requests, connection
creation.
- Added support for AMI oneway requests.
- Changed collocation optimization to not perform any DNS lookups.
Diffstat (limited to 'cpp/src/Ice/Selector.h')
-rw-r--r-- | cpp/src/Ice/Selector.h | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/cpp/src/Ice/Selector.h b/cpp/src/Ice/Selector.h new file mode 100644 index 00000000000..4d680f14302 --- /dev/null +++ b/cpp/src/Ice/Selector.h @@ -0,0 +1,137 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#ifndef ICE_SELECTOR_H +#define ICE_SELECTOR_H + +#include <Ice/Config.h> +#include <Ice/InstanceF.h> + +#if defined(_WIN32) +# include <winsock2.h> +#else +# define SOCKET int +# if defined(ICE_USE_EPOLL) +# include <sys/epoll.h> +# elif defined(__APPLE__) +# include <sys/event.h> +# else +# include <sys/poll.h> +# endif +#endif + + +namespace IceInternal +{ + +enum SocketStatus +{ + Finished, + NeedConnect, + NeedRead, + NeedWrite +}; + +class Selector +{ +public: + + Selector(const InstancePtr&, int = 0); + ~Selector(); + + void add(SOCKET, SocketStatus); + void remove(SOCKET, SocketStatus); + + int select(); + SOCKET getNextSelected(); + + bool isInterrupted() + { + assert(_nSelected > 0); +#if defined(_WIN32) + return FD_ISSET(_fdIntrRead, &_selectedReadFdSet); +#elif defined(ICE_USE_EPOLL) + for(unsigned int i = 0; i < _nSelected; ++i) + { + if(_events[i].data.fd == _fdIntrRead) + { + return true; + } + } + return false; +#elif defined(__APPLE__) + for(unsigned int i = 0; i < _nSelected; ++i) + { + if(_events[i].ident == static_cast<unsigned int>(_fdIntrRead)) + { + return true; + } + } + return false; +#else + assert(_pollFdSet[0]->fd == _fdIntrRead); + return _pollFdSet[0]->revents != 0; +#endif + } + void setInterrupt(); + void clearInterrupt(); + + void updateMinMax(SOCKET minFd, SOCKET maxFd); + void clearMinMax(); + +#if defined(_WIN32) + void incFdsInUse(); + void decFdsInUse(); +#endif + +private: + + InstancePtr _instance; + int _timeout; + SOCKET _maxFd; + SOCKET _lastFd; + unsigned int _nSelected; + unsigned int _nSelectedReturned; + SOCKET _fdIntrRead; + SOCKET _fdIntrWrite; +#if defined(_WIN32) + fd_set _readFdSet; + fd_set _writeFdSet; + fd_set _errorFdSet; + fd_set _selectedReadFdSet; + fd_set _selectedWriteFdSet; + fd_set _selectedErrorFdSet; + int _fdsInUse; + + fd_set* + fdSetCopy(fd_set& dest, fd_set& src) + { + if(src.fd_count > 0) + { + dest.fd_count = src.fd_count; + memcpy(dest.fd_array, src.fd_array, sizeof(SOCKET) * src.fd_count); + return &dest; + } + return 0; + } + +#elif defined(ICE_USE_EPOLL) + int _epollFd; + std::vector<struct epoll_event> _events; +#elif defined(__APPLE__) + int _kqueueFd; + std::vector<struct kevent> _events; +#else + std::vector<struct pollfd> _pollFdSet; +#endif +}; + +} + +#endif |