summaryrefslogtreecommitdiff
path: root/ACE/ace/Dev_Poll_Reactor.inl
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/ace/Dev_Poll_Reactor.inl')
-rw-r--r--ACE/ace/Dev_Poll_Reactor.inl128
1 files changed, 17 insertions, 111 deletions
diff --git a/ACE/ace/Dev_Poll_Reactor.inl b/ACE/ace/Dev_Poll_Reactor.inl
index b7034e07333..391de5c290d 100644
--- a/ACE/ace/Dev_Poll_Reactor.inl
+++ b/ACE/ace/Dev_Poll_Reactor.inl
@@ -1,5 +1,4 @@
// -*- C++ -*-
-//
// $Id$
#include "ace/Log_Msg.h"
@@ -7,89 +6,31 @@
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
ACE_INLINE
-ACE_Dev_Poll_Event_Tuple::ACE_Dev_Poll_Event_Tuple (void)
- : event_handler (0),
- mask (ACE_Event_Handler::NULL_MASK),
- suspended (0)
+ACE_Dev_Poll_Reactor::Event_Tuple::Event_Tuple (ACE_Event_Handler *eh,
+ ACE_Reactor_Mask m,
+ bool is_suspended,
+ bool is_controlled)
+ : event_handler (eh),
+ mask (m),
+ suspended (is_suspended),
+ controlled (is_controlled)
{
}
// ---------------------------------------------------------------------
-#if 0
-ACE_INLINE
-ACE_Dev_Poll_Ready_Set::ACE_Dev_Poll_Ready_Set (void)
- : pfds (0),
- nfds (0)
-{
-}
-#endif /* 0 */
-
-// ---------------------------------------------------------------------
-
-ACE_INLINE void
-ACE_Dev_Poll_Reactor_Handler_Repository::mask (ACE_HANDLE handle,
- ACE_Reactor_Mask mask)
-{
- ACE_TRACE ("ACE_Dev_Poll_Reactor_Handler_Repository::mask");
-
- // Only bother to search for the handle if it's in range.
- if (this->handle_in_range (handle))
- this->handlers_[handle].mask = mask;
-}
-
-ACE_INLINE ACE_Reactor_Mask
-ACE_Dev_Poll_Reactor_Handler_Repository::mask (ACE_HANDLE handle)
-{
- ACE_TRACE ("ACE_Dev_Poll_Reactor_Handler_Repository::mask");
-
- ACE_Reactor_Mask mask = ACE_Event_Handler::NULL_MASK;
-
- // Only bother to search for the handle if it's in range.
- if (this->handle_in_range (handle))
- mask = this->handlers_[handle].mask;
-
- if (mask == ACE_Event_Handler::NULL_MASK)
- errno = ENOENT;
-
- return mask;
-}
-
-ACE_INLINE void
-ACE_Dev_Poll_Reactor_Handler_Repository::suspend (ACE_HANDLE handle)
-{
- ACE_TRACE ("ACE_Dev_Poll_Reactor_Handler_Repository::suspend");
-
- // Only bother to search for the handle if it's in range.
- if (this->handle_in_range (handle))
- this->handlers_[handle].suspended = 1;
-}
-
-ACE_INLINE void
-ACE_Dev_Poll_Reactor_Handler_Repository::resume (ACE_HANDLE handle)
-{
- ACE_TRACE ("ACE_Dev_Poll_Reactor_Handler_Repository::resume");
-
- // Only bother to search for the handle if it's in range.
- if (this->handle_in_range (handle))
- this->handlers_[handle].suspended = 0;
-}
-
-ACE_INLINE int
-ACE_Dev_Poll_Reactor_Handler_Repository::suspended (ACE_HANDLE handle) const
+ACE_INLINE size_t
+ACE_Dev_Poll_Reactor::Handler_Repository::size (void) const
{
- ACE_TRACE ("ACE_Dev_Poll_Reactor_Handler_Repository::suspended");
-
- if (this->handle_in_range (handle))
- return this->handlers_[handle].suspended;
+ ACE_TRACE ("ACE_Dev_Poll_Reactor::Handler_Repository::size");
- return -1;
+ return this->size_;
}
ACE_INLINE size_t
-ACE_Dev_Poll_Reactor_Handler_Repository::size (void) const
+ACE_Dev_Poll_Reactor::Handler_Repository::max_size (void) const
{
- ACE_TRACE ("ACE_Dev_Poll_Reactor_Handler_Repository::size");
+ ACE_TRACE ("ACE_Dev_Poll_Reactor::Handler_Repository::max_size");
return this->max_size_;
}
@@ -112,33 +53,6 @@ ACE_Dev_Poll_Handler_Guard::ACE_Dev_Poll_Handler_Guard
if (do_incr && this->refcounted_)
eh->add_reference ();
-
- /**
- * The below comments were here when I replaced the old refcount
- * scheme was replaced. They may still need addressing. -Steve Huston
- */
-
- /**
- * @todo Suspend the handler so that other threads will not cause
- * an event that is already in an upcall from being dispatched
- * again.
- *
- * @note The naive approach would be to simply call
- * suspend_handler_i() on the reactor. However, that would
- * cause a system call (write()) to occur. Obviously this
- * can potentially have an adverse affect on performance.
- * Ideally, the handler would only be marked as "suspended" in
- * the handler repository. If an event arrives for a
- * suspended handler that event can be "queued" in a
- * "handle readiness queue." "Queued" is quoted since a real
- * queue need not be used since duplicate events can be
- * coalesced, thus avoiding unbounded queue growth. Event
- * coalescing is already done by Linux's event poll driver
- * (/dev/epoll) so Solaris' poll driver (/dev/poll) is the
- * main concern here. The largest the queue can be is the
- * same size as the number of handlers stored in the handler
- * repository.
- */
}
ACE_INLINE
@@ -146,15 +60,6 @@ ACE_Dev_Poll_Handler_Guard::~ACE_Dev_Poll_Handler_Guard (void)
{
if (this->refcounted_ && this->eh_ != 0)
this->eh_->remove_reference ();
-
- /**
- * The below comments were here when I replaced the old refcount
- * scheme was replaced. They may still need addressing. -Steve Huston
- */
- /**
- * @todo Resume the handler so that other threads will be allowed to
- * dispatch the handler.
- */
}
ACE_INLINE void
@@ -172,14 +77,15 @@ ACE_Dev_Poll_Reactor::upcall (ACE_Event_Handler *event_handler,
{
// If the handler returns positive value (requesting a reactor
// callback) just call back as many times as the handler requests
- // it. Other threads are off handling other things.
+ // it. The handler is suspended internally and other threads are off
+ // handling other things.
int status = 0;
do
{
status = (event_handler->*callback) (handle);
}
- while (status > 0);
+ while (status > 0 && event_handler != this->notify_handler_);
return status;
}