diff options
| author | Andrew Stitcher <astitcher@apache.org> | 2007-11-29 11:34:15 +0000 |
|---|---|---|
| committer | Andrew Stitcher <astitcher@apache.org> | 2007-11-29 11:34:15 +0000 |
| commit | d1f32f54b73807b778eb6027bb048f9e7b0e808f (patch) | |
| tree | 0986a7f6f562bd6c0740e26ada91ee5692646583 /cpp/src/qpid/sys/epoll | |
| parent | d36b4e5ebf15a2ceac2f5f10370031d7d55a979d (diff) | |
| download | qpid-python-d1f32f54b73807b778eb6027bb048f9e7b0e808f.tar.gz | |
- Eliminated a race condition on deletion of PollerHandles
* Added DeletionManager class to delete handles
* Used to stop PollerHandles being deleted whilst still in use
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@599390 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys/epoll')
| -rw-r--r-- | cpp/src/qpid/sys/epoll/EpollPoller.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/cpp/src/qpid/sys/epoll/EpollPoller.cpp b/cpp/src/qpid/sys/epoll/EpollPoller.cpp index 57acafd928..0e984d49ee 100644 --- a/cpp/src/qpid/sys/epoll/EpollPoller.cpp +++ b/cpp/src/qpid/sys/epoll/EpollPoller.cpp @@ -21,6 +21,7 @@ #include "qpid/sys/Poller.h" #include "qpid/sys/Mutex.h" +#include "qpid/sys/DeletionManager.h" #include "qpid/sys/posix/check.h" #include "qpid/sys/posix/PrivatePosix.h" @@ -34,6 +35,13 @@ namespace qpid { namespace sys { +// Deletion manager to handle deferring deletion of PollerHandles to when they definitely aren't being used +DeletionManager<PollerHandle> PollerHandleDeletionManager; + +// Instantiate (and define) class static for DeletionManager +template <> +DeletionManager<PollerHandle>::AllThreadsStatuses DeletionManager<PollerHandle>::allThreadsStatuses(0); + class PollerHandlePrivate { friend class Poller; friend class PollerHandle; @@ -98,6 +106,10 @@ PollerHandle::~PollerHandle() { delete impl; } +void PollerHandle::deferDelete() { + PollerHandleDeletionManager.markForDeletion(this); +} + /** * Concrete implementation of Poller to use the Linux specific epoll * interface @@ -239,9 +251,9 @@ void Poller::rearmFd(PollerHandle& handle) { } void Poller::shutdown() { - // Allow sloppy code to shut us down more than once - if (impl->isShutdown) - return; + // Allow sloppy code to shut us down more than once + if (impl->isShutdown) + return; // Don't use any locking here - isshutdown will be visible to all // after the epoll_ctl() anyway (it's a memory barrier) @@ -261,6 +273,7 @@ Poller::Event Poller::wait(Duration timeout) { // Repeat until we weren't interupted do { + PollerHandleDeletionManager.markAllUnusedInThisThread(); int rc = ::epoll_wait(impl->epollFd, &epe, 1, timeoutMs); if (impl->isShutdown) { |
