future_status result::wait_until(time_point const& wait_timeout_time, boost::unique_lock<boost::mutex>& lock) const { if(ready(lock)) return future_status::ready; while(!expired() && !(clock_type::now() > wait_timeout_time)) { // note: don't set to wait for 0 ms, it might not timeout if(m_condition.wait_for(lock, boost::chrono::milliseconds(1), boost::bind(&result::ready, this, boost::ref(lock)))) { return future_status::ready; } if(expired() || (clock_type::now() > wait_timeout_time)) break; lock.unlock(); io_runner::poll_one(*m_io_service); lock.lock(); } if(clock_type::now() > wait_timeout_time) return future_status::timeout; BOOST_ASSERT(expired()); m_exception = boost::make_shared<remote_error> (remote_error::timeout, "remote call timeout"); m_ready = true; return future_status::ready; }
bool StatelessReader::change_received(CacheChange_t* change, boost::unique_lock<boost::recursive_mutex> &lock) { // Only make visible the change if there is not other with bigger sequence number. // TODO Revisar si no hay que incluirlo. if(!mp_history->thereIsUpperRecordOf(change->writerGUID, change->sequenceNumber)) { if(mp_history->received_change(change, 0)) { if(getListener() != nullptr) { lock.unlock(); getListener()->onNewCacheChangeAdded((RTPSReader*)this,change); lock.lock(); } mp_history->postSemaphore(); return true; } } return false; }