| 110 | } |
| 111 | |
| 112 | ReturnCode_t WaitSet::wait(ConditionSeq& active_conditions, |
| 113 | const Duration_t& timeout) |
| 114 | { |
| 115 | using namespace OpenDDS::DCPS; |
| 116 | |
| 117 | if (!non_negative_duration(timeout)) { |
| 118 | return DDS::RETCODE_BAD_PARAMETER; |
| 119 | } |
| 120 | |
| 121 | MonotonicTimePoint deadline; |
| 122 | const bool use_deadline = !is_infinite(timeout); |
| 123 | if (use_deadline) { |
| 124 | deadline = MonotonicTimePoint::now() + TimeDuration(timeout); |
| 125 | } |
| 126 | |
| 127 | ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, g, lock_, |
| 128 | RETCODE_OUT_OF_RESOURCES); |
| 129 | |
| 130 | if (waiting_) { |
| 131 | return RETCODE_PRECONDITION_NOT_MET; |
| 132 | } |
| 133 | |
| 134 | waiting_ = true; |
| 135 | signaled_conditions_.clear(); |
| 136 | |
| 137 | for (ConditionSet::const_iterator iter = attached_conditions_.begin(), |
| 138 | end = attached_conditions_.end(); iter != end; ++iter) { |
| 139 | if ((*iter)->get_trigger_value()) { |
| 140 | signaled_conditions_.insert(*iter); |
| 141 | } |
| 142 | } |
| 143 | |
| 144 | CvStatus status = CvStatus_NoTimeout; |
| 145 | ThreadStatusManager& thread_status_manager = TheServiceParticipant->get_thread_status_manager(); |
| 146 | while ((attached_conditions_.empty() || signaled_conditions_.empty()) && |
| 147 | status == CvStatus_NoTimeout) { |
| 148 | status = use_deadline ? cond_.wait_until(deadline, thread_status_manager) : cond_.wait(thread_status_manager); |
| 149 | } |
| 150 | |
| 151 | copyInto(active_conditions, signaled_conditions_); |
| 152 | signaled_conditions_.clear(); |
| 153 | waiting_ = false; |
| 154 | |
| 155 | switch (status) { |
| 156 | case CvStatus_NoTimeout: |
| 157 | return RETCODE_OK; |
| 158 | |
| 159 | case CvStatus_Timeout: |
| 160 | return RETCODE_TIMEOUT; |
| 161 | |
| 162 | case CvStatus_Error: |
| 163 | default: |
| 164 | if (DCPS_debug_level) { |
| 165 | ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: WaitSet::wait: wait_until failed\n")); |
| 166 | } |
| 167 | return RETCODE_ERROR; |
| 168 | } |
| 169 | } |