diff options
Diffstat (limited to 'ACE/ace/Dev_Poll_Reactor.inl')
-rw-r--r-- | ACE/ace/Dev_Poll_Reactor.inl | 128 |
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; } |