Select_Reactor_T.inl

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // $Id: Select_Reactor_T.inl 80826 2008-03-04 14:51:23Z wotte $
00004 
00005 #include "ace/Reactor.h"
00006 #include "ace/Signal.h"
00007 #include "ace/Sig_Handler.h"
00008 
00009 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00010 
00011 template <class ACE_SELECT_REACTOR_TOKEN>
00012 ACE_INLINE int
00013 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::resume_handler (ACE_Event_Handler *h)
00014 {
00015   ACE_TRACE ("ACE_Select_Reactor_T::resume_handler");
00016   return this->resume_handler (h->get_handle ());
00017 }
00018 
00019 template <class ACE_SELECT_REACTOR_TOKEN>
00020 ACE_INLINE int
00021 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::resume_handler (const ACE_Handle_Set &handles)
00022 {
00023   ACE_TRACE ("ACE_Select_Reactor_T::resume_handler");
00024   ACE_Handle_Set_Iterator handle_iter (handles);
00025   ACE_HANDLE h;
00026 
00027   ACE_MT (ACE_GUARD_RETURN (ACE_SELECT_REACTOR_TOKEN, ace_mon, this->token_, -1));
00028 
00029   while ((h = handle_iter ()) != ACE_INVALID_HANDLE)
00030     if (this->resume_i (h) == -1)
00031       return -1;
00032 
00033   return 0;
00034 }
00035 
00036 template <class ACE_SELECT_REACTOR_TOKEN>
00037 ACE_INLINE int
00038 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::suspend_handler (ACE_Event_Handler *h)
00039 {
00040   ACE_TRACE ("ACE_Select_Reactor_T::suspend_handler");
00041   return this->suspend_handler (h->get_handle ());
00042 }
00043 
00044 template <class ACE_SELECT_REACTOR_TOKEN>
00045 ACE_INLINE int
00046 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::suspend_handler (const ACE_Handle_Set &handles)
00047 {
00048   ACE_TRACE ("ACE_Select_Reactor_T::suspend_handler");
00049   ACE_Handle_Set_Iterator handle_iter (handles);
00050   ACE_HANDLE h;
00051 
00052   ACE_MT (ACE_GUARD_RETURN (ACE_SELECT_REACTOR_TOKEN, ace_mon, this->token_, -1));
00053 
00054   while ((h = handle_iter ()) != ACE_INVALID_HANDLE)
00055     if (this->suspend_i (h) == -1)
00056       return -1;
00057 
00058   return 0;
00059 }
00060 
00061 template <class ACE_SELECT_REACTOR_TOKEN>
00062 ACE_INLINE int
00063 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::register_handler (int signum,
00064                                                                   ACE_Event_Handler *new_sh,
00065                                                                   ACE_Sig_Action *new_disp,
00066                                                                   ACE_Event_Handler **old_sh,
00067                                                                   ACE_Sig_Action *old_disp)
00068 {
00069   ACE_TRACE ("ACE_Select_Reactor_T::register_handler");
00070   return this->signal_handler_->register_handler (signum,
00071                                                   new_sh, new_disp,
00072                                                   old_sh, old_disp);
00073 }
00074 
00075 #if defined (ACE_WIN32)
00076 
00077 template <class ACE_SELECT_REACTOR_TOKEN>
00078 ACE_INLINE int
00079 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::register_handler (ACE_Event_Handler *,
00080                                                                   ACE_HANDLE )
00081 {
00082   // Don't have an implementation for this yet...
00083   ACE_NOTSUP_RETURN (-1);
00084 }
00085 
00086 #endif /* ACE_WIN32 */
00087 
00088 template <class ACE_SELECT_REACTOR_TOKEN>
00089 ACE_INLINE int
00090 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::register_handler (ACE_HANDLE ,
00091                                                                   ACE_HANDLE ,
00092                                                                   ACE_Event_Handler *,
00093                                                                   ACE_Reactor_Mask )
00094 {
00095   // Don't have an implementation for this yet...
00096   ACE_NOTSUP_RETURN (-1);
00097 }
00098 
00099 template <class ACE_SELECT_REACTOR_TOKEN>
00100 ACE_INLINE int
00101 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::handler (int signum, ACE_Event_Handler **handler)
00102 {
00103   ACE_TRACE ("ACE_Select_Reactor_T::handler");
00104   return this->handler_i (signum, handler);
00105 }
00106 
00107 template <class ACE_SELECT_REACTOR_TOKEN>
00108 ACE_INLINE int
00109 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::remove_handler (int signum,
00110                                                                 ACE_Sig_Action *new_disp,
00111                                                                 ACE_Sig_Action *old_disp,
00112                                                                 int sigkey)
00113 {
00114   ACE_TRACE ("ACE_Select_Reactor_T::remove_handler");
00115   return this->signal_handler_->remove_handler (signum, new_disp, old_disp, sigkey);
00116 }
00117 
00118 template <class ACE_SELECT_REACTOR_TOKEN>
00119 ACE_INLINE int
00120 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::uses_event_associations (void)
00121 {
00122   // Since the Select_Reactor does not do any event associations, this
00123   // function always return 0.
00124   return 0;
00125 }
00126 
00127 // = The remaining methods in this file must be called with locks
00128 // held.
00129 
00130 // Performs operations on the "ready" bits.
00131 
00132 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE int
00133 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::ready_ops (ACE_Event_Handler *handler,
00134                                                            ACE_Reactor_Mask mask,
00135                                                            int ops)
00136 {
00137   ACE_TRACE ("ACE_Select_Reactor_T::ready_ops");
00138   return this->ready_ops (handler->get_handle (), mask, ops);
00139 }
00140 
00141 // Performs operations on the "dispatch" masks.
00142 
00143 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE int
00144 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::mask_ops (ACE_Event_Handler *handler,
00145                                                           ACE_Reactor_Mask mask,
00146                                                           int ops)
00147 {
00148   ACE_TRACE ("ACE_Select_Reactor_T::mask_ops");
00149   return this->mask_ops (handler->get_handle (), mask, ops);
00150 }
00151 
00152 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE int
00153 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::schedule_wakeup (ACE_Event_Handler *eh,
00154                                                                  ACE_Reactor_Mask mask)
00155 {
00156   ACE_TRACE ("ACE_Select_Reactor_T::schedule_wakeup");
00157   return this->mask_ops (eh->get_handle (), mask, ACE_Reactor::ADD_MASK);
00158 }
00159 
00160 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE int
00161 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::cancel_wakeup (ACE_Event_Handler *eh,
00162                                                                ACE_Reactor_Mask mask)
00163 {
00164   ACE_TRACE ("ACE_Select_Reactor_T::cancel_wakeup");
00165   return this->mask_ops (eh->get_handle (), mask, ACE_Reactor::CLR_MASK);
00166 }
00167 
00168 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE int
00169 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::schedule_wakeup (ACE_HANDLE handle,
00170                                                                  ACE_Reactor_Mask mask)
00171 {
00172   ACE_TRACE ("ACE_Select_Reactor_T::schedule_wakeup");
00173   return this->mask_ops (handle, mask, ACE_Reactor::ADD_MASK);
00174 }
00175 
00176 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE int
00177 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::cancel_wakeup (ACE_HANDLE handle,
00178                                                                ACE_Reactor_Mask mask)
00179 {
00180   ACE_TRACE ("ACE_Select_Reactor_T::cancel_wakeup");
00181   return this->mask_ops (handle, mask, ACE_Reactor::CLR_MASK);
00182 }
00183 
00184 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE ACE_Lock &
00185 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::lock (void)
00186 {
00187   ACE_TRACE ("ACE_Select_Reactor_T::lock");
00188   return this->lock_adapter_;
00189 }
00190 
00191 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE void
00192 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::wakeup_all_threads (void)
00193 {
00194   // Send a notification, but don't block if there's no one to receive
00195   // it.
00196   this->notify (0, ACE_Event_Handler::NULL_MASK, (ACE_Time_Value *) &ACE_Time_Value::zero);
00197 }
00198 
00199 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE int
00200 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::alertable_handle_events (ACE_Time_Value *max_wait_time)
00201 {
00202   return this->handle_events (max_wait_time);
00203 }
00204 
00205 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE int
00206 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::alertable_handle_events (ACE_Time_Value &max_wait_time)
00207 {
00208   return this->handle_events (max_wait_time);
00209 }
00210 
00211 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE int
00212 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::deactivated (void)
00213 {
00214   return this->deactivated_;
00215 }
00216 
00217 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE void
00218 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::deactivate (int do_stop)
00219 {
00220   {
00221     ACE_MT (ACE_GUARD (ACE_SELECT_REACTOR_TOKEN,
00222                        ace_mon,
00223                        this->token_));
00224     this->deactivated_ = do_stop;
00225   }
00226 
00227   this->wakeup_all_threads ();
00228 }
00229 
00230 template <class ACE_SELECT_REACTOR_TOKEN> ACE_INLINE size_t
00231 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::size (void) const
00232 {
00233   return this->handler_rep_.size ();
00234 }
00235 
00236 ACE_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:18:42 2010 for ACE by  doxygen 1.4.7