| 1602 | } |
| 1603 | |
| 1604 | void |
| 1605 | WriteDataContainer::set_deadline_period(const TimeDuration& deadline_period) |
| 1606 | { |
| 1607 | // Call comes from DataWriterImpl_t which should arleady have the lock_. |
| 1608 | |
| 1609 | // Deadline for all instances starting from now. |
| 1610 | const MonotonicTimePoint deadline = MonotonicTimePoint::now() + deadline_period; |
| 1611 | |
| 1612 | // Reset the deadline timer if the period has changed. |
| 1613 | if (deadline_period_ != deadline_period) { |
| 1614 | if (deadline_period_ == TimeDuration::max_value) { |
| 1615 | OPENDDS_ASSERT(deadline_map_.empty()); |
| 1616 | |
| 1617 | for (PublicationInstanceMapType::iterator iter = instances_.begin(); |
| 1618 | iter != instances_.end(); |
| 1619 | ++iter) { |
| 1620 | iter->second->deadline_ = deadline; |
| 1621 | deadline_map_.insert(std::make_pair(deadline, iter->second)); |
| 1622 | } |
| 1623 | |
| 1624 | if (!deadline_map_.empty()) { |
| 1625 | deadline_task_->schedule(deadline_period); |
| 1626 | } |
| 1627 | } else if (deadline_period == TimeDuration::max_value) { |
| 1628 | if (!deadline_map_.empty()) { |
| 1629 | deadline_task_->cancel(); |
| 1630 | } |
| 1631 | |
| 1632 | deadline_map_.clear(); |
| 1633 | } else { |
| 1634 | DeadlineMapType new_map; |
| 1635 | for (PublicationInstanceMapType::iterator iter = instances_.begin(); |
| 1636 | iter != instances_.end(); |
| 1637 | ++iter) { |
| 1638 | iter->second->deadline_ = deadline; |
| 1639 | new_map.insert(std::make_pair(iter->second->deadline_, iter->second)); |
| 1640 | } |
| 1641 | std::swap(new_map, deadline_map_); |
| 1642 | |
| 1643 | if (!deadline_map_.empty()) { |
| 1644 | deadline_task_->cancel(); |
| 1645 | deadline_task_->schedule(deadline_map_.begin()->first - MonotonicTimePoint::now()); |
| 1646 | } |
| 1647 | } |
| 1648 | |
| 1649 | deadline_period_ = deadline_period; |
| 1650 | } |
| 1651 | } |
| 1652 | |
| 1653 | void |
| 1654 | WriteDataContainer::process_deadlines(const MonotonicTimePoint& now) |