Go to the documentation of this file.00001
00002
00003
00004
00005 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00006
00007 ACE_INLINE
00008 ACE_At_Thread_Exit::ACE_At_Thread_Exit (void)
00009 : next_ (0),
00010 td_ (0),
00011 was_applied_ (false),
00012 is_owner_ (true)
00013 {
00014 }
00015
00016 ACE_INLINE bool
00017 ACE_At_Thread_Exit::was_applied() const
00018 {
00019 return was_applied_;
00020 }
00021
00022 ACE_INLINE bool
00023 ACE_At_Thread_Exit::was_applied (bool applied)
00024 {
00025 was_applied_ = applied;
00026 if (was_applied_)
00027 td_ = 0;
00028 return was_applied_;
00029 }
00030
00031 ACE_INLINE bool
00032 ACE_At_Thread_Exit::is_owner() const
00033 {
00034 return is_owner_;
00035 }
00036
00037 ACE_INLINE bool
00038 ACE_At_Thread_Exit::is_owner (bool owner)
00039 {
00040 is_owner_ = owner;
00041 return is_owner_;
00042 }
00043
00044 ACE_INLINE void
00045 ACE_At_Thread_Exit::do_apply (void)
00046 {
00047 if (!this->was_applied_ && this->is_owner_)
00048 td_->at_pop();
00049 }
00050
00051 ACE_INLINE
00052 ACE_At_Thread_Exit_Func::ACE_At_Thread_Exit_Func (void *object,
00053 ACE_CLEANUP_FUNC func,
00054 void *param)
00055 : object_(object),
00056 func_(func),
00057 param_(param)
00058 {
00059 }
00060
00061 ACE_INLINE
00062 ACE_Thread_Descriptor_Base::ACE_Thread_Descriptor_Base (void)
00063 : ACE_OS_Thread_Descriptor (),
00064 thr_id_ (ACE_OS::NULL_thread),
00065 thr_handle_ (ACE_OS::NULL_hthread),
00066 grp_id_ (0),
00067 thr_state_ (ACE_Thread_Manager::ACE_THR_IDLE),
00068 task_ (0),
00069 next_ (0),
00070 prev_ (0)
00071 {
00072 }
00073
00074 ACE_INLINE
00075 ACE_Thread_Descriptor_Base::~ACE_Thread_Descriptor_Base (void)
00076 {
00077 }
00078
00079 ACE_INLINE bool
00080 ACE_Thread_Descriptor_Base::operator== (
00081 const ACE_Thread_Descriptor_Base &rhs) const
00082 {
00083 return
00084 ACE_OS::thr_cmp (this->thr_handle_, rhs.thr_handle_)
00085 && ACE_OS::thr_equal (this->thr_id_, rhs.thr_id_);
00086 }
00087
00088 ACE_INLINE bool
00089 ACE_Thread_Descriptor_Base::operator!=(const ACE_Thread_Descriptor_Base &rhs) const
00090 {
00091 return !(*this == rhs);
00092 }
00093
00094 ACE_INLINE ACE_Task_Base *
00095 ACE_Thread_Descriptor_Base::task (void) const
00096 {
00097 ACE_TRACE ("ACE_Thread_Descriptor_Base::task");
00098 return this->task_;
00099 }
00100
00101
00102
00103 ACE_INLINE int
00104 ACE_Thread_Descriptor_Base::grp_id (void) const
00105 {
00106 ACE_TRACE ("ACE_Thread_Descriptor_Base::grp_id");
00107 return grp_id_;
00108 }
00109
00110
00111 ACE_INLINE ACE_UINT32
00112 ACE_Thread_Descriptor_Base::state (void) const
00113 {
00114 ACE_TRACE ("ACE_Thread_Descriptor_Base::state");
00115 return thr_state_;
00116 }
00117
00118
00119 ACE_INLINE void
00120 ACE_Thread_Descriptor_Base::reset (void)
00121 {
00122 ACE_TRACE ("ACE_Thread_Descriptor_Base::reset");
00123 this->thr_id_ = ACE_OS::NULL_thread;
00124 this->thr_handle_ = ACE_OS::NULL_hthread;
00125 this->grp_id_ = 0;
00126 this->thr_state_ = ACE_Thread_Manager::ACE_THR_IDLE;
00127 this->task_ = 0;
00128 this->flags_ = 0;
00129 }
00130
00131
00132 ACE_INLINE ACE_thread_t
00133 ACE_Thread_Descriptor::self (void) const
00134 {
00135 ACE_TRACE ("ACE_Thread_Descriptor::self");
00136 return this->thr_id_;
00137 }
00138
00139
00140
00141 ACE_INLINE void
00142 ACE_Thread_Descriptor::self (ACE_hthread_t &handle)
00143 {
00144 ACE_TRACE ("ACE_Thread_Descriptor::self");
00145 handle = this->thr_handle_;
00146 }
00147
00148 ACE_INLINE void
00149 ACE_Thread_Descriptor::log_msg_cleanup (ACE_Log_Msg* log_msg)
00150
00151 {
00152 log_msg_ = log_msg;
00153 }
00154
00155
00156 ACE_INLINE void
00157 ACE_Thread_Descriptor::set_next (ACE_Thread_Descriptor *td)
00158 {
00159 ACE_TRACE ("ACE_Thread_Descriptor::set_next");
00160 this->next_ = td;
00161 }
00162
00163
00164 ACE_INLINE ACE_Thread_Descriptor *
00165 ACE_Thread_Descriptor::get_next (void) const
00166 {
00167 ACE_TRACE ("ACE_Thread_Descriptor::get_next");
00168 return static_cast<ACE_Thread_Descriptor * ACE_CAST_CONST> (this->next_);
00169 }
00170
00171
00172 ACE_INLINE void
00173 ACE_Thread_Descriptor::reset (ACE_Thread_Manager *tm)
00174 {
00175 ACE_TRACE ("ACE_Thread_Descriptor::reset");
00176 this->ACE_Thread_Descriptor_Base::reset ();
00177 this->at_exit_list_ = 0;
00178
00179 this->tm_ = tm;
00180
00181 this->log_msg_ = 0;
00182 this->terminated_ = false;
00183 }
00184
00185 ACE_INLINE ACE_Thread_Descriptor *
00186 ACE_Thread_Manager::thread_desc_self (void)
00187 {
00188
00189
00190
00191 ACE_Thread_Descriptor *desc = ACE_LOG_MSG->thr_desc ();
00192
00193 #if 1
00194
00195
00196 #else
00197 if (desc == 0)
00198 {
00199 ACE_thread_t id = ACE_OS::thr_self ();
00200
00201 desc = this->find_thread (id);
00202
00203
00204
00205 if (desc != 0)
00206
00207 ACE_LOG_MSG->thr_desc (desc);
00208 }
00209 #endif
00210 return desc;
00211 }
00212
00213
00214
00215 ACE_INLINE ACE_thread_t
00216 ACE_Thread_Manager::thr_self (void)
00217 {
00218 ACE_TRACE ("ACE_Thread_Manager::thr_self");
00219 return ACE_Thread::self ();
00220 }
00221
00222 ACE_INLINE ACE_Task_Base *
00223 ACE_Thread_Manager::task (void)
00224 {
00225 ACE_TRACE ("ACE_Thread_Manager::task");
00226
00227 ACE_Thread_Descriptor *td = this->thread_desc_self () ;
00228
00229 if (td == 0)
00230 return 0;
00231 else
00232 return td->task ();
00233 }
00234
00235 ACE_INLINE int
00236 ACE_Thread_Manager::open (size_t)
00237 {
00238
00239 return 0;
00240 }
00241
00242 ACE_INLINE int
00243 ACE_Thread_Manager::at_exit (ACE_At_Thread_Exit* at)
00244 {
00245 ACE_Thread_Descriptor *td = this->thread_desc_self ();
00246 if (td == 0)
00247 return -1;
00248 else
00249 return td->at_exit (at);
00250 }
00251
00252 ACE_INLINE int
00253 ACE_Thread_Manager::at_exit (ACE_At_Thread_Exit& at)
00254 {
00255 ACE_Thread_Descriptor *td = this->thread_desc_self ();
00256 if (td == 0)
00257 return -1;
00258 else
00259 return td->at_exit (at);
00260 }
00261
00262 ACE_INLINE int
00263 ACE_Thread_Manager::at_exit (void *object,
00264 ACE_CLEANUP_FUNC cleanup_hook,
00265 void *param)
00266 {
00267 ACE_Thread_Descriptor *td = this->thread_desc_self ();
00268 if (td == 0)
00269 return -1;
00270 else
00271 return td->at_exit (object, cleanup_hook, param);
00272 }
00273
00274 ACE_INLINE void
00275 ACE_Thread_Manager::wait_on_exit (int do_wait)
00276 {
00277 this->automatic_wait_ = do_wait;
00278 }
00279
00280 ACE_INLINE int
00281 ACE_Thread_Manager::wait_on_exit (void)
00282 {
00283 return this->automatic_wait_;
00284 }
00285
00286 ACE_INLINE int
00287 ACE_Thread_Manager::register_as_terminated (ACE_Thread_Descriptor *td)
00288 {
00289 #if defined (ACE_HAS_VXTHREADS)
00290 ACE_UNUSED_ARG (td);
00291 #else
00292 ACE_Thread_Descriptor_Base *tdb = 0;
00293 ACE_NEW_RETURN (tdb, ACE_Thread_Descriptor_Base (*td), -1);
00294 this->terminated_thr_list_.insert_tail (tdb);
00295 #endif
00296 return 0;
00297 }
00298
00299 ACE_INLINE size_t
00300 ACE_Thread_Manager::count_threads (void) const
00301 {
00302 return this->thr_list_.size ();
00303 }
00304
00305 ACE_END_VERSIONED_NAMESPACE_DECL