#include <Dev_Poll_Reactor.h>
Inheritance diagram for ACE_Dev_Poll_Reactor:


Public Member Functions | |
| ACE_Dev_Poll_Reactor (ACE_Sig_Handler *=0, ACE_Timer_Queue *=0, int disable_notify_pipe=0, ACE_Reactor_Notify *notify=0, int mask_signals=1, int s_queue=ACE_DEV_POLL_TOKEN::FIFO) | |
Initialize ACE_Dev_Poll_Reactor with the default size. | |
| ACE_Dev_Poll_Reactor (size_t size, int restart=0, ACE_Sig_Handler *=0, ACE_Timer_Queue *=0, int disable_notify_pipe=0, ACE_Reactor_Notify *notify=0, int mask_signals=1, int s_queue=ACE_DEV_POLL_TOKEN::FIFO) | |
| Initialize ACE_Dev_Poll_Reactor with size size. | |
| virtual | ~ACE_Dev_Poll_Reactor (void) |
| Close down and release all resources. | |
| virtual int | open (size_t size, int restart=0, ACE_Sig_Handler *=0, ACE_Timer_Queue *=0, int disable_notify_pipe=0, ACE_Reactor_Notify *=0) |
| Initialization. | |
| virtual int | current_info (ACE_HANDLE handle, size_t &) |
| virtual int | set_sig_handler (ACE_Sig_Handler *signal_handler) |
| Use a user specified signal handler instead. | |
| virtual int | timer_queue (ACE_Timer_Queue *tq) |
| Set a user-specified timer queue. | |
| virtual ACE_Timer_Queue * | timer_queue (void) const |
| virtual int | close (void) |
| Close down and release all resources. | |
| virtual int | work_pending (const ACE_Time_Value &max_wait_time=ACE_Time_Value::zero) |
| virtual int | handle_events (ACE_Time_Value *max_wait_time=0) |
| virtual int | alertable_handle_events (ACE_Time_Value *max_wait_time=0) |
| virtual int | handle_events (ACE_Time_Value &max_wait_time) |
| virtual int | alertable_handle_events (ACE_Time_Value &max_wait_time) |
| virtual int | deactivated (void) |
| virtual void | deactivate (int do_stop) |
| virtual int | register_handler (ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask) |
| virtual int | register_handler (ACE_HANDLE io_handle, ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask) |
| virtual int | register_handler (ACE_HANDLE event_handle, ACE_HANDLE io_handle, ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask) |
| virtual int | register_handler (const ACE_Handle_Set &handles, ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask) |
| virtual int | register_handler (int signum, ACE_Event_Handler *new_sh, ACE_Sig_Action *new_disp=0, ACE_Event_Handler **old_sh=0, ACE_Sig_Action *old_disp=0) |
| virtual int | register_handler (const ACE_Sig_Set &sigset, ACE_Event_Handler *new_sh, ACE_Sig_Action *new_disp=0) |
| virtual int | remove_handler (ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask) |
| Removes event_handler. | |
| virtual int | remove_handler (ACE_HANDLE handle, ACE_Reactor_Mask mask) |
| virtual int | remove_handler (const ACE_Handle_Set &handle_set, ACE_Reactor_Mask mask) |
| virtual int | remove_handler (int signum, ACE_Sig_Action *new_disp, ACE_Sig_Action *old_disp=0, int sigkey=-1) |
| virtual int | remove_handler (const ACE_Sig_Set &sigset) |
| Calls for every signal in . | |
| virtual int | suspend_handler (ACE_Event_Handler *event_handler) |
| virtual int | suspend_handler (ACE_HANDLE handle) |
| Suspend handle temporarily. | |
| virtual int | suspend_handler (const ACE_Handle_Set &handles) |
| Suspend all handles in handle set temporarily. | |
| virtual int | suspend_handlers (void) |
| Suspend all handles temporarily. | |
| virtual int | resume_handler (ACE_Event_Handler *event_handler) |
| virtual int | resume_handler (ACE_HANDLE handle) |
| Resume handle. | |
| virtual int | resume_handler (const ACE_Handle_Set &handles) |
| Resume all handles in handle set. | |
| virtual int | resume_handlers (void) |
| Resume all handles. | |
| virtual int | resumable_handler (void) |
| virtual int | uses_event_associations (void) |
| virtual long | schedule_timer (ACE_Event_Handler *event_handler, const void *arg, const ACE_Time_Value &delay, const ACE_Time_Value &interval=ACE_Time_Value::zero) |
| virtual int | reset_timer_interval (long timer_id, const ACE_Time_Value &interval) |
| virtual int | cancel_timer (ACE_Event_Handler *event_handler, int dont_call_handle_close=1) |
| virtual int | cancel_timer (long timer_id, const void **arg=0, int dont_call_handle_close=1) |
| virtual int | schedule_wakeup (ACE_Event_Handler *event_handler, ACE_Reactor_Mask masks_to_be_added) |
| virtual int | schedule_wakeup (ACE_HANDLE handle, ACE_Reactor_Mask masks_to_be_added) |
| virtual int | cancel_wakeup (ACE_Event_Handler *event_handler, ACE_Reactor_Mask masks_to_be_cleared) |
| Clear from the 's entry. | |
| virtual int | cancel_wakeup (ACE_HANDLE handle, ACE_Reactor_Mask masks_to_be_cleared) |
| Clear from the 's entry. | |
| virtual int | notify (ACE_Event_Handler *event_handler=0, ACE_Reactor_Mask mask=ACE_Event_Handler::EXCEPT_MASK, ACE_Time_Value *=0) |
| virtual void | max_notify_iterations (int) |
| virtual int | max_notify_iterations (void) |
| virtual int | purge_pending_notifications (ACE_Event_Handler *=0, ACE_Reactor_Mask=ACE_Event_Handler::ALL_EVENTS_MASK) |
| virtual ACE_Event_Handler * | find_handler (ACE_HANDLE handle) |
| virtual int | handler (ACE_HANDLE handle, ACE_Reactor_Mask mask, ACE_Event_Handler **event_handler=0) |
| virtual int | handler (int signum, ACE_Event_Handler **=0) |
| virtual int | initialized (void) |
| virtual size_t | size (void) const |
| virtual ACE_Lock & | lock (void) |
| Returns a reference to the Reactor's internal lock. | |
| virtual void | wakeup_all_threads (void) |
| Wake up all threads waiting in the event loop. | |
| virtual int | owner (ACE_thread_t new_owner, ACE_thread_t *old_owner=0) |
| Transfers ownership of Reactor_Impl to the new_owner. | |
| virtual int | owner (ACE_thread_t *owner) |
| Return the ID of the "owner" thread. | |
| virtual int | restart (void) |
| Get the existing restart value. | |
| virtual int | restart (int r) |
| Set a new value for restart and return the original value. | |
| virtual void | requeue_position (int) |
| Set position of the owner thread. | |
| virtual int | requeue_position (void) |
| Get position of the owner thread. | |
| virtual void | dump (void) const |
| Dump the state of an object. | |
Low-level wait_set mask manipulation methods | |
Low-level methods to manipulate the event/reactor mask associated with a handle and event handler when polling for events.
| |
| virtual int | mask_ops (ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask, int ops) |
| virtual int | mask_ops (ACE_HANDLE handle, ACE_Reactor_Mask mask, int ops) |
Low-level ready_set mask manipulation methods | |
These methods are unimplemented. | |
| virtual int | ready_ops (ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask, int ops) |
| virtual int | ready_ops (ACE_HANDLE handle, ACE_Reactor_Mask, int ops) |
| GET/SET/ADD/CLR the ready "bit" bound with the handle and mask. | |
Public Attributes | |
| ACE_ALLOC_HOOK_DECLARE | |
| Declare the dynamic allocation hooks. | |
Protected Member Functions | |
| int | work_pending_i (ACE_Time_Value *max_wait_time) |
| Non-locking version of wait_pending(). | |
| int | handle_events_i (ACE_Time_Value *max_wait_time, Token_Guard &guard) |
| int | upcall (ACE_Event_Handler *event_handler, int(ACE_Event_Handler::*callback)(ACE_HANDLE), ACE_HANDLE handle) |
| Perform the upcall with the given event handler method. | |
| int | dispatch (Token_Guard &guard) |
| int | dispatch_timer_handler (Token_Guard &guard) |
| int | dispatch_io_event (Token_Guard &guard) |
| int | register_handler_i (ACE_HANDLE handle, ACE_Event_Handler *eh, ACE_Reactor_Mask mask) |
| Register the given event handler with the reactor. | |
| int | remove_handler_i (ACE_HANDLE handle, ACE_Reactor_Mask mask) |
| int | suspend_handler_i (ACE_HANDLE handle) |
| Temporarily remove the given handle from the "interest set.". | |
| int | resume_handler_i (ACE_HANDLE handle) |
| int | mask_ops_i (ACE_HANDLE handle, ACE_Reactor_Mask mask, int ops) |
| short | reactor_mask_to_poll_event (ACE_Reactor_Mask mask) |
| Convert a reactor mask to its corresponding poll() event mask. | |
Protected Attributes | |
| bool | initialized_ |
| Has the reactor been initialized. | |
| ACE_HANDLE | poll_fd_ |
| size_t | size_ |
| epoll_event * | events_ |
| Table of event structures to be filled by epoll_wait:. | |
| epoll_event * | start_pevents_ |
| epoll_event * | end_pevents_ |
| The last element in the event array plus one. | |
| sig_atomic_t | deactivated_ |
| ACE_Dev_Poll_Reactor_Token | token_ |
| Lock used for synchronization of reactor state. | |
| ACE_Lock_Adapter< ACE_Dev_Poll_Reactor_Token > | lock_adapter_ |
| Adapter used to return internal lock to outside world. | |
| ACE_Dev_Poll_Reactor_Handler_Repository | handler_rep_ |
| The repository that contains all registered event handlers. | |
| ACE_Timer_Queue * | timer_queue_ |
| Defined as a pointer to allow overriding by derived classes... | |
| int | delete_timer_queue_ |
| ACE_Sig_Handler * | signal_handler_ |
| Handle signals without requiring global/static variables. | |
| int | delete_signal_handler_ |
| ACE_Reactor_Notify * | notify_handler_ |
| int | delete_notify_handler_ |
| int | mask_signals_ |
| int | restart_ |
select(), `/dev/poll' and `/dev/epoll' have no hard-coded limit on the number of file descriptors that may be handled at any given time. As such, the ACE_Dev_Poll_Reactor can generally handle a much larger number of file descriptors than select() -based reactors. Furthermore, since `/dev/poll' and `/dev/epoll' both return a set of file descriptors that are active, there is no need to "walk" the set of file descriptors to determine which ones are active, such as what is done with the select() and poll() system calls. All returned file descriptors are active. This makes event dispatching very efficient.
It is only possible to achieve millisecond timeout resolutions with the ACE_Dev_Poll_Reactor. However, the timeout resolution for timers is independent of the reactors timeout resolution. As such, it may be possible to achieve sub-millisecond timeout resolutions for timers but that is entirely platform dependent.
Definition at line 474 of file Dev_Poll_Reactor.h.
|
||||||||||||||||||||||||||||
|
Initialize
The default size for the Definition at line 727 of file Dev_Poll_Reactor.cpp. References ACE_ERROR, ACE_LIB_TEXT, ACE_Timer_Queue, ACE_TRACE, LM_ERROR, and open().
00733 : initialized_ (false) 00734 , poll_fd_ (ACE_INVALID_HANDLE) 00735 , size_ (0) 00736 // , ready_set_ () 00737 #if defined (ACE_HAS_EVENT_POLL) 00738 , events_ (0) 00739 , start_pevents_ (0) 00740 , end_pevents_ (0) 00741 #else 00742 , dp_fds_ (0) 00743 , start_pfds_ (0) 00744 , end_pfds_ (0) 00745 #endif /* ACE_HAS_EVENT_POLL */ 00746 , deactivated_ (0) 00747 , token_ (*this, s_queue) 00748 , lock_adapter_ (token_) 00749 , timer_queue_ (0) 00750 , delete_timer_queue_ (0) 00751 , signal_handler_ (0) 00752 , delete_signal_handler_ (0) 00753 , notify_handler_ (0) 00754 , delete_notify_handler_ (0) 00755 , mask_signals_ (mask_signals) 00756 , restart_ (0) 00757 { 00758 ACE_TRACE ("ACE_Dev_Poll_Reactor::ACE_Dev_Poll_Reactor"); 00759 00760 if (this->open (ACE::max_handles (), 00761 0, 00762 sh, 00763 tq, 00764 disable_notify_pipe, 00765 notify) == -1) 00766 ACE_ERROR ((LM_ERROR, 00767 ACE_LIB_TEXT ("%p\n"), 00768 ACE_LIB_TEXT ("ACE_Dev_Poll_Reactor::open ") 00769 ACE_LIB_TEXT ("failed inside ") 00770 ACE_LIB_TEXT ("ACE_Dev_Poll_Reactor::CTOR"))); 00771 } |
|
||||||||||||||||||||||||||||||||||||
|
Initialize ACE_Dev_Poll_Reactor with size size.
Definition at line 773 of file Dev_Poll_Reactor.cpp. References ACE_ERROR, ACE_LIB_TEXT, ACE_Timer_Queue, LM_ERROR, and open().
00781 : initialized_ (false) 00782 , poll_fd_ (ACE_INVALID_HANDLE) 00783 , size_ (0) 00784 // , ready_set_ () 00785 #if defined (ACE_HAS_EVENT_POLL) 00786 , events_ (0) 00787 , start_pevents_ (0) 00788 , end_pevents_ (0) 00789 #else 00790 , dp_fds_ (0) 00791 , start_pfds_ (0) 00792 , end_pfds_ (0) 00793 #endif /* ACE_HAS_EVENT_POLL */ 00794 , deactivated_ (0) 00795 , token_ (*this, s_queue) 00796 , lock_adapter_ (token_) 00797 , timer_queue_ (0) 00798 , delete_timer_queue_ (0) 00799 , signal_handler_ (0) 00800 , delete_signal_handler_ (0) 00801 , notify_handler_ (0) 00802 , delete_notify_handler_ (0) 00803 , mask_signals_ (mask_signals) 00804 , restart_ (0) 00805 { 00806 if (this->open (size, 00807 rs, 00808 sh, 00809 tq, 00810 disable_notify_pipe, 00811 notify) == -1) 00812 ACE_ERROR ((LM_ERROR, 00813 ACE_LIB_TEXT ("%p\n"), 00814 ACE_LIB_TEXT ("ACE_Dev_Poll_Reactor::open ") 00815 ACE_LIB_TEXT ("failed inside ACE_Dev_Poll_Reactor::CTOR"))); 00816 } |
|
|
Close down and release all resources.
Definition at line 818 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, and close().
|
|
|
Implements ACE_Reactor_Impl. Definition at line 1473 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, and handle_events().
01474 {
01475 ACE_TRACE ("ACE_Dev_Poll_Reactor::alertable_handle_events");
01476
01477 return this->handle_events (max_wait_time);
01478 }
|
|
|
Implements ACE_Reactor_Impl. Definition at line 1457 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, and handle_events().
01458 {
01459 ACE_TRACE ("ACE_Dev_Poll_Reactor::alertable_handle_events");
01460
01461 return this->handle_events (max_wait_time);
01462 }
|
|
||||||||||||||||
|
Cancel the single event handler that matches the timer_id value (which was returned from the schedule method). If arg is non-NULL then it will be set to point to the ``magic cookie'' argument passed in when the event handler was registered. This makes it possible to free up the memory and avoid memory leaks. Returns 1 if cancellation succeeded and 0 if the timer_id wasn't found. Implements ACE_Reactor_Impl. Definition at line 2074 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK >::cancel(), and timer_queue_.
02077 {
02078 ACE_TRACE ("ACE_Dev_Poll_Reactor::cancel_timer");
02079
02080 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
02081
02082 return (this->timer_queue_ == 0
02083 ? 0
02084 : this->timer_queue_->cancel (timer_id,
02085 arg,
02086 dont_call_handle_close));
02087 }
|
|
||||||||||||
|
Cancel all Event_Handlers that match the address of . Returns number of handlers cancelled. Implements ACE_Reactor_Impl. Definition at line 2060 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK >::cancel(), and timer_queue_.
02062 {
02063 ACE_TRACE ("ACE_Dev_Poll_Reactor::cancel_timer");
02064
02065 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
02066
02067 return (this->timer_queue_ == 0
02068 ? 0
02069 : this->timer_queue_->cancel (event_handler,
02070 dont_call_handle_close));
02071 }
|
|
||||||||||||
|
Clear from the 's entry.
Implements ACE_Reactor_Impl. Definition at line 2117 of file Dev_Poll_Reactor.cpp. References ACE_Reactor_Mask, ACE_TRACE, and mask_ops().
|
|
||||||||||||
|
Clear from the 's entry.
Implements ACE_Reactor_Impl. Definition at line 2108 of file Dev_Poll_Reactor.cpp. References ACE_Reactor_Mask, ACE_TRACE, ACE_Event_Handler::get_handle(), and mask_ops().
02110 {
02111 ACE_TRACE ("ACE_Dev_Poll_Reactor::cancel_wakeup");
02112
02113 return this->mask_ops (eh->get_handle (), mask, ACE_Reactor::CLR_MASK);
02114 }
|
|
|
Close down and release all resources.
Implements ACE_Reactor_Impl. Definition at line 978 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, ACE_Reactor_Notify::close(), ACE_Dev_Poll_Reactor_Handler_Repository::close(), ACE_OS::close(), delete_notify_handler_, delete_signal_handler_, delete_timer_queue_, end_pevents_, events_, handler_rep_, initialized_, notify_handler_, poll_fd_, signal_handler_, start_pevents_, and timer_queue_. Referenced by open(), and ~ACE_Dev_Poll_Reactor().
00979 {
00980 ACE_TRACE ("ACE_Dev_Poll_Reactor::close");
00981
00982 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
00983
00984 int result = 0;
00985
00986 if (this->poll_fd_ != ACE_INVALID_HANDLE)
00987 {
00988 result = ACE_OS::close (this->poll_fd_);
00989 }
00990
00991 #if defined (ACE_HAS_EVENT_POLL)
00992
00993 delete [] this->events_;
00994 this->events_ = 0;
00995
00996 #else
00997
00998 delete [] this->dp_fds_;
00999 this->dp_fds_ = 0;
01000
01001 #endif /* ACE_HAS_EVENT_POLL */
01002
01003 if (this->delete_signal_handler_)
01004 {
01005 delete this->signal_handler_;
01006 this->signal_handler_ = 0;
01007 this->delete_signal_handler_ = 0;
01008 }
01009
01010 (void) this->handler_rep_.close ();
01011
01012 if (this->delete_timer_queue_)
01013 {
01014 delete this->timer_queue_;
01015 this->timer_queue_ = 0;
01016 this->delete_timer_queue_ = 0;
01017 }
01018
01019 if (this->notify_handler_ != 0)
01020 this->notify_handler_->close ();
01021
01022 if (this->delete_notify_handler_)
01023 {
01024 delete this->notify_handler_;
01025 this->notify_handler_ = 0;
01026 this->delete_notify_handler_ = 0;
01027 }
01028
01029 this->poll_fd_ = ACE_INVALID_HANDLE;
01030
01031 #if defined (ACE_HAS_EVENT_POLL)
01032 this->start_pevents_ = 0;
01033 this->end_pevents_ = 0;
01034 #else
01035 this->start_pfds_ = 0;
01036 this->end_pfds_ = 0;
01037 #endif /* ACE_HAS_EVENT_POLL */
01038
01039 this->initialized_ = false;
01040
01041 return result;
01042 }
|
|
||||||||||||
|
Implements ACE_Reactor_Impl. Definition at line 940 of file Dev_Poll_Reactor.cpp. References ACE_NOTSUP_RETURN.
00941 {
00942 ACE_NOTSUP_RETURN (-1);
00943 }
|
|
|
Control whether the Reactor will handle any more incoming events or not. If do_stop == 1, the Reactor will be disabled. By default, a reactor is in active state and can be deactivated/reactived as desired. Implements ACE_Reactor_Impl. Definition at line 1487 of file Dev_Poll_Reactor.cpp. References deactivated_, and wakeup_all_threads().
01488 {
01489 this->deactivated_ = do_stop;
01490 this->wakeup_all_threads ();
01491 }
|
|
|
Implements ACE_Reactor_Impl. Definition at line 1481 of file Dev_Poll_Reactor.cpp. References deactivated_.
01482 {
01483 return this->deactivated_;
01484 }
|
|
|
Dispatch ACE_Event_Handlers for time events, I/O events, and signal events. Returns the total number of ACE_Event_Handlers that were dispatched or -1 if something goes wrong. Definition at line 1217 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, dispatch_io_event(), and dispatch_timer_handler(). Referenced by handle_events_i().
01218 {
01219 ACE_TRACE ("ACE_Dev_Poll_Reactor::dispatch");
01220
01221 // Perform the Template Method for dispatching the first located event.
01222 // We dispatch only one to effectively dispatch events concurrently.
01223 // As soon as an event is located, the token is released, allowing the
01224 // next waiter to begin getting an event while we dispatch one here.
01225 int result = 0;
01226
01227 // Handle timers early since they may have higher latency
01228 // constraints than I/O handlers. Ideally, the order of
01229 // dispatching should be a strategy...
01230 if ((result = this->dispatch_timer_handler (guard)) != 0)
01231 return result;
01232
01233 // Check to see if there are no more I/O handles left to
01234 // dispatch AFTER we've handled the timers.
01235
01236 // Finally, dispatch the I/O handlers.
01237 result = this->dispatch_io_event (guard);
01238
01239 return result;
01240 }
|
|
|
Dispatch an IO event to the corresponding event handler. Returns Returns: 0 if no events ready (token still held), 1 if an event was expired (token released), -1 on error (token still held). Definition at line 1306 of file Dev_Poll_Reactor.cpp. References ACE_BIT_ENABLED, ACE_CLR_BITS, ACE_ERROR, ACE_TEXT, end_pevents_, ACE_Dev_Poll_Reactor_Handler_Repository::find(), handler_rep_, LM_ERROR, ACE_Dev_Poll_Reactor::Token_Guard::release_token(), remove_handler(), remove_handler_i(), start_pevents_, and upcall(). Referenced by dispatch().
01307 {
01308
01309 // Define bits to check for while dispatching.
01310 #if defined (ACE_HAS_EVENT_POLL)
01311 const __uint32_t out_event = EPOLLOUT;
01312 const __uint32_t exc_event = EPOLLPRI;
01313 const __uint32_t in_event = EPOLLIN;
01314 const __uint32_t err_event = EPOLLHUP | EPOLLERR;
01315 #else
01316 const short out_event = POLLOUT;
01317 const short exc_event = POLLPRI;
01318 const short in_event = POLLIN;
01319 const short err_event = 0; // No known bits for this
01320 #endif /* ACE_HAS_EVENT_POLL */
01321
01322 // Since the underlying event demultiplexing mechansim (`/dev/poll'
01323 // or '/dev/epoll') is stateful, and since only one result buffer is
01324 // used, all pending events (i.e. those retrieved from a previous
01325 // poll) must be dispatched before any additional event can be
01326 // polled. As such, the Dev_Poll_Reactor keeps track of the
01327 // progress of events that have been dispatched.
01328
01329 // Dispatch the events.
01330 //
01331 // Select the first available handle with event(s) pending. Check for
01332 // event type in defined order of dispatch: output, exception, input.
01333 // When an event is located, clear its bit in the dispatch set. If there
01334 // are no more events for the handle, also increment the pfds pointer
01335 // to move to the next handle ready.
01336 //
01337 // Notice that pfds only contains file descriptors that have
01338 // received events.
01339 #if defined (ACE_HAS_EVENT_POLL)
01340 struct epoll_event *& pfds = this->start_pevents_;
01341 if (pfds < this->end_pevents_)
01342 #else
01343 struct pollfd *& pfds = this->start_pfds_;
01344 if (pfds < this->end_pfds_)
01345 #endif /* ACE_HAS_EVENT_POLL */
01346 {
01347 #if defined (ACE_HAS_EVENT_POLL)
01348 const ACE_HANDLE handle = pfds->data.fd;
01349 __uint32_t &revents = pfds->events;
01350 #else
01351 const ACE_HANDLE handle = pfds->fd;
01352 short &revents = pfds->revents;
01353 #endif /* ACE_HAS_EVENT_POLL */
01354
01355 // Figure out what to do first in order to make it easier to manage
01356 // the bit twiddling and possible pfds increment before releasing
01357 // the token for dispatch.
01358 // Note that if there's an error (such as the handle was closed
01359 // without being removed from the event set) the EPOLLHUP and/or
01360 // EPOLLERR bits will be set in revents.
01361 bool disp_out = false;
01362 bool disp_exc = false;
01363 bool disp_in = false;
01364 if (ACE_BIT_ENABLED (revents, out_event))
01365 {
01366 disp_out = true;
01367 ACE_CLR_BITS (revents, out_event);
01368 }
01369 else if (ACE_BIT_ENABLED (revents, exc_event))
01370 {
01371 disp_exc = true;
01372 ACE_CLR_BITS (revents, exc_event);
01373 }
01374 else if (ACE_BIT_ENABLED (revents, in_event))
01375 {
01376 disp_in = true;
01377 ACE_CLR_BITS (revents, in_event);
01378 }
01379 else if (ACE_BIT_ENABLED (revents, err_event))
01380 {
01381 this->remove_handler_i (handle, ACE_Event_Handler::ALL_EVENTS_MASK);
01382 ++pfds;
01383 return 1;
01384 }
01385 else
01386 {
01387 ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) dispatch_io h %d unknown events 0x%x\n"), handle, revents));
01388 // ACE_ASSERT (0);
01389 }
01390
01391 // Increment the pointer to the next element before we
01392 // release the token. Otherwise event handlers end up being
01393 // dispatched multiple times for the same poll.
01394 if (revents == 0)
01395 ++pfds;
01396
01397 /* When using sys_epoll, we can attach arbitrary user
01398 data to the descriptor, so it can be delivered when
01399 activity is detected. Perhaps we should store event
01400 handler together with descriptor, instead of looking
01401 it up in a repository ? Could it boost performance ?
01402 */
01403 ACE_Event_Handler *eh = this->handler_rep_.find (handle);
01404
01405 if (eh)
01406 {
01407 // Modify the reference count in an exception-safe way.
01408 // Note that eh could be the notify handler. It's not strictly
01409 // necessary to manage its refcount, but since we don't enable
01410 // the counting policy, it won't do much. Management of the
01411 // notified handlers themselves is done in the notify handler.
01412 ACE_Dev_Poll_Handler_Guard eh_guard (eh);
01413
01414 // Release the reactor token before upcall.
01415 guard.release_token ();
01416
01417 // Dispatch the detected event
01418 if (disp_out)
01419 {
01420 const int status =
01421 this->upcall (eh, &ACE_Event_Handler::handle_output, handle);
01422
01423 if (status < 0)
01424 // Note that the token is reacquired in remove_handler().
01425 this->remove_handler (handle, ACE_Event_Handler::WRITE_MASK);
01426 return 1;
01427 }
01428
01429 if (disp_exc)
01430 {
01431 const int status =
01432 this->upcall (eh, &ACE_Event_Handler::handle_exception, handle);
01433
01434 if (status < 0)
01435 // Note that the token is reacquired in remove_handler().
01436 this->remove_handler (handle, ACE_Event_Handler::EXCEPT_MASK);
01437 return 1;
01438 }
01439
01440 if (disp_in)
01441 {
01442 const int status =
01443 this->upcall (eh, &ACE_Event_Handler::handle_input, handle);
01444
01445 if (status < 0)
01446 // Note that the token is reacquired in remove_handler().
01447 this->remove_handler (handle, ACE_Event_Handler::READ_MASK);
01448 return 1;
01449 }
01450 } // The reactor token is reacquired upon leaving this scope.
01451 }
01452
01453 return 0;
01454 }
|
|
|
Dispatch a single timer, if ready. Returns: 0 if no timers ready (token still held), 1 if a timer was expired (token released), -1 on error (token still held). Definition at line 1243 of file Dev_Poll_Reactor.cpp. References ACE_Timer_Node_Dispatch_Info, ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK >::dispatch_info(), ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK >::is_empty(), ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK >::postinvoke(), ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK >::preinvoke(), ACE_Dev_Poll_Reactor::Token_Guard::release_token(), timer_queue_, ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK >::timer_skew(), and ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK >::upcall(). Referenced by dispatch().
01244 {
01245 if (this->timer_queue_->is_empty())
01246 return 0; // Empty timer queue so cannot have any expired timers.
01247
01248 // Get the current time
01249 ACE_Time_Value cur_time (this->timer_queue_->gettimeofday () +
01250 this->timer_queue_->timer_skew ());
01251
01252 // Look for a node in the timer queue whose timer <= the present
01253 // time.
01254 ACE_Timer_Node_Dispatch_Info info;
01255 if (this->timer_queue_->dispatch_info (cur_time, info))
01256 {
01257 const void *upcall_act = 0;
01258
01259 // Preinvoke (handles refcount if needed, etc.)
01260 this->timer_queue_->preinvoke (info, cur_time, upcall_act);
01261
01262 // Release the token before expiration upcall.
01263 guard.release_token ();
01264
01265 // call the functor
01266 this->timer_queue_->upcall (info, cur_time);
01267
01268 // Postinvoke (undo refcount if needed, etc.)
01269 this->timer_queue_->postinvoke (info, cur_time, upcall_act);
01270
01271 // We have dispatched a timer
01272 return 1;
01273 }
01274
01275 return 0;
01276 }
|
|
|
Dump the state of an object.
Implements ACE_Reactor_Impl. Definition at line 2498 of file Dev_Poll_Reactor.cpp. References ACE_BEGIN_DUMP, ACE_DEBUG, ACE_END_DUMP, ACE_LIB_TEXT, ACE_TRACE, and LM_DEBUG.
02499 {
02500 #if defined (ACE_HAS_DUMP)
02501 ACE_TRACE ("ACE_Dev_Poll_Reactor::dump");
02502
02503 ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
02504 ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("restart_ = %d\n"), this->restart_));
02505 ACE_DEBUG ((LM_DEBUG,
02506 ACE_LIB_TEXT ("initialized_ = %d"),
02507 this->initialized_));
02508 ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("poll_fd_ = %d"), this->poll_fd_));
02509 ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("size_ = %u"), this->size_));
02510 ACE_DEBUG ((LM_DEBUG,
02511 ACE_LIB_TEXT ("deactivated_ = %d"),
02512 this->deactivated_));
02513 ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
02514 #endif /* ACE_HAS_DUMP */
02515 }
|
|
|
Return the Event_Handler associated with . Return 0 if is not registered. Implements ACE_Reactor_Impl. Definition at line 2174 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_READ_GUARD_RETURN, ACE_Event_Handler::add_reference(), ACE_Dev_Poll_Reactor_Handler_Repository::find(), and handler_rep_.
02175 {
02176 ACE_MT (ACE_READ_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, 0));
02177
02178 ACE_Event_Handler *event_handler = this->handler_rep_.find (handle);
02179 if (event_handler)
02180 event_handler->add_reference ();
02181 return event_handler;
02182 }
|
|
|
This method is just like the one above, except the max_wait_time value is a reference and can therefore never be
Implements ACE_Reactor_Impl. Definition at line 1465 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, and handle_events().
01466 {
01467 ACE_TRACE ("ACE_Dev_Poll_Reactor::handle_events");
01468
01469 return this->handle_events (&max_wait_time);
01470 }
|
|
|
This event loop driver blocks for up to max_wait_time before returning. It will return earlier if events occur. Note that max_wait_time can be 0, in which case this method blocks indefinitely until events occur.
Implements ACE_Reactor_Impl. Definition at line 1143 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, ACE_Dev_Poll_Reactor::Token_Guard::acquire_quietly(), deactivated_, handle_events_i(), and ACE_Dev_Poll_Reactor::Token_Guard::is_owner(). Referenced by alertable_handle_events(), and handle_events().
01144 {
01145 ACE_TRACE ("ACE_Dev_Poll_Reactor::handle_events");
01146
01147 // Stash the current time
01148 //
01149 // The destructor of this object will automatically compute how much
01150 // time elapsed since this method was called.
01151 ACE_MT (ACE_Countdown_Time countdown (max_wait_time));
01152
01153 Token_Guard guard (this->token_);
01154 int result = guard.acquire_quietly (max_wait_time);
01155
01156 // If the guard is NOT the owner just return the retval
01157 if (!guard.is_owner ())
01158 return result;
01159
01160 if (this->deactivated_)
01161 return -1;
01162
01163 // Update the countdown to reflect time waiting for the mutex.
01164 ACE_MT (countdown.update ());
01165
01166 return this->handle_events_i (max_wait_time, guard);
01167 }
|
|
||||||||||||
|
This is a helper method called by all handle_events() methods. Definition at line 1170 of file Dev_Poll_Reactor.cpp. References ACE_ERROR, ACE_TRACE, dispatch(), ETIME, LM_ERROR, ACE_Sig_Handler::sig_pending(), and work_pending_i(). Referenced by handle_events().
01172 {
01173 ACE_TRACE ("ACE_Dev_Poll_Reactor::handle_events_i");
01174
01175 int result = 0;
01176 // int active_handle_count = 0;
01177
01178 // Poll for events
01179 //
01180 // If the underlying ioctl() call was interrupted via the interrupt
01181 // signal (i.e. returned -1 with errno == EINTR) then the loop will
01182 // be restarted if so desired.
01183 do
01184 {
01185 result = this->work_pending_i (max_wait_time);
01186 if (result == -1)
01187 ACE_ERROR((LM_ERROR, "%t: %p\n", "work_pending_i"));
01188 }
01189 while (result == -1 && this->restart_ != 0 && errno == EINTR);
01190
01191 if (result == 0 || (result == -1 && errno == ETIME))
01192 return 0;
01193 else if (result == -1)
01194 {
01195 if (errno != EINTR)
01196 return -1;
01197
01198 // Bail out -- we got here since the poll was interrupted.
01199 // If it was due to a signal registered through our ACE_Sig_Handler,
01200 // then it was dispatched, so we count it in the number of events
01201 // handled rather than cause an error return.
01202 if (ACE_Sig_Handler::sig_pending () != 0)
01203 {
01204 ACE_Sig_Handler::sig_pending (0);
01205 return 1;
01206 }
01207 return -1;
01208 }
01209
01210 // Dispatch an event.
01211 return this->dispatch (guard);
01212 }
|
|
||||||||||||
|
Check to see if is associated with a valid Event_Handler bound to a signal. Return the associated with this if != 0. Implements ACE_Reactor_Impl. Definition at line 2210 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, ACE_Sig_Handler::handler(), and signal_handler_.
02212 {
02213 ACE_TRACE ("ACE_Dev_Poll_Reactor::handler");
02214
02215 ACE_Event_Handler *handler = this->signal_handler_->handler (signum);
02216
02217 if (handler == 0)
02218 return -1;
02219 else if (eh != 0)
02220 *eh = handler;
02221
02222 return 0;
02223 }
|
|
||||||||||||||||
|
Check to see if is associated with a valid Event_Handler bound to . Return the associated with this if != 0. Implements ACE_Reactor_Impl. Definition at line 2185 of file Dev_Poll_Reactor.cpp. References ACE_BIT_CMP_MASK, ACE_Dev_Poll_Reactor_Token, ACE_Reactor_Mask, ACE_READ_GUARD_RETURN, ACE_TRACE, ACE_Dev_Poll_Reactor_Handler_Repository::find(), and handler_rep_.
02188 {
02189 ACE_TRACE ("ACE_Dev_Poll_Reactor::handler");
02190
02191 ACE_MT (ACE_READ_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
02192
02193 ACE_Event_Handler *h = this->handler_rep_.find (handle);
02194
02195 if (h != 0
02196 && ACE_BIT_CMP_MASK (this->handler_rep_.mask (handle),
02197 mask, // Compare all bits in the mask
02198 mask))
02199 {
02200 if (event_handler != 0)
02201 *event_handler = h;
02202
02203 return 0;
02204 }
02205
02206 return -1;
02207 }
|
|
|
Returns true if Reactor has been successfully initialized, else false. Implements ACE_Reactor_Impl. Definition at line 2226 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, and initialized_.
02227 {
02228 ACE_TRACE ("ACE_Dev_Poll_Reactor::initialized");
02229
02230 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
02231
02232 return this->initialized_;
02233 }
|
|
|
Returns a reference to the Reactor's internal lock.
Implements ACE_Reactor_Impl. Definition at line 2242 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, and lock_adapter_.
02243 {
02244 ACE_TRACE ("ACE_Dev_Poll_Reactor::lock");
02245
02246 return this->lock_adapter_;
02247 }
|
|
||||||||||||||||
|
Implements ACE_Reactor_Impl. Definition at line 2333 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_Reactor_Mask, ACE_TRACE, and mask_ops_i().
02336 {
02337 ACE_TRACE ("ACE_Dev_Poll_Reactor::mask_ops");
02338
02339 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
02340
02341 return this->mask_ops_i (handle, mask, ops);
02342 }
|
|
||||||||||||||||
|
Implements ACE_Reactor_Impl. Definition at line 2321 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_Reactor_Mask, ACE_TRACE, ACE_Event_Handler::get_handle(), and mask_ops_i(). Referenced by cancel_wakeup(), and schedule_wakeup().
02324 {
02325 ACE_TRACE ("ACE_Dev_Poll_Reactor::mask_ops");
02326
02327 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
02328
02329 return this->mask_ops_i (event_handler->get_handle (), mask, ops);
02330 }
|
|
||||||||||||||||
|
Definition at line 2345 of file Dev_Poll_Reactor.cpp. References ACE_CLR_BITS, ACE_Reactor_Mask, ACE_SET_BITS, ACE_TRACE, ACE_Dev_Poll_Reactor_Handler_Repository::handle_in_range(), handler_rep_, ACE_Dev_Poll_Reactor_Handler_Repository::mask(), ACE_OS::memset(), poll_fd_, reactor_mask_to_poll_event(), ACE_Dev_Poll_Reactor_Handler_Repository::suspended(), and ACE_OS::write(). Referenced by mask_ops(), register_handler_i(), and remove_handler_i().
02348 {
02349 ACE_TRACE ("ACE_Dev_Poll_Reactor::mask_ops_i");
02350
02351 if (this->handler_rep_.handle_in_range (handle) == 0)
02352 return -1;
02353
02354 // Block out all signals until method returns.
02355 ACE_Sig_Guard sb;
02356
02357 const ACE_Reactor_Mask old_mask = this->handler_rep_.mask (handle);
02358 ACE_Reactor_Mask new_mask = old_mask;
02359
02360 // Perform GET, CLR, SET, and ADD operations on the interest/wait
02361 // set and the suspend set (if necessary).
02362 //
02363 // GET = 1, Retrieve current value
02364 // SET = 2, Set value of bits to new mask (changes the entire mask)
02365 // ADD = 3, Bitwise "or" the value into the mask (only changes
02366 // enabled bits)
02367 // CLR = 4 Bitwise "and" the negation of the value out of the mask
02368 // (only changes enabled bits)
02369 //
02370 // Returns the original mask.
02371
02372 switch (ops)
02373 {
02374 case ACE_Reactor::GET_MASK:
02375 // The work for this operation is done in all cases at the
02376 // begining of the function.
02377 return old_mask;
02378
02379 case ACE_Reactor::CLR_MASK:
02380 ACE_CLR_BITS (new_mask, mask);
02381 break;
02382
02383 case ACE_Reactor::SET_MASK:
02384 new_mask = mask;
02385 break;
02386
02387 case ACE_Reactor::ADD_MASK:
02388 ACE_SET_BITS (new_mask, mask);
02389 break;
02390
02391 default:
02392 return -1;
02393 }
02394
02395 /// Reset the mask for the given handle.
02396 this->handler_rep_.mask (handle, new_mask);
02397
02398 if (this->handler_rep_.suspended (handle) == 0)
02399 {
02400 // Only attempt to alter events for the handle from the
02401 // "interest set" if it hasn't been suspended.
02402
02403 const short events = this->reactor_mask_to_poll_event (new_mask);
02404
02405 #if defined (sun)
02406 // Apparently events cannot be updated on-the-fly on Solaris so
02407 // remove the existing events, and then add the new ones.
02408 struct pollfd pfd[2];
02409
02410 pfd[0].fd = handle;
02411 pfd[0].events = POLLREMOVE;
02412 pfd[0].revents = 0;
02413 pfd[1].fd = (events == POLLREMOVE ? ACE_INVALID_HANDLE : handle);
02414 pfd[1].events = events;
02415 pfd[1].revents = 0;
02416
02417 // Change the events associated with the given file descriptor.
02418 if (ACE_OS::write (this->poll_fd_,
02419 pfd,
02420 sizeof (pfd)) != sizeof (pfd))
02421 return -1;
02422 #elif defined (ACE_HAS_EVENT_POLL)
02423
02424 struct epoll_event epev;
02425 ACE_OS::memset (&epev, 0, sizeof (epev));
02426 int op;
02427
02428 // ACE_Event_Handler::NULL_MASK ???
02429 if (new_mask == 0)
02430 {
02431 op = EPOLL_CTL_DEL;
02432 epev.events = 0;
02433 }
02434 else
02435 {
02436 op = EPOLL_CTL_MOD;
02437 epev.events = events;
02438 }
02439
02440 epev.data.fd = handle;
02441
02442 if (::epoll_ctl (this->poll_fd_, op, handle, &epev) == -1)
02443 {
02444 // If a handle is closed, epoll removes it from the poll set
02445 // automatically - we may not know about it yet. If that's the
02446 // case, a mod operation will fail with ENOENT. Retry it as
02447 // an add.
02448 if (op == EPOLL_CTL_MOD && errno == ENOENT &&
02449 ::epoll_ctl (this->poll_fd_, EPOLL_CTL_ADD, handle, &epev) == -1)
02450 return -1;
02451 }
02452
02453 #else
02454 pollfd pfd[1];
02455
02456 pfd[0].fd = handle;
02457 pfd[0].events = events;
02458 pfd[0].revents = 0;
02459
02460 // Change the events associated with the given file descriptor.
02461 if (ACE_OS::write (this->poll_fd_,
02462 pfd,
02463 sizeof (pfd)) != sizeof (pfd))
02464 return -1;
02465 #endif /*ACE_HAS_EVENT_POLL */
02466 }
02467
02468 return old_mask;
02469 }
|
|
|
Get the maximum number of times that the ACE_Reactor_Impl will iterate and dispatch the that are passed in via the notify queue before breaking out of its <ACE_Message_Queue::dequeue> loop. Implements ACE_Reactor_Impl. Definition at line 2154 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, ACE_Reactor_Notify::max_notify_iterations(), and notify_handler_.
02155 {
02156 ACE_TRACE ("ACE_Dev_Poll_Reactor::max_notify_iterations");
02157
02158 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
02159
02160 return this->notify_handler_->max_notify_iterations ();
02161 }
|
|
|
Set the maximum number of times that ACE_Reactor_Impl will iterate and dispatch the that are passed in via the notify queue before breaking out of its <ACE_Message_Queue::dequeue> loop. By default, this is set to -1, which means "iterate until the queue is empty." Setting this to a value like "1 or 2" will increase "fairness" (and thus prevent starvation) at the expense of slightly higher dispatching overhead. Implements ACE_Reactor_Impl. Definition at line 2144 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD, ACE_TRACE, ACE_Reactor_Notify::max_notify_iterations(), and notify_handler_.
02145 {
02146 ACE_TRACE ("ACE_Dev_Poll_Reactor::max_notify_iterations");
02147
02148 ACE_MT (ACE_GUARD (ACE_Dev_Poll_Reactor_Token, mon, this->token_));
02149
02150 this->notify_handler_->max_notify_iterations (iterations);
02151 }
|
|
||||||||||||||||
|
Notify of event. The indicates how long to blocking trying to notify. If == 0, the caller will block until action is possible, else will wait until the relative time specified in elapses). Implements ACE_Reactor_Impl. Definition at line 2126 of file Dev_Poll_Reactor.cpp. References ACE_Reactor_Mask, ACE_TRACE, ACE_Reactor_Notify::notify(), notify_handler_, and ssize_t. Referenced by wakeup_all_threads().
02129 {
02130 ACE_TRACE ("ACE_Dev_Poll_Reactor::notify");
02131
02132 ssize_t n = 0;
02133
02134 // Pass over both the Event_Handler *and* the mask to allow the
02135 // caller to dictate which Event_Handler method the receiver
02136 // invokes. Note that this call can timeout.
02137
02138 n = this->notify_handler_->notify (eh, mask, timeout);
02139
02140 return n == -1 ? -1 : 0;
02141 }
|
|
||||||||||||||||||||||||||||
|
Initialization.
Implements ACE_Reactor_Impl. Definition at line 826 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_NEW_RETURN, ACE_Timer_Heap, ACE_Timer_Queue, ACE_TRACE, close(), delete_notify_handler_, delete_signal_handler_, delete_timer_queue_, handler_rep_, initialized_, notify_handler_, ACE_Reactor_Notify::open(), ACE_Dev_Poll_Reactor_Handler_Repository::open(), ACE_OS::open(), poll_fd_, register_handler_i(), signal_handler_, and timer_queue_. Referenced by ACE_Dev_Poll_Reactor().
00832 {
00833 ACE_TRACE ("ACE_Dev_Poll_Reactor::open");
00834
00835 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
00836
00837 // Can't initialize ourselves more than once.
00838 if (this->initialized_)
00839 return -1;
00840
00841 this->restart_ = restart;
00842 this->signal_handler_ = sh;
00843 this->timer_queue_ = tq;
00844 this->notify_handler_ = notify;
00845
00846 int result = 0;
00847
00848 // Allows the signal handler to be overridden.
00849 if (this->signal_handler_ == 0)
00850 {
00851 ACE_NEW_RETURN (this->signal_handler_,
00852 ACE_Sig_Handler,
00853 -1);
00854
00855 if (this->signal_handler_ == 0)
00856 result = -1;
00857 else
00858 this->delete_signal_handler_ = 1;
00859 }
00860
00861 // Allows the timer queue to be overridden.
00862 if (result != -1 && this->timer_queue_ == 0)
00863 {
00864 ACE_NEW_RETURN (this->timer_queue_,
00865 ACE_Timer_Heap,
00866 -1);
00867
00868 if (this->timer_queue_ == 0)
00869 result = -1;
00870 else
00871 this->delete_timer_queue_ = 1;
00872 }
00873
00874 // Allows the Notify_Handler to be overridden.
00875 if (result != -1 && this->notify_handler_ == 0)
00876 {
00877 ACE_NEW_RETURN (this->notify_handler_,
00878 ACE_Dev_Poll_Reactor_Notify,
00879 -1);
00880
00881 if (this->notify_handler_ == 0)
00882 result = -1;
00883 else
00884 this->delete_notify_handler_ = 1;
00885 }
00886
00887 #if defined (ACE_HAS_EVENT_POLL)
00888
00889 // Allocating event table:
00890 ACE_NEW_RETURN (this->events_, epoll_event[size], -1);
00891
00892 // Initializing epoll:
00893 this->poll_fd_ = ::epoll_create (size);
00894 if (this->poll_fd_ == -1)
00895 result = -1;
00896
00897 #else
00898
00899 // Allocate the array before opening the device to avoid a potential
00900 // resource leak if allocation fails.
00901 ACE_NEW_RETURN (this->dp_fds_,
00902 pollfd[size],
00903 -1);
00904
00905 // Open the `/dev/poll' character device.
00906 this->poll_fd_ = ACE_OS::open ("/dev/poll", O_RDWR);
00907 if (this->poll_fd_ == ACE_INVALID_HANDLE)
00908 result = -1;
00909
00910 #endif /* ACE_HAS_EVENT_POLL */
00911
00912 if (result != -1 && this->handler_rep_.open (size) == -1)
00913 result = -1;
00914
00915 // Registration of the notification handler must be done after the
00916 // /dev/poll device has been fully initialized.
00917 else if (this->notify_handler_->open (this,
00918 0,
00919 disable_notify_pipe) == -1
00920 || (disable_notify_pipe == 0
00921 && this->register_handler_i (
00922 this->notify_handler_->notify_handle (),
00923 this->notify_handler_,
00924 ACE_Event_Handler::READ_MASK)) == -1)
00925 result = -1;
00926
00927 this->size_ = size;
00928
00929 if (result != -1)
00930 // We're all set to go.
00931 this->initialized_ = true;
00932 else
00933 // This will close down all the allocated resources properly.
00934 (void) this->close ();
00935
00936 return result;
00937 }
|
|
|
Return the ID of the "owner" thread.
Implements ACE_Reactor_Impl. Definition at line 2274 of file Dev_Poll_Reactor.cpp. References ACE_TRACE.
02275 {
02276 ACE_TRACE ("ACE_Dev_Poll_Reactor::owner");
02277
02278 // There is no need to set the owner of the event loop. Multiple
02279 // threads may invoke the event loop simulataneously.
02280
02281 return 0;
02282 }
|
|
||||||||||||
|
Transfers ownership of Reactor_Impl to the new_owner.
Implements ACE_Reactor_Impl. Definition at line 2262 of file Dev_Poll_Reactor.cpp. References ACE_TRACE.
02264 {
02265 ACE_TRACE ("ACE_Dev_Poll_Reactor::owner");
02266
02267 // There is no need to set the owner of the event loop. Multiple
02268 // threads may invoke the event loop simulataneously.
02269
02270 return 0;
02271 }
|
|
||||||||||||
|
Purge any notifications pending in this reactor for the specified ACE_Event_Handler object. Returns the number of notifications purged. Returns -1 on error. Implements ACE_Reactor_Impl. Definition at line 2164 of file Dev_Poll_Reactor.cpp. References ACE_Reactor_Mask, notify_handler_, and ACE_Reactor_Notify::purge_pending_notifications().
02166 {
02167 if (this->notify_handler_ == 0)
02168 return 0;
02169
02170 return this->notify_handler_->purge_pending_notifications (eh, mask);
02171 }
|
|
|
Convert a reactor mask to its corresponding poll() event mask.
Definition at line 2518 of file Dev_Poll_Reactor.cpp. References ACE_BIT_ENABLED, ACE_Reactor_Mask, ACE_SET_BITS, and ACE_TRACE. Referenced by mask_ops_i(), register_handler_i(), and resume_handler_i().
02519 {
02520 ACE_TRACE ("ACE_Dev_Poll_Reactor::reactor_mask_to_poll_event");
02521
02522 if (mask == ACE_Event_Handler::NULL_MASK)
02523 // No event. Remove from interest set.
02524 #if defined (ACE_HAS_EVENT_POLL)
02525 return EPOLL_CTL_DEL;
02526 #else
02527 return POLLREMOVE;
02528 #endif /* ACE_HAS_EVENT_POLL */
02529
02530 short events = 0;
02531
02532 // READ, ACCEPT, and CONNECT flag will place the handle in the
02533 // read set.
02534 if (ACE_BIT_ENABLED (mask, ACE_Event_Handler::READ_MASK)
02535 || ACE_BIT_ENABLED (mask, ACE_Event_Handler::ACCEPT_MASK)
02536 || ACE_BIT_ENABLED (mask, ACE_Event_Handler::CONNECT_MASK))
02537 {
02538 #if defined (ACE_HAS_EVENT_POLL)
02539 ACE_SET_BITS (events, EPOLLIN);
02540 #else
02541 ACE_SET_BITS (events, POLLIN);
02542 #endif /*ACE_HAS_EVENT_POLL*/
02543 }
02544
02545 // WRITE and CONNECT flag will place the handle in the write set.
02546 if (ACE_BIT_ENABLED (mask, ACE_Event_Handler::WRITE_MASK)
02547 || ACE_BIT_ENABLED (mask, ACE_Event_Handler::CONNECT_MASK))
02548 {
02549 #if defined (ACE_HAS_EVENT_POLL)
02550 ACE_SET_BITS (events, EPOLLOUT);
02551 #else
02552 ACE_SET_BITS (events, POLLOUT);
02553 #endif /*ACE_HAS_EVENT_POLL*/
02554 }
02555
02556 // EXCEPT flag will place the handle in the except set.
02557 if (ACE_BIT_ENABLED (mask, ACE_Event_Handler::EXCEPT_MASK))
02558 {
02559 #if defined (ACE_HAS_EVENT_POLL)
02560 ACE_SET_BITS (events, EPOLLPRI);
02561 #else
02562 ACE_SET_BITS (events, POLLPRI);
02563 #endif /*ACE_HAS_EVENT_POLL*/
02564 }
02565
02566 return events;
02567 }
|
|
||||||||||||||||
|
GET/SET/ADD/CLR the ready "bit" bound with the handle and mask.
Implements ACE_Reactor_Impl. Definition at line 2485 of file Dev_Poll_Reactor.cpp. References ACE_NOTSUP_RETURN, ACE_Reactor_Mask, and ACE_TRACE.
02488 {
02489 ACE_TRACE ("ACE_Dev_Poll_Reactor::ready_ops");
02490
02491 // Since the Dev_Poll_Reactor uses the poll result buffer, the
02492 // ready_set cannot be directly manipulated outside of the event
02493 // loop.
02494 ACE_NOTSUP_RETURN (-1);
02495 }
|
|
||||||||||||||||
|
GET/SET/ADD/CLR the ready "bit" bound with the event_handler and mask. Implements ACE_Reactor_Impl. Definition at line 2472 of file Dev_Poll_Reactor.cpp. References ACE_NOTSUP_RETURN, ACE_Reactor_Mask, and ACE_TRACE.
02475 {
02476 ACE_TRACE ("ACE_Dev_Poll_Reactor::ready_ops");
02477
02478 // Since the Dev_Poll_Reactor uses the poll result buffer, the
02479 // ready_set cannot be directly manipulated outside of the event
02480 // loop.
02481 ACE_NOTSUP_RETURN (-1);
02482 }
|
|
||||||||||||||||
|
Registers to handle a set of signals using the . Implements ACE_Reactor_Impl. Definition at line 1643 of file Dev_Poll_Reactor.cpp. References ACE_NSIG, ACE_TRACE, ACE_Sig_Set::is_member(), ACE_Sig_Handler::register_handler(), and signal_handler_.
01646 {
01647 ACE_TRACE ("ACE_Dev_Poll_Reactor::register_handler");
01648
01649 int result = 0;
01650
01651 #if (ACE_NSIG > 0)
01652
01653 for (int s = 1; s < ACE_NSIG; ++s)
01654 if ((sigset.is_member (s) == 1)
01655 && this->signal_handler_->register_handler (s,
01656 new_sh,
01657 new_disp) == -1)
01658 result = -1;
01659
01660 #else /* ACE_NSIG <= 0 */
01661
01662 ACE_UNUSED_ARG (sigset);
01663 ACE_UNUSED_ARG (new_sh);
01664 ACE_UNUSED_ARG (new_disp);
01665
01666 #endif /* ACE_NSIG <= 0 */
01667
01668 return result;
01669 }
|
|
||||||||||||||||||||||||
|
Register new_sh to handle the signal signum using the new_disp. Returns the old_sh that was previously registered (if any), along with the old_disp of the signal handler. Implements ACE_Reactor_Impl. Definition at line 1627 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, ACE_Sig_Handler::register_handler(), and signal_handler_.
01632 {
01633 ACE_TRACE ("ACE_Dev_Poll_Reactor::register_handler");
01634
01635 return this->signal_handler_->register_handler (signum,
01636 new_sh,
01637 new_disp,
01638 old_sh,
01639 old_disp);
01640 }
|
|
||||||||||||||||
|
Register event_handler> with all the handles> in the Implements ACE_Reactor_Impl. Definition at line 1602 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_Reactor_Mask, ACE_TRACE, and register_handler_i().
01605 {
01606 ACE_TRACE ("ACE_Dev_Poll_Reactor::register_handler");
01607
01608 ACE_Handle_Set_Iterator handle_iter (handle_set);
01609
01610 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01611
01612 // @@ It might be more efficient to construct a pollfd array and
01613 // pass it to the write() call in register_handler_i() only once,
01614 // instead of calling write() (a system call) once for each file
01615 // descriptor.
01616
01617 for (ACE_HANDLE h = handle_iter ();
01618 h != ACE_INVALID_HANDLE;
01619 h = handle_iter ())
01620 if (this->register_handler_i (h, event_handler, mask) == -1)
01621 return -1;
01622
01623 return 0;
01624 }
|
|
||||||||||||||||||||
|
Register an event_handler that will be notified when event_handle is signaled. mask specifies the network events that the event_handler is interested in. Implements ACE_Reactor_Impl. Definition at line 1592 of file Dev_Poll_Reactor.cpp. References ACE_NOTSUP_RETURN, and ACE_Reactor_Mask.
01597 {
01598 ACE_NOTSUP_RETURN (-1);
01599 }
|
|
||||||||||||||||
|
Register event_handler with mask. The I/O handle is provided through the io_handle parameter. Implements ACE_Reactor_Impl. Definition at line 1507 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_Reactor_Mask, ACE_TRACE, and register_handler_i().
01510 {
01511 ACE_TRACE ("ACE_Dev_Poll_Reactor::register_handler");
01512
01513 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01514
01515 return this->register_handler_i (handle,
01516 event_handler,
01517 mask);
01518 }
|
|
||||||||||||
|
Register event_handler with mask. The I/O handle will always come from get_handle on the event_handler. Implements ACE_Reactor_Impl. Definition at line 1494 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_Reactor_Mask, ACE_TRACE, ACE_Event_Handler::get_handle(), and register_handler_i().
01496 {
01497 ACE_TRACE ("ACE_Dev_Poll_Reactor::register_handler");
01498
01499 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01500
01501 return this->register_handler_i (handler->get_handle (),
01502 handler,
01503 mask);
01504 }
|
|
||||||||||||||||
|
Register the given event handler with the reactor.
Definition at line 1521 of file Dev_Poll_Reactor.cpp. References ACE_ERROR, ACE_ERROR_RETURN, ACE_Reactor_Mask, ACE_TRACE, ACE_Dev_Poll_Reactor_Handler_Repository::bind(), ACE_Dev_Poll_Reactor_Handler_Repository::find(), handler_rep_, LM_ERROR, mask_ops_i(), ACE_OS::memset(), poll_fd_, reactor_mask_to_poll_event(), ACE_Dev_Poll_Reactor_Handler_Repository::unbind(), and ACE_OS::write(). Referenced by open(), and register_handler().
01524 {
01525 ACE_TRACE ("ACE_Dev_Poll_Reactor::register_handler_i");
01526
01527 if (handle == ACE_INVALID_HANDLE
01528 || mask == ACE_Event_Handler::NULL_MASK)
01529 {
01530 errno = EINVAL;
01531 return -1;
01532 }
01533
01534 if (this->handler_rep_.find (handle) == 0)
01535 {
01536 // Handler not present in the repository. Bind it.
01537 if (this->handler_rep_.bind (handle, event_handler, mask) != 0)
01538 return -1;
01539
01540 #if defined (ACE_HAS_EVENT_POLL)
01541
01542 struct epoll_event epev;
01543 ACE_OS::memset (&epev, 0, sizeof (epev));
01544 static const int op = EPOLL_CTL_ADD;
01545
01546 epev.events = this->reactor_mask_to_poll_event (mask);
01547 epev.data.fd = handle;
01548
01549 if (::epoll_ctl (this->poll_fd_, op, handle, &epev) == -1)
01550 {
01551 ACE_ERROR ((LM_ERROR, "%p\n", "epoll_ctl"));
01552 (void) this->handler_rep_.unbind (handle);
01553 return -1;
01554 }
01555
01556 #endif /* ACE_HAS_EVENT_POLL */
01557 }
01558 else
01559 {
01560 // Handler is already present in the repository, so register it
01561 // again, possibly for different event. Add new mask to the
01562 // current one.
01563 if (this->mask_ops_i (handle, mask, ACE_Reactor::ADD_MASK) == -1)
01564 ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "mask_ops_i"), -1);
01565 }
01566
01567 #ifndef ACE_HAS_EVENT_POLL
01568
01569 struct pollfd pfd;
01570
01571 pfd.fd = handle;
01572 pfd.events = this->reactor_mask_to_poll_event (mask);
01573 pfd.revents = 0;
01574
01575 // Add file descriptor to the "interest set."
01576 if (ACE_OS::write (this->poll_fd_, &pfd, sizeof (pfd)) != sizeof (pfd))
01577 {
01578 (void) this->handler_rep_.unbind (handle);
01579 return -1;
01580 }
01581 #endif /*ACE_HAS_EVENT_POLL*/
01582
01583 // Note the fact that we've changed the state of the wait_set_,
01584 // which is used by the dispatching loop to determine whether it can
01585 // keep going or if it needs to reconsult select().
01586 // this->state_changed_ = 1;
01587
01588 return 0;
01589 }
|
|
|
Calls for every signal in .
Implements ACE_Reactor_Impl. Definition at line 1766 of file Dev_Poll_Reactor.cpp. References ACE_NSIG, ACE_TRACE, ACE_Sig_Set::is_member(), ACE_Sig_Handler::remove_handler(), and signal_handler_.
01767 {
01768 ACE_TRACE ("ACE_Dev_Poll_Reactor::remove_handler");
01769
01770 int result = 0;
01771
01772 #if (ACE_NSIG > 0)
01773
01774 for (int s = 1; s < ACE_NSIG; ++s)
01775 if ((sigset.is_member (s) == 1)
01776 && this->signal_handler_->remove_handler (s) == -1)
01777 result = -1;
01778
01779 #else /* ACE_NSIG <= 0 */
01780
01781 ACE_UNUSED_ARG (sigset);
01782
01783 #endif /* ACE_NSIG <= 0 */
01784
01785 return result;
01786 }
|
|
||||||||||||||||||||
|
Remove the ACE_Event_Handler currently associated with . Install the new disposition (if given) and return the previous disposition (if desired by the caller). Returns 0 on success and -1 if is invalid. Implements ACE_Reactor_Impl. Definition at line 1752 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, ACE_Sig_Handler::remove_handler(), and signal_handler_.
01756 {
01757 ACE_TRACE ("ACE_Dev_Poll_Reactor::remove_handler");
01758
01759 return this->signal_handler_->remove_handler (signum,
01760 new_disp,
01761 old_disp,
01762 sigkey);
01763 }
|
|
||||||||||||
|
Removes all handles in . If == <ACE_Event_Handler::DONT_CALL> then the method of the associated s is not invoked. Implements ACE_Reactor_Impl. Definition at line 1728 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_Reactor_Mask, ACE_TRACE, and remove_handler_i().
01730 {
01731 ACE_TRACE ("ACE_Dev_Poll_Reactor::remove_handler");
01732
01733 ACE_Handle_Set_Iterator handle_iter (handle_set);
01734
01735 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01736
01737 // @@ It might be more efficient to construct a pollfd array and
01738 // pass it to the write() call in register_handler_i() only once,
01739 // instead of calling write() (a system call) once for each file
01740 // descriptor.
01741
01742 for (ACE_HANDLE h = handle_iter ();
01743 h != ACE_INVALID_HANDLE;
01744 h = handle_iter ())
01745 if (this->remove_handler_i (h, mask) == -1)
01746 return -1;
01747
01748 return 0;
01749 }
|
|
||||||||||||
|
Removes . If == <ACE_Event_Handler::DONT_CALL> then the method of the associated is not invoked. Implements ACE_Reactor_Impl. Definition at line 1683 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_Reactor_Mask, ACE_TRACE, and remove_handler_i().
01685 {
01686 ACE_TRACE ("ACE_Dev_Poll_Reactor::remove_handler");
01687
01688 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01689
01690 return this->remove_handler_i (handle, mask);
01691 }
|
|
||||||||||||
|
Removes event_handler.
Implements ACE_Reactor_Impl. Definition at line 1672 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_Reactor_Mask, ACE_TRACE, ACE_Event_Handler::get_handle(), and remove_handler_i(). Referenced by dispatch_io_event().
01674 {
01675 ACE_TRACE ("ACE_Dev_Poll_Reactor::remove_handler");
01676
01677 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01678
01679 return this->remove_handler_i (handler->get_handle (), mask);
01680 }
|
|
||||||||||||
|
Remove the event handler associated with the given handle and event mask from the "interest set." Definition at line 1694 of file Dev_Poll_Reactor.cpp. References ACE_BIT_DISABLED, ACE_Reactor_Mask, ACE_TRACE, ACE_Dev_Poll_Reactor_Handler_Repository::find(), ACE_Event_Handler::handle_close(), handler_rep_, ACE_Dev_Poll_Reactor_Handler_Repository::mask(), mask_ops_i(), ACE_Event_Handler::reference_counting_policy(), and ACE_Dev_Poll_Reactor_Handler_Repository::unbind(). Referenced by dispatch_io_event(), and remove_handler().
01696 {
01697 ACE_TRACE ("ACE_Dev_Poll_Reactor::remove_handler_i");
01698
01699 ACE_Event_Handler *eh = this->handler_rep_.find (handle);
01700
01701 if (eh == 0 ||
01702 this->mask_ops_i (handle, mask, ACE_Reactor::CLR_MASK) == -1)
01703 return -1;
01704
01705 // Check for ref counting now - handle_close() may delete eh.
01706 int requires_reference_counting =
01707 eh->reference_counting_policy ().value () ==
01708 ACE_Event_Handler::Reference_Counting_Policy::ENABLED;
01709
01710 if (ACE_BIT_DISABLED (mask, ACE_Event_Handler::DONT_CALL))
01711 (void) eh->handle_close (handle, mask);
01712
01713 // If there are no longer any outstanding events on the given handle
01714 // then remove it from the handler repository.
01715 if (this->handler_rep_.mask (handle) == ACE_Event_Handler::NULL_MASK)
01716 this->handler_rep_.unbind (handle, requires_reference_counting);
01717
01718 // Note the fact that we've changed the state of the wait_set,
01719 // i.e. the "interest set," which is used by the dispatching loop to
01720 // determine whether it can keep going or if it needs to reconsult
01721 // /dev/poll or /dev/epoll.
01722 // this->state_changed_ = 1;
01723
01724 return 0;
01725 }
|
|
|
Get position of the owner thread.
Implements ACE_Reactor_Impl. Definition at line 2313 of file Dev_Poll_Reactor.cpp. References ACE_NOTSUP_RETURN, and ACE_TRACE.
02314 {
02315 ACE_TRACE ("ACE_Dev_Poll_Reactor::requeue_position");
02316
02317 ACE_NOTSUP_RETURN (-1);
02318 }
|
|
|
Set position of the owner thread.
Implements ACE_Reactor_Impl. Definition at line 2307 of file Dev_Poll_Reactor.cpp. References ACE_TRACE.
02308 {
02309 ACE_TRACE ("ACE_Dev_Poll_Reactor::requeue_position");
02310 }
|
|
||||||||||||
|
Resets the interval of the timer represented by to , which is specified in relative time to the current . If is equal to <ACE_Time_Value::zero>, the timer will become a non-rescheduling timer. Returns 0 if successful, -1 if not. Implements ACE_Reactor_Impl. Definition at line 2045 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, ESHUTDOWN, ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK >::reset_interval(), and timer_queue_.
02047 {
02048 ACE_TRACE ("ACE_Dev_Poll_Reactor::reset_timer_interval");
02049
02050 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
02051
02052 if (0 != this->timer_queue_)
02053 return this->timer_queue_->reset_interval (timer_id, interval);
02054
02055 errno = ESHUTDOWN;
02056 return -1;
02057 }
|
|
|
Set a new value for restart and return the original value.
Implements ACE_Reactor_Impl. Definition at line 2295 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, and ACE_TRACE.
02296 {
02297 ACE_TRACE ("ACE_Dev_Poll_Reactor::restart");
02298
02299 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
02300
02301 int current_value = this->restart_;
02302 this->restart_ = r;
02303 return current_value;
02304 }
|
|
|
Get the existing restart value.
Implements ACE_Reactor_Impl. Definition at line 2285 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, and ACE_TRACE.
02286 {
02287 ACE_TRACE ("ACE_Dev_Poll_Reactor::restart");
02288
02289 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
02290
02291 return this->restart_;
02292 }
|
|
|
Does the reactor allow the application to resume the handle on its own, i.e., can it pass on the control of handle resumption to the application. Implements ACE_Reactor_Impl. Definition at line 2008 of file Dev_Poll_Reactor.cpp.
02009 {
02010 // @@ Is this correct?
02011
02012 return 0;
02013 }
|
|
|
Resume all handles in handle set.
Implements ACE_Reactor_Impl. Definition at line 1926 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, and resume_handler_i().
01927 {
01928 ACE_TRACE ("ACE_Dev_Poll_Reactor::resume_handler");
01929
01930 ACE_Handle_Set_Iterator handle_iter (handles);
01931 ACE_HANDLE h;
01932
01933 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01934
01935 while ((h = handle_iter ()) != ACE_INVALID_HANDLE)
01936 if (this->resume_handler_i (h) == -1)
01937 return -1;
01938
01939 return 0;
01940 }
|
|
|
Resume handle.
Implements ACE_Reactor_Impl. Definition at line 1916 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, and resume_handler_i().
01917 {
01918 ACE_TRACE ("ACE_Dev_Poll_Reactor::resume_handler");
01919
01920 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01921
01922 return this->resume_handler_i (handle);
01923 }
|
|
|
Resume event_handler. Use ACE_Event_Handler::get_handle() to get the handle. Implements ACE_Reactor_Impl. Definition at line 1898 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, ACE_Event_Handler::get_handle(), and resume_handler_i().
01899 {
01900 ACE_TRACE ("ACE_Dev_Poll_Reactor::resume_handler");
01901
01902 if (event_handler == 0)
01903 {
01904 errno = EINVAL;
01905 return -1;
01906 }
01907
01908 ACE_HANDLE handle = event_handler->get_handle ();
01909
01910 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01911
01912 return this->resume_handler_i (handle);
01913 }
|
|
|
Place the given handle that was temporarily removed from the "interest set," i.e that was suspended, back in to the interest set. The given handle will once again be polled for events. Definition at line 1960 of file Dev_Poll_Reactor.cpp. References ACE_Reactor_Mask, ACE_TRACE, ACE_Dev_Poll_Reactor_Handler_Repository::find(), handler_rep_, ACE_Dev_Poll_Reactor_Handler_Repository::mask(), ACE_OS::memset(), poll_fd_, reactor_mask_to_poll_event(), ACE_Dev_Poll_Reactor_Handler_Repository::resume(), ACE_Dev_Poll_Reactor_Handler_Repository::suspended(), and ACE_OS::write(). Referenced by resume_handler(), and resume_handlers().
01961 {
01962 ACE_TRACE ("ACE_Dev_Poll_Reactor::resume_handler_i");
01963
01964 if (this->handler_rep_.find (handle) == 0
01965 && this->handler_rep_.suspended (handle) == 0)
01966 return -1;
01967
01968 ACE_Reactor_Mask mask = this->handler_rep_.mask (handle);
01969
01970 if (mask == ACE_Event_Handler::NULL_MASK)
01971 return -1;
01972
01973 // Place the handle back in to the "interest set."
01974 //
01975 // Events for the given handle will once again be polled.
01976
01977 #if defined (ACE_HAS_EVENT_POLL)
01978
01979 struct epoll_event epev;
01980 ACE_OS::memset (&epev, 0, sizeof (epev));
01981 static const int op = EPOLL_CTL_ADD;
01982
01983 epev.events = this->reactor_mask_to_poll_event (mask);
01984 epev.data.fd = handle;
01985
01986 if (::epoll_ctl (this->poll_fd_, op, handle, &epev) == -1)
01987 return -1;
01988
01989 #else
01990
01991 struct pollfd pfd[1];
01992
01993 pfd[0].fd = handle;
01994 pfd[0].events = this->reactor_mask_to_poll_event (mask);
01995 pfd[0].revents = 0;
01996
01997 if (ACE_OS::write (this->poll_fd_, pfd, sizeof (pfd)) != sizeof (pfd))
01998 return -1;
01999
02000 #endif /* ACE_HAS_EVENT_POLL */
02001
02002 this->handler_rep_.resume (handle);
02003
02004 return 0;
02005 }
|
|
|
Resume all handles.
Implements ACE_Reactor_Impl. Definition at line 1943 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, handler_rep_, resume_handler_i(), ACE_Dev_Poll_Reactor_Handler_Repository::size(), and ACE_Dev_Poll_Reactor_Handler_Repository::suspended().
01944 {
01945 ACE_TRACE ("ACE_Dev_Poll_Reactor::resume_handlers");
01946
01947 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01948
01949 const size_t len = this->handler_rep_.size ();
01950
01951 for (size_t i = 0; i < len; ++i)
01952 if (this->handler_rep_.suspended (i)
01953 && this->resume_handler_i (i) != 0)
01954 return -1;
01955
01956 return 0;
01957 }
|
|
||||||||||||||||||||
|
Schedule an ACE_Event_Handler that will expire after an amount of time. The return value of this method, a timer_id value, uniquely identifies the event_handler in the ACE_Reactor's internal list of timers. This timer_id value can be used to cancel the timer with the cancel_timer() call.
Implements ACE_Reactor_Impl. Definition at line 2024 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, ESHUTDOWN, ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK >::gettimeofday(), ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK >::schedule(), and timer_queue_.
02028 {
02029 ACE_TRACE ("ACE_Dev_Poll_Reactor::schedule_timer");
02030
02031 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
02032
02033 if (0 != this->timer_queue_)
02034 return this->timer_queue_->schedule
02035 (event_handler,
02036 arg,
02037 this->timer_queue_->gettimeofday () + delay,
02038 interval);
02039
02040 errno = ESHUTDOWN;
02041 return -1;
02042 }
|
|
||||||||||||
|
Add to the 's entry. associated with must already have been registered. Implements ACE_Reactor_Impl. Definition at line 2099 of file Dev_Poll_Reactor.cpp. References ACE_Reactor_Mask, ACE_TRACE, and mask_ops().
|
|
||||||||||||
|
Add to the 's entry. must already have been registered. Implements ACE_Reactor_Impl. Definition at line 2090 of file Dev_Poll_Reactor.cpp. References ACE_Reactor_Mask, ACE_TRACE, ACE_Event_Handler::get_handle(), and mask_ops().
02092 {
02093 ACE_TRACE ("ACE_Dev_Poll_Reactor::schedule_wakeup");
02094
02095 return this->mask_ops (eh->get_handle (), mask, ACE_Reactor::ADD_MASK);
02096 }
|
|
|
Use a user specified signal handler instead.
Implements ACE_Reactor_Impl. Definition at line 947 of file Dev_Poll_Reactor.cpp. References delete_signal_handler_, and signal_handler_.
00948 {
00949 if (this->delete_signal_handler_ && this->signal_handler_)
00950 delete this->signal_handler_;
00951
00952 this->signal_handler_ = signal_handler;
00953 this->delete_signal_handler_ = 0;
00954
00955 return 0;
00956 }
|
|
|
Returns the current size of the Reactor's internal descriptor table. Implements ACE_Reactor_Impl. Definition at line 2236 of file Dev_Poll_Reactor.cpp.
02237 {
02238 return this->size_;
02239 }
|
|
|
Suspend all handles in handle set temporarily.
Implements ACE_Reactor_Impl. Definition at line 1817 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, and suspend_handler_i().
01818 {
01819 ACE_TRACE ("ACE_Dev_Poll_Reactor::suspend_handler");
01820
01821 ACE_Handle_Set_Iterator handle_iter (handles);
01822 ACE_HANDLE h;
01823
01824 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01825
01826 while ((h = handle_iter ()) != ACE_INVALID_HANDLE)
01827 if (this->suspend_handler_i (h) == -1)
01828 return -1;
01829
01830 return 0;
01831 }
|
|
|
Suspend handle temporarily.
Implements ACE_Reactor_Impl. Definition at line 1807 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, and suspend_handler_i().
01808 {
01809 ACE_TRACE ("ACE_Dev_Poll_Reactor::suspend_handler");
01810
01811 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01812
01813 return this->suspend_handler_i (handle);
01814 }
|
|
|
Suspend event_handler temporarily. Use ACE_Event_Handler::get_handle() to get the handle. Implements ACE_Reactor_Impl. Definition at line 1789 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, ACE_Event_Handler::get_handle(), and suspend_handler_i().
01790 {
01791 ACE_TRACE ("ACE_Dev_Poll_Reactor::suspend_handler");
01792
01793 if (event_handler == 0)
01794 {
01795 errno = EINVAL;
01796 return -1;
01797 }
01798
01799 ACE_HANDLE handle = event_handler->get_handle ();
01800
01801 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01802
01803 return this->suspend_handler_i (handle);
01804 }
|
|
|
Temporarily remove the given handle from the "interest set.".
Definition at line 1851 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, ACE_Dev_Poll_Reactor_Handler_Repository::find(), handler_rep_, ACE_OS::memset(), poll_fd_, ACE_Dev_Poll_Reactor_Handler_Repository::suspend(), ACE_Dev_Poll_Reactor_Handler_Repository::suspended(), and ACE_OS::write(). Referenced by suspend_handler(), and suspend_handlers().
01852 {
01853 ACE_TRACE ("ACE_Dev_Poll_Reactor::suspend_handler_i");
01854
01855 if (this->handler_rep_.find (handle) == 0)
01856 return -1;
01857
01858 if (this->handler_rep_.suspended (handle))
01859 return 0; // Already suspended. @@ Should this be an error?
01860
01861 // Remove the handle from the "interest set."
01862 //
01863 // Note that the associated event handler is still in the handler
01864 // repository, but no events will be polled on the given handle thus
01865 // no event will be dispatched to the event handler.
01866
01867 #if defined (ACE_HAS_EVENT_POLL)
01868
01869 struct epoll_event epev;
01870 ACE_OS::memset (&epev, 0, sizeof (epev));
01871 static const int op = EPOLL_CTL_DEL;
01872
01873 epev.events = 0;
01874 epev.data.fd = handle;
01875
01876 if (::epoll_ctl (this->poll_fd_, op, handle, &epev) == -1)
01877 return -1;
01878
01879 #else
01880
01881 struct pollfd pfd[1];
01882
01883 pfd[0].fd = handle;
01884 pfd[0].events = POLLREMOVE;
01885 pfd[0].revents = 0;
01886
01887 if (ACE_OS::write (this->poll_fd_, pfd, sizeof (pfd)) != sizeof (pfd))
01888 return -1;
01889
01890 #endif /* ACE_HAS_EVENT_POLL */
01891
01892 this->handler_rep_.suspend (handle);
01893
01894 return 0;
01895 }
|
|
|
Suspend all handles temporarily.
Implements ACE_Reactor_Impl. Definition at line 1834 of file Dev_Poll_Reactor.cpp. References ACE_Dev_Poll_Reactor_Token, ACE_GUARD_RETURN, ACE_TRACE, handler_rep_, ACE_Dev_Poll_Reactor_Handler_Repository::size(), suspend_handler_i(), and ACE_Dev_Poll_Reactor_Handler_Repository::suspended().
01835 {
01836 ACE_TRACE ("ACE_Dev_Poll_Reactor::suspend_handlers");
01837
01838 ACE_MT (ACE_GUARD_RETURN (ACE_Dev_Poll_Reactor_Token, mon, this->token_, -1));
01839
01840 const size_t len = this->handler_rep_.size ();
01841
01842 for (size_t i = 0; i < len; ++i)
01843 if (this->handler_rep_.suspended (i) == 0
01844 && this->suspend_handler_i (i) != 0)
01845 return -1;
01846
01847 return 0;
01848 }
|
|
|
Get the timer queue
Implements ACE_Reactor_Impl. Definition at line 972 of file Dev_Poll_Reactor.cpp. References timer_queue_.
00973 {
00974 return this->timer_queue_;
00975 }
|
|
|
Set a user-specified timer queue.
Implements ACE_Reactor_Impl. Definition at line 959 of file Dev_Poll_Reactor.cpp. References ACE_Timer_Queue, delete_timer_queue_, and timer_queue_.
00960 {
00961 if (this->delete_timer_queue_ && this->timer_queue_)
00962 delete this->timer_queue_;
00963
00964 this->timer_queue_ = tq;
00965 this->delete_timer_queue_ = 0;
00966
00967 return 0;
00968
00969 }
|
|
||||||||||||||||
|
Perform the upcall with the given event handler method.
Definition at line 169 of file Dev_Poll_Reactor.inl. Referenced by dispatch_io_event().
00172 {
00173 // If the handler returns positive value (requesting a reactor
00174 // callback) just call back as many times as the handler requests
00175 // it. Other threads are off handling other things.
00176 int status = 0;
00177
00178 do
00179 {
00180 status = (event_handler->*callback) (handle);
00181 }
00182 while (status > 0);
00183
00184 return status;
00185 }
|
|
|
Return 1 if we any event associations were made by the reactor for the handles that it waits on, 0 otherwise. Implements ACE_Reactor_Impl. Definition at line 2016 of file Dev_Poll_Reactor.cpp.
02017 {
02018 // Since the Dev_Poll_Reactor does not do any event associations,
02019 // this method always return zero.
02020 return 0;
02021 }
|
|
|
Wake up all threads waiting in the event loop.
Implements ACE_Reactor_Impl. Definition at line 2250 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, and notify(). Referenced by deactivate().
02251 {
02252 ACE_TRACE ("ACE_Dev_Poll_Reactor::wakeup_all_threads");
02253
02254 // Send a notification, but don't block if there's no one to receive
02255 // it.
02256 this->notify (0,
02257 ACE_Event_Handler::NULL_MASK,
02258 (ACE_Time_Value *) &ACE_Time_Value::zero);
02259 }
|
|
|
Returns non-zero if there are I/O events "ready" for dispatching, but does not actually dispatch the event handlers. By default, don't block while checking this, i.e., "poll".
Implements ACE_Reactor_Impl. Definition at line 1045 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, ACE_Dev_Poll_Reactor::Token_Guard::acquire_quietly(), ACE_Dev_Poll_Reactor::Token_Guard::is_owner(), and work_pending_i().
01046 {
01047 ACE_TRACE ("ACE_Dev_Poll_Reactor::work_pending");
01048
01049 // Stash the current time
01050 //
01051 // The destructor of this object will automatically compute how much
01052 // time elapsed since this method was called.
01053 ACE_Time_Value mwt (max_wait_time);
01054 ACE_MT (ACE_Countdown_Time countdown (&mwt));
01055
01056 Token_Guard guard (this->token_);
01057 int result = guard.acquire_quietly (&mwt);
01058
01059 // If the guard is NOT the owner just return the retval
01060 if (!guard.is_owner ())
01061 return result;
01062
01063 // Update the countdown to reflect time waiting for the mutex.
01064 ACE_MT (countdown.update ());
01065
01066 return this->work_pending_i (&mwt);
01067 }
|
|
|
Non-locking version of wait_pending(). Returns non-zero if there are I/O events "ready" for dispatching, but does not actually dispatch the event handlers. By default, don't block while checking this, i.e., "poll".
Definition at line 1070 of file Dev_Poll_Reactor.cpp. References ACE_TRACE, ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK >::calculate_timeout(), deactivated_, end_pevents_, events_, ACE_OS::ioctl(), poll_fd_, start_pevents_, and timer_queue_. Referenced by handle_events_i(), and work_pending().
01071 {
01072 ACE_TRACE ("ACE_Dev_Poll_Reactor::work_pending_i");
01073
01074 if (this->deactivated_)
01075 return 0;
01076
01077 #if defined (ACE_HAS_EVENT_POLL)
01078 if (this->start_pevents_ != this->end_pevents_)
01079 #else
01080 if (this->start_pfds_ != this->end_pfds_)
01081 #endif /* ACE_HAS_EVENT_POLL */
01082 return 1; // We still have work_pending(). Do not poll for
01083 // additional events.
01084
01085 ACE_Time_Value timer_buf (0);
01086 ACE_Time_Value *this_timeout = 0;
01087
01088 this_timeout = this->timer_queue_->calculate_timeout (max_wait_time,
01089 &timer_buf);
01090
01091 // Check if we have timers to fire.
01092 const int timers_pending =
01093 ((this_timeout != 0 && max_wait_time == 0)
01094 || (this_timeout != 0 && max_wait_time != 0
01095 && *this_timeout != *max_wait_time) ? 1 : 0);
01096
01097 const long timeout =
01098 (this_timeout == 0
01099 ? -1 /* Infinity */
01100 : static_cast<long> (this_timeout->msec ()));
01101
01102 #if defined (ACE_HAS_EVENT_POLL)
01103
01104 // Wait for events.
01105 const int nfds = ::epoll_wait (this->poll_fd_,
01106 this->events_,
01107 this->size_,
01108 static_cast<int> (timeout));
01109
01110 if (nfds > 0)
01111 {
01112 this->start_pevents_ = this->events_;
01113 this->end_pevents_ = this->start_pevents_ + nfds;
01114 }
01115
01116 #else
01117
01118 struct dvpoll dvp;
01119
01120 dvp.dp_fds = this->dp_fds_;
01121 dvp.dp_nfds = this->size_;
01122 dvp.dp_timeout = timeout; // Milliseconds
01123
01124 // Poll for events
01125 const int nfds = ACE_OS::ioctl (this->poll_fd_, DP_POLL, &dvp);
01126
01127 // Retrieve the results from the pollfd array.
01128 this->start_pfds_ = dvp.dp_fds;
01129
01130 // If nfds == 0 then end_pfds_ == start_pfds_ meaning that there is
01131 // no work pending. If nfds > 0 then there is work pending.
01132 // Otherwise an error occurred.
01133 if (nfds > -1)
01134 this->end_pfds_ = this->start_pfds_ + nfds;
01135 #endif /* ACE_HAS_EVENT_POLL */
01136
01137 // If timers are pending, override any timeout from the poll.
01138 return (nfds == 0 && timers_pending != 0 ? 1 : nfds);
01139 }
|
|
|
Declare the dynamic allocation hooks.
Reimplemented from ACE_Reactor_Impl. Definition at line 986 of file Dev_Poll_Reactor.h. |
|
|
This flag is used to keep track of whether we are actively handling events or not. Definition at line 1118 of file Dev_Poll_Reactor.h. Referenced by deactivate(), deactivated(), handle_events(), and work_pending_i(). |
|
|
Keeps track of whether we need to delete the notify handler (if we didn't create it, then we don't delete it). Definition at line 1149 of file Dev_Poll_Reactor.h. |
|
|
Keeps track of whether we should delete the signal handler (if we didn't create it, then we don't delete it). Definition at line 1141 of file Dev_Poll_Reactor.h. Referenced by close(), open(), and set_sig_handler(). |
|
|
Keeps track of whether we should delete the timer queue (if we didn't create it, then we don't delete it). Definition at line 1134 of file Dev_Poll_Reactor.h. Referenced by close(), open(), and timer_queue(). |
|
|
The last element in the event array plus one. The loop that dispatches IO events stops when this->start_pevents_ == this->end_pevents_. Definition at line 1097 of file Dev_Poll_Reactor.h. Referenced by close(), dispatch_io_event(), and work_pending_i(). |
|
|
Table of event structures to be filled by epoll_wait:. Track HANDLES we are interested in for various events that must be dispatched *without* polling. ACE_Dev_Poll_Ready_Set ready_set_; Definition at line 1086 of file Dev_Poll_Reactor.h. Referenced by close(), and work_pending_i(). |
|
|
The repository that contains all registered event handlers.
Definition at line 1127 of file Dev_Poll_Reactor.h. Referenced by close(), dispatch_io_event(), find_handler(), handler(), mask_ops_i(), open(), register_handler_i(), remove_handler_i(), resume_handler_i(), resume_handlers(), suspend_handler_i(), and suspend_handlers(). |
|
|
Has the reactor been initialized.
Definition at line 1066 of file Dev_Poll_Reactor.h. Referenced by close(), initialized(), and open(). |
|
|
Adapter used to return internal lock to outside world.
Definition at line 1124 of file Dev_Poll_Reactor.h. Referenced by lock(). |
|
|
If 0 then the Reactor will not mask the signals during the event dispatching. This is useful for applications that do not register any signal handlers and want to reduce the overhead introduce by the kernel level locks required to change the mask. Definition at line 1159 of file Dev_Poll_Reactor.h. |
|
|
Callback object that unblocks the if it's sleeping. Definition at line 1145 of file Dev_Poll_Reactor.h. Referenced by close(), max_notify_iterations(), notify(), open(), and purge_pending_notifications(). |
|
|
All interactions with the `/dev/poll' or `/dev/epoll' device are done through this file descriptor. Definition at line 1074 of file Dev_Poll_Reactor.h. Referenced by close(), mask_ops_i(), open(), register_handler_i(), resume_handler_i(), suspend_handler_i(), and work_pending_i(). |
|
|
Restart the handle_events event loop method automatically when polling function in use (ioctl() in this case) is interrupted via an EINTR signal. Definition at line 1164 of file Dev_Poll_Reactor.h. |
|
|
Handle signals without requiring global/static variables.
Definition at line 1137 of file Dev_Poll_Reactor.h. Referenced by close(), handler(), open(), register_handler(), remove_handler(), and set_sig_handler(). |
|
|
The maximum number of file descriptors over which demultiplexing will occur. Definition at line 1078 of file Dev_Poll_Reactor.h. |
|
|
Pointer to the next epoll_event array element that contains the next event to be dispatched. Definition at line 1090 of file Dev_Poll_Reactor.h. Referenced by close(), dispatch_io_event(), and work_pending_i(). |
|
|
Defined as a pointer to allow overriding by derived classes...
Definition at line 1130 of file Dev_Poll_Reactor.h. Referenced by cancel_timer(), close(), dispatch_timer_handler(), open(), reset_timer_interval(), schedule_timer(), timer_queue(), and work_pending_i(). |
|
|
Lock used for synchronization of reactor state.
Definition at line 1121 of file Dev_Poll_Reactor.h. |
1.3.6