diff options
author | Benoit Foucher <benoit@zeroc.com> | 2015-10-09 15:24:33 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2015-10-09 15:24:33 +0200 |
commit | f617adf77f5b559f090cec5420bc9d3f5ac05605 (patch) | |
tree | 9ce39b3ffc995e1f5c1bc84ad8a39e0f3409485f /cpp/src | |
parent | Added ready callback to allow transports to signal readiness to the thread pool (diff) | |
download | ice-f617adf77f5b559f090cec5420bc9d3f5ac05605.tar.bz2 ice-f617adf77f5b559f090cec5420bc9d3f5ac05605.tar.xz ice-f617adf77f5b559f090cec5420bc9d3f5ac05605.zip |
Fixed merge issue from previous commit
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/Selector.cpp | 209 |
1 files changed, 5 insertions, 204 deletions
diff --git a/cpp/src/Ice/Selector.cpp b/cpp/src/Ice/Selector.cpp index e01f3d7f65a..1035955b050 100644 --- a/cpp/src/Ice/Selector.cpp +++ b/cpp/src/Ice/Selector.cpp @@ -433,8 +433,7 @@ Selector::update(EventHandler* handler, SocketOperation remove, SocketOperation void Selector::enable(EventHandler* handler, SocketOperation status) { - NativeInfoPtr nativeInfo = handler->getNativeInfo(); - if(!nativeInfo || !(handler->_disabled & status)) + if(!(handler->_disabled & status)) { return; } @@ -477,14 +476,12 @@ Selector::enable(EventHandler* handler, SocketOperation status) wakeup(); #endif } - checkReady(handler); } void Selector::disable(EventHandler* handler, SocketOperation status) { - NativeInfoPtr nativeInfo = handler->getNativeInfo(); - if(!nativeInfo || handler->_disabled & status) + if(handler->_disabled & status) { return; } @@ -526,7 +523,6 @@ Selector::disable(EventHandler* handler, SocketOperation status) wakeup(); #endif } - checkReady(handler); } bool @@ -621,7 +617,6 @@ Selector::startSelect() } _interrupted = false; } -} #if !defined(ICE_USE_EPOLL) if(!_changes.empty()) @@ -1012,11 +1007,11 @@ toCFCallbacks(SocketOperation op) { cbs |= kCFSocketWriteCallBack; } - - if(_count == 0 && !_selectNow) + if(op & SocketOperationConnect) { - throw SelectorTimeoutException(); + cbs |= kCFSocketConnectCallBack; } + return cbs; } } @@ -1036,192 +1031,6 @@ EventHandlerWrapper::EventHandlerWrapper(const EventHandlerPtr& handler, Selecto } else if(handler->getNativeInfo()) { - _readyHandlers.insert(make_pair(handler, SocketOperationNone)); - wakeup(); - } -} - -void -Selector::updateSelector() -{ -#if defined(ICE_USE_KQUEUE) - int rs = kevent(_queueFd, &_changes[0], _changes.size(), 0, 0, 0); - if(rs < 0) - { - Ice::Error out(_instance->initializationData().logger); - out << "error while updating selector:\n" << IceUtilInternal::errorToString(IceInternal::getSocketErrno()); - } - _changes.clear(); -#elif !defined(ICE_USE_EPOLL) - assert(!_selecting); - - for(vector<pair<EventHandler*, SocketOperation> >::const_iterator p = _changes.begin(); p != _changes.end(); ++p) - { - EventHandler* handler = p->first; - SocketOperation status = p->second; - - SOCKET fd = handler->getNativeInfo()->fd(); - if(status) - { -#if defined(ICE_USE_SELECT) - if(status & SocketOperationRead) - { - FD_SET(fd, &_readFdSet); - } - else - { - FD_CLR(fd, &_readFdSet); - } - if(status & SocketOperationWrite) - { - FD_SET(fd, &_writeFdSet); - } - else - { - FD_CLR(fd, &_writeFdSet); - } - if(status & SocketOperationConnect) - { - FD_SET(fd, &_writeFdSet); - FD_SET(fd, &_errorFdSet); - } - else - { - FD_CLR(fd, &_writeFdSet); - FD_CLR(fd, &_errorFdSet); - } - _handlers[fd] = handler; -#else - short events = 0; - if(status & SocketOperationRead) - { - events |= POLLIN; - } - if(status & SocketOperationWrite) - { - events |= POLLOUT; - } - map<SOCKET, EventHandler*>::const_iterator q = _handlers.find(fd); - if(q == _handlers.end()) - { - struct pollfd pollFd; - pollFd.fd = fd; - pollFd.events = events; - pollFd.revents = 0; - _pollFdSet.push_back(pollFd); - _handlers.insert(make_pair(fd, handler)); - } - else - { - for(vector<struct pollfd>::iterator r = _pollFdSet.begin(); r != _pollFdSet.end(); ++r) - { - if(r->fd == fd) - { - r->events = events; - break; - } - } - } -#endif - } - else - { -#if defined(ICE_USE_SELECT) - FD_CLR(fd, &_readFdSet); - FD_CLR(fd, &_writeFdSet); - FD_CLR(fd, &_errorFdSet); -#else - for(vector<struct pollfd>::iterator r = _pollFdSet.begin(); r != _pollFdSet.end(); ++r) - { - if(r->fd == fd) - { - _pollFdSet.erase(r); - break; - } - } -#endif - _handlers.erase(fd); - } - } - _changes.clear(); -#endif -} - -#elif defined(ICE_USE_CFSTREAM) - -namespace -{ - -void selectorInterrupt(void* info) -{ - reinterpret_cast<Selector*>(info)->processInterrupt(); -} - -void eventHandlerSocketCallback(CFSocketRef, CFSocketCallBackType callbackType, CFDataRef, const void* d, void* info) -{ - if(callbackType == kCFSocketReadCallBack) - { - reinterpret_cast<EventHandlerWrapper*>(info)->readyCallback(SocketOperationRead); - } - else if(callbackType == kCFSocketWriteCallBack) - { - reinterpret_cast<EventHandlerWrapper*>(info)->readyCallback(SocketOperationWrite); - } - else if(callbackType == kCFSocketConnectCallBack) - { - reinterpret_cast<EventHandlerWrapper*>(info)->readyCallback(SocketOperationConnect, - d ? *reinterpret_cast<const SInt32*>(d) : 0); - } -} - -class SelectorHelperThread : public IceUtil::Thread -{ -public: - - SelectorHelperThread(Selector& selector) : _selector(selector) - { - } - - virtual void run() - { - _selector.run(); - } - -private: - - Selector& _selector; -}; - -CFOptionFlags -toCFCallbacks(SocketOperation op) -{ - CFOptionFlags cbs = 0; - if(op & SocketOperationRead) - { - cbs |= kCFSocketReadCallBack; - } - if(op & SocketOperationWrite) - { - cbs |= kCFSocketWriteCallBack; - } - if(op & SocketOperationConnect) - { - cbs |= kCFSocketConnectCallBack; - } - return cbs; -} - -} - -EventHandlerWrapper::EventHandlerWrapper(const EventHandlerPtr& handler, Selector& selector) : - _handler(handler), - _nativeInfo(StreamNativeInfoPtr::dynamicCast(handler->getNativeInfo())), - _selector(selector), - _ready(SocketOperationNone), - _finish(false) -{ - if(!StreamNativeInfoPtr::dynamicCast(handler->getNativeInfo())) - { SOCKET fd = handler->getNativeInfo()->fd(); CFSocketContext ctx = { 0, this, 0, 0, 0 }; _socket = CFSocketCreateWithNative(kCFAllocatorDefault, @@ -1237,12 +1046,6 @@ EventHandlerWrapper::EventHandlerWrapper(const EventHandlerPtr& handler, Selecto CFSocketDisableCallBacks(_socket, kCFSocketReadCallBack | kCFSocketWriteCallBack | kCFSocketConnectCallBack); _source = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _socket, 0); } - else - { - _socket = 0; - _source = 0; - _nativeInfo->initStreams(this); - } } EventHandlerWrapper::~EventHandlerWrapper() @@ -1662,5 +1465,3 @@ Selector::addReadyHandler(EventHandlerWrapper* wrapper) } #endif - - |