Go to the documentation of this file.00001
00002
00003 #include "ace/Barrier.h"
00004
00005 #if defined (ACE_HAS_THREADS)
00006
00007 #if !defined (__ACE_INLINE__)
00008 #include "ace/Barrier.inl"
00009 #endif
00010
00011 #include "ace/Guard_T.h"
00012 #include "ace/OS_NS_errno.h"
00013
00014 #if defined (ACE_HAS_DUMP)
00015 # include "ace/Log_Msg.h"
00016 #endif
00017
00018 ACE_RCSID (ace,
00019 Barrier,
00020 "$Id: Barrier.cpp 84282 2009-01-30 15:04:29Z msmit $")
00021
00022 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00023
00024 ACE_ALLOC_HOOK_DEFINE(ACE_Sub_Barrier)
00025
00026 void
00027 ACE_Sub_Barrier::dump (void) const
00028 {
00029 #if defined (ACE_HAS_DUMP)
00030
00031
00032 ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00033 this->barrier_finished_.dump ();
00034 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("running_threads_ = %d\n"), this->running_threads_));
00035 ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00036 #endif
00037 }
00038
00039 ACE_Sub_Barrier::ACE_Sub_Barrier (unsigned int count,
00040 ACE_Thread_Mutex &lock,
00041 const ACE_TCHAR *name,
00042 void *arg)
00043 : barrier_finished_ (lock, name, arg),
00044 running_threads_ (count)
00045 {
00046
00047 }
00048
00049 ACE_ALLOC_HOOK_DEFINE(ACE_Barrier)
00050
00051 void
00052 ACE_Barrier::dump (void) const
00053 {
00054 #if defined (ACE_HAS_DUMP)
00055
00056
00057 ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00058 this->lock_.dump ();
00059 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("current_generation_ = %d"), this->current_generation_));
00060 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\ncount_ = %d"), this->count_));
00061 this->sub_barrier_1_.dump ();
00062 this->sub_barrier_2_.dump ();
00063 ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00064 #endif
00065 }
00066
00067 ACE_Barrier::ACE_Barrier (unsigned int count,
00068 const ACE_TCHAR *name,
00069 void *arg)
00070 : lock_ (name, (ACE_mutexattr_t *) arg),
00071 current_generation_ (0),
00072 count_ (count),
00073 sub_barrier_1_ (count, lock_, name, arg),
00074 sub_barrier_2_ (count, lock_, name, arg)
00075 {
00076 ACE_TRACE ("ACE_Barrier::ACE_Barrier");
00077 this->sub_barrier_[0] = &this->sub_barrier_1_;
00078 this->sub_barrier_[1] = &this->sub_barrier_2_;
00079 }
00080
00081 int
00082 ACE_Barrier::wait (void)
00083 {
00084 ACE_TRACE ("ACE_Barrier::wait");
00085 ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, this->lock_, -1);
00086
00087 ACE_Sub_Barrier *sbp =
00088 this->sub_barrier_[this->current_generation_];
00089
00090
00091 if (sbp == 0)
00092 {
00093 errno = ESHUTDOWN;
00094 return -1;
00095 }
00096
00097 int retval = 0;
00098
00099 if (sbp->running_threads_ == 1)
00100 {
00101
00102
00103
00104 sbp->running_threads_ = this->count_;
00105
00106 this->current_generation_ = 1 - this->current_generation_;
00107 sbp->barrier_finished_.broadcast ();
00108 }
00109 else
00110 {
00111 --sbp->running_threads_;
00112
00113
00114 while (sbp->running_threads_ != this->count_)
00115 sbp->barrier_finished_.wait ();
00116
00117
00118
00119
00120 if (this->sub_barrier_[this->current_generation_] == 0)
00121 {
00122 errno = ESHUTDOWN;
00123 retval = -1;
00124 }
00125 }
00126
00127 return retval;
00128 }
00129
00130 int
00131 ACE_Barrier::shutdown (void)
00132 {
00133 ACE_TRACE ("ACE_Barrier::shutdown");
00134 ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, this->lock_, -1);
00135
00136 ACE_Sub_Barrier *sbp =
00137 this->sub_barrier_[this->current_generation_];
00138
00139
00140 if (sbp == 0)
00141 {
00142 errno = ESHUTDOWN;
00143 return -1;
00144 }
00145
00146
00147 this->sub_barrier_[0] = 0;
00148 this->sub_barrier_[1] = 0;
00149
00150 sbp->running_threads_ = this->count_;
00151 sbp->barrier_finished_.broadcast ();
00152
00153 return 0;
00154 }
00155
00156 ACE_ALLOC_HOOK_DEFINE(ACE_Thread_Barrier)
00157
00158 ACE_Thread_Barrier::ACE_Thread_Barrier (unsigned int count,
00159 const ACE_TCHAR *name)
00160 : ACE_Barrier (count, name)
00161 {
00162
00163 }
00164
00165 void
00166 ACE_Thread_Barrier::dump (void) const
00167 {
00168 #if defined (ACE_HAS_DUMP)
00169
00170 ACE_Barrier::dump ();
00171 #endif
00172 }
00173
00174 #if 0
00175 ACE_ALLOC_HOOK_DEFINE(ACE_Process_Barrier)
00176
00177 ACE_Process_Barrier::ACE_Process_Barrier (u_int count,
00178 const ACE_TCHAR *name)
00179 : ACE_Barrier (count, USYNC_PROCESS, name)
00180 {
00181
00182 }
00183
00184 void
00185 ACE_Process_Barrier::dump (void) const
00186 {
00187 #if defined (ACE_HAS_DUMP)
00188
00189 ACE_Barrier::dump ();
00190 #endif
00191 }
00192 #endif
00193
00194 ACE_END_VERSIONED_NAMESPACE_DECL
00195
00196 #endif