diff options
author | Benoit Foucher <benoit@zeroc.com> | 2007-02-01 21:03:17 +0000 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2007-02-01 21:03:17 +0000 |
commit | 0e657ed67fb888b5eb50376c7a7b33bed1afe815 (patch) | |
tree | b20ff8cf00048522067ec0e51fc52309457b88a3 /cpp/src/Ice/ThreadPool.cpp | |
parent | Java6 support (diff) | |
download | ice-0e657ed67fb888b5eb50376c7a7b33bed1afe815.tar.bz2 ice-0e657ed67fb888b5eb50376c7a7b33bed1afe815.tar.xz ice-0e657ed67fb888b5eb50376c7a7b33bed1afe815.zip |
Fixed bug 1710
Diffstat (limited to 'cpp/src/Ice/ThreadPool.cpp')
-rw-r--r-- | cpp/src/Ice/ThreadPool.cpp | 78 |
1 files changed, 76 insertions, 2 deletions
diff --git a/cpp/src/Ice/ThreadPool.cpp b/cpp/src/Ice/ThreadPool.cpp index 6e122f575f0..6486df6a162 100644 --- a/cpp/src/Ice/ThreadPool.cpp +++ b/cpp/src/Ice/ThreadPool.cpp @@ -66,7 +66,7 @@ IceInternal::ThreadPool::ThreadPool(const InstancePtr& instance, const string& p throw ex; } _events.resize(1); - epoll_event event; + struct epoll_event event; event.events = EPOLLIN; event.data.fd = _fdIntrRead; if(epoll_ctl(_epollFd, EPOLL_CTL_ADD, _fdIntrRead, &event) != 0) @@ -75,6 +75,23 @@ IceInternal::ThreadPool::ThreadPool(const InstancePtr& instance, const string& p ex.error = getSocketErrno(); throw ex; } +#elif defined(__APPLE__) + _kqueueFd = kqueue(); + if(_kqueueFd < 0) + { + SocketException ex(__FILE__, __LINE__); + ex.error = getSocketErrno(); + throw ex; + } + _events.resize(1); + struct kevent event; + EV_SET(&event, _fdIntrRead, EVFILT_READ, EV_ADD, 0, 0, 0); + if(kevent(_kqueueFd, &event, 1, 0, 0, 0) < 0) + { + SocketException ex(__FILE__, __LINE__); + ex.error = getSocketErrno(); + throw ex; + } #else _pollFdSet.resize(1); _pollFdSet[0].fd = _fdIntrRead; @@ -180,7 +197,7 @@ IceInternal::ThreadPool::~ThreadPool() out << "exception in `" << _prefix << "' while calling closeSocket():\n" << ex; } -#ifdef __linux +#if defined(__linux) try { closeSocket(_epollFd); @@ -190,6 +207,16 @@ IceInternal::ThreadPool::~ThreadPool() Error out(_instance->initializationData().logger); out << "exception in `" << _prefix << "' while calling closeSocket():\n" << ex; } +#elif defined(__APPLE__) + try + { + closeSocket(_kqueueFd); + } + catch(const LocalException& ex) + { + Error out(_instance->initializationData().logger); + out << "exception in `" << _prefix << "' while calling closeSocket():\n" << ex; + } #endif } @@ -433,6 +460,18 @@ IceInternal::ThreadPool::run() } #elif defined(__linux) ret = epoll_wait(_epollFd, &_events[0], _events.size(), _timeout > 0 ? _timeout * 1000 : -1); +#elif defined(__APPLE__) + if(_timeout > 0) + { + struct timespec ts; + ts.tv_sec = _timeout; + ts.tv_nsec = 0; + ret = kevent(_kqueueFd, 0, 0, &_events[0], _events.size(), &ts); + } + else + { + ret = kevent(_kqueueFd, 0, 0, &_events[0], _events.size(), 0); + } #else ret = poll(&_pollFdSet[0], _pollFdSet.size(), _timeout > 0 ? _timeout * 1000 : -1); #endif @@ -479,6 +518,15 @@ IceInternal::ThreadPool::run() break; } } +#elif defined(__APPLE__) + for(int i = 0; i < ret; ++i) + { + if(_events[i].ident == static_cast<unsigned int>(_fdIntrRead)) + { + interrupted = true; + break; + } + } #else assert(_pollFdSet[0].fd == _fdIntrRead); interrupted = _pollFdSet[0].revents != 0; @@ -532,6 +580,17 @@ IceInternal::ThreadPool::run() continue; } _events.resize(_handlerMap.size() + 1); +#elif defined(__APPLE__) + struct kevent event; + EV_SET(&event, change.first, EVFILT_READ, EV_ADD, 0, 0, 0); + if(kevent(_kqueueFd, &event, 1, 0, 0, 0) < 0) + { + Error out(_instance->initializationData().logger); + out << "error while adding filedescriptor to kqueue:\n"; + out << errorToString(getSocketErrno()); + continue; + } + _events.resize(_handlerMap.size() + 1); #else struct pollfd pollFd; pollFd.fd = change.first; @@ -562,6 +621,17 @@ IceInternal::ThreadPool::run() continue; } _events.resize(_handlerMap.size() + 1); +#elif defined(__APPLE__) + struct kevent event; + EV_SET(&event, change.first, EVFILT_READ, EV_DELETE, 0, 0, 0); + if(kevent(_kqueueFd, &event, 1, 0, 0, 0) < 0) + { + Error out(_instance->initializationData().logger); + out << "error while removing filedescriptor to kqueue:\n"; + out << errorToString(getSocketErrno()); + continue; + } + _events.resize(_handlerMap.size() + 1); #else for(vector<struct pollfd>::iterator p = _pollFdSet.begin(); p != _pollFdSet.end(); ++p) { @@ -606,6 +676,10 @@ IceInternal::ThreadPool::run() for(int i = 0; i < ret; ++i) { SOCKET fd = _events[i].data.fd; +#elif defined(__APPLE__) + for(int i = 0; i < ret; ++i) + { + SOCKET fd = _events[i].ident; #else for(vector<struct pollfd>::const_iterator p = _pollFdSet.begin(); p != _pollFdSet.end(); ++p) { |