diff options
author | Alan Conway <aconway@apache.org> | 2009-07-09 20:38:23 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2009-07-09 20:38:23 +0000 |
commit | 0c5ace5d2114d638bdef5f4c2e29521c43f140a4 (patch) | |
tree | 575392461bf2bc98f8ea4b8f2c9241aad134cf55 /cpp/src/qpid/sys/posix/PollableCondition.cpp | |
parent | c25ed489bd7a5ae7fce248dcc105b9ad7f6a1e65 (diff) | |
download | qpid-python-0c5ace5d2114d638bdef5f4c2e29521c43f140a4.tar.gz |
Simplified PollableCondition
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@792676 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys/posix/PollableCondition.cpp')
-rw-r--r-- | cpp/src/qpid/sys/posix/PollableCondition.cpp | 113 |
1 files changed, 25 insertions, 88 deletions
diff --git a/cpp/src/qpid/sys/posix/PollableCondition.cpp b/cpp/src/qpid/sys/posix/PollableCondition.cpp index 0991e5fd76..b22a615a54 100644 --- a/cpp/src/qpid/sys/posix/PollableCondition.cpp +++ b/cpp/src/qpid/sys/posix/PollableCondition.cpp @@ -46,8 +46,8 @@ private: ~PollableConditionPrivate(); void dispatch(sys::DispatchHandle& h); - void rewatch(); - void unwatch(); + void set(); + void clear(); private: PollableCondition::Callback cb; @@ -57,10 +57,11 @@ private: std::auto_ptr<DispatchHandleRef> handle; }; -PollableConditionPrivate::PollableConditionPrivate(const sys::PollableCondition::Callback& cb, - sys::PollableCondition& parent, - const boost::shared_ptr<sys::Poller>& poller) - : IOHandle(new sys::IOHandlePrivate), cb(cb), parent(parent) +PollableConditionPrivate::PollableConditionPrivate( + const sys::PollableCondition::Callback& cb, + sys::PollableCondition& parent, + const boost::shared_ptr<sys::Poller>& poller +) : IOHandle(new sys::IOHandlePrivate), cb(cb), parent(parent) { int fds[2]; if (::pipe(fds) == -1) @@ -71,39 +72,41 @@ PollableConditionPrivate::PollableConditionPrivate(const sys::PollableCondition: throw ErrnoException(QPID_MSG("Can't create PollableCondition")); if (::fcntl(writeFd, F_SETFL, O_NONBLOCK) == -1) throw ErrnoException(QPID_MSG("Can't create PollableCondition")); - handle.reset (new DispatchHandleRef(*this, - boost::bind(&sys::PollableConditionPrivate::dispatch, this, _1), - 0, 0)); + handle.reset (new DispatchHandleRef( + *this, + boost::bind(&sys::PollableConditionPrivate::dispatch, this, _1), + 0, 0)); handle->startWatch(poller); handle->unwatch(); + + // Make the read FD readable + static const char dummy=0; + ssize_t n = ::write(writeFd, &dummy, 1); + if (n == -1 && errno != EAGAIN) + throw ErrnoException("Error setting PollableCondition"); } -PollableConditionPrivate::~PollableConditionPrivate() -{ +PollableConditionPrivate::~PollableConditionPrivate() { handle->stopWatch(); close(writeFd); } -void PollableConditionPrivate::dispatch(sys::DispatchHandle& /*h*/) -{ +void PollableConditionPrivate::dispatch(sys::DispatchHandle&) { cb(parent); } -void PollableConditionPrivate::rewatch() -{ +void PollableConditionPrivate::set() { handle->rewatch(); } -void PollableConditionPrivate::unwatch() -{ +void PollableConditionPrivate::clear() { handle->unwatch(); } - /* PollableCondition */ PollableCondition::PollableCondition(const Callback& cb, - const boost::shared_ptr<sys::Poller>& poller) - : impl(new PollableConditionPrivate(cb, *this, poller)) + const boost::shared_ptr<sys::Poller>& poller +) : impl(new PollableConditionPrivate(cb, *this, poller)) { } @@ -112,75 +115,9 @@ PollableCondition::~PollableCondition() delete impl; } -void PollableCondition::set() { - static const char dummy=0; - ssize_t n = ::write(impl->writeFd, &dummy, 1); - if (n == -1 && errno != EAGAIN) - throw ErrnoException("Error setting PollableCondition"); -} - -bool PollableCondition::clear() { - char buf[256]; - ssize_t n; - bool wasSet = false; - while ((n = ::read(impl->impl->fd, buf, sizeof(buf))) > 0) - wasSet = true; - if (n == -1 && errno != EAGAIN) - throw ErrnoException(QPID_MSG("Error clearing PollableCondition")); - return wasSet; -} - -void PollableCondition::disarm() { - impl->unwatch(); -} - -void PollableCondition::rearm() { - impl->rewatch(); -} - - -#if 0 -// FIXME aconway 2008-08-12: More efficient Linux implementation using -// eventfd system call. Move to separate file & do configure.ac test -// to enable this when ::eventfd() is available. - -#include <sys/eventfd.h> +void PollableCondition::set() { impl->set(); } -namespace qpid { -namespace sys { - -PollableConditionPrivate::PollableConditionPrivate(const PollableCondition::Callback& cb, - sys::PollableCondition& parent, - const boost::shared_ptr<sys::Poller>& poller) - : cb(cb), parent(parent), poller(poller), - IOHandle(new sys::IOHandlePrivate) { - impl->fd = ::eventfd(0, 0); - if (impl->fd < 0) throw ErrnoException("conditionfd() failed"); -} - -void PollableCondition::set() { - static const uint64_t value=1; - ssize_t n = ::write(impl->impl->fd, - reinterpret_cast<const void*>(&value), 8); - if (n != 8) throw ErrnoException("write failed on conditionfd"); -} - -bool PollableCondition::clear() { - char buf[8]; - ssize_t n = ::read(impl->impl->fd, buf, 8); - if (n != 8) throw ErrnoException("read failed on conditionfd"); - return *reinterpret_cast<uint64_t*>(buf); -} - -void PollableCondition::disarm() { - // ???? -} - -void PollableCondition::rearm() { - // ???? -} - -#endif +void PollableCondition::clear() { impl->clear(); } }} // namespace qpid::sys |