00001
00002
00003
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
00083 ACE_NOTSUP_RETURN (-1);
00084 }
00085
00086 #endif
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
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 bool
00120 ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>::uses_event_associations (void)
00121 {
00122
00123
00124 return false;
00125 }
00126
00127
00128
00129
00130
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
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
00195
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