void IceInternal::ThreadPoolWorkQueue::message(ThreadPoolCurrent& current) { ThreadPoolWorkItemPtr workItem; { Lock sync(*this); if(!_workItems.empty()) { workItem = _workItems.front(); _workItems.pop_front(); #if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT) if(_workItems.empty()) { char c; while(true) { ssize_t ret; # ifdef _WIN32 ret = ::recv(_fdIntrRead, &c, 1, 0); # else ret = ::read(_fdIntrRead, &c, 1); # endif if(ret == SOCKET_ERROR) { if(interrupted()) { continue; } SocketException ex(__FILE__, __LINE__); ex.error = getSocketErrno(); throw ex; } break; } } #endif } else { assert(_destroyed); #if defined(ICE_USE_IOCP) || defined(ICE_OS_WINRT) postMessage(); #endif } } if(workItem) { workItem->execute(current); } else { current.ioCompleted(); throw ThreadPoolDestroyedException(); } }
void IceInternal::ThreadPoolWorkQueue::message(ThreadPoolCurrent& current) { ThreadPoolWorkItemPtr workItem; { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_threadPool); if(!_workItems.empty()) { workItem = _workItems.front(); _workItems.pop_front(); } #if defined(ICE_USE_IOCP) || defined(ICE_OS_WINRT) else { assert(_destroyed); _threadPool._selector.completed(this, SocketOperationRead); } #else if(_workItems.empty() && !_destroyed) { _threadPool._selector.ready(this, SocketOperationRead, false); } #endif } if(workItem) { workItem->execute(current); } else { assert(_destroyed); current.ioCompleted(); throw ThreadPoolDestroyedException(); } }