30 #include "trm/TunerReservation.h"
31 #include "trm/Activity.h"
32 #include "trm/TunerState.h"
34 #include "ReservationCustomAttributes.h"
41 static bool isOverlap(uint64_t start1, uint64_t dur1, uint64_t start2, uint64_t dur2)
44 if (((start1 + dur1) <= start2)|| ((start2 + dur2) <= start1)) {
51 Tuner::Tuner(
const std::string & internalId)
52 : internalId(internalId)
54 Assert(reservations.size() == 0);
57 TunerReservation::TokenList & Tuner::getReservationTokens(TunerReservation::TokenList & tokens)
const
59 ReservationCT::const_iterator it;
60 for (it = reservations.begin(); it != reservations.end(); it++) {
61 tokens.push_back(it->first);
63 Assert(reservations.size() <= tokens.size());
68 const TunerReservation& Tuner::getReservation(
const std::string &reservationToken)
const
70 ReservationCT::const_iterator it;
71 it = reservations.find(reservationToken);
72 if (it == reservations.end()) {
80 TunerReservation& Tuner::getReservation(
const std::string &reservationToken)
82 ReservationCT::iterator it;
83 it = reservations.find(reservationToken);
84 if (it == reservations.end()) {
92 const TunerReservation & Tuner::getReservation(
const Activity &activity,
int reservationState,
const std::string &serviceLocator)
const
97 ReservationCT::const_iterator it = reservations.begin();
98 while(it != reservations.end()) {
99 if (it->second.state == reservationState) {
100 if (it->second.getActivity() == activity) {
101 if (serviceLocator.empty() || (serviceLocator.compare(it->second.getServiceLocator()) == 0)) {
109 if (it == reservations.end()) {
110 throw ItemNotFoundException();
117 const TunerState Tuner::getState(
void)
const
122 TunerState state = TunerState::kFree;
123 ReservationCT::const_iterator it = reservations.begin();
124 while(it != reservations.end()) {
125 if (it->second.state == TunerReservation::ACTIVE) {
126 if (it->second.getStartTime() > GetCurrentEpoch()) {
127 std::cout <<
"WARN::" << it->second.getReservationToken()
128 <<
" has start Time " << it->second.getStartTime()
129 <<
"vs current " << GetCurrentEpoch() << std::endl;
132 if ((it->second.getStartTime() + it->second.getDuration()) < GetCurrentEpoch()) {
133 std::cout <<
"WARN:: " << it->second.getReservationToken()
134 <<
" has end Time " << (it->second.getStartTime() + it->second.getDuration())
135 <<
"vs current " << GetCurrentEpoch() << std::endl;
141 if (it->second.getActivity() == Activity::kLive) {
142 state = state + Activity::kLive;
144 else if (it->second.getActivity() == Activity::kRecord) {
145 state = state + Activity::kRecord;
151 std::cout <<
"Tuner::getState() returning " << (
const char *) (state.getState()) << std::endl;
155 void Tuner::setState(
const TunerState &state)
160 const std::string Tuner::getServiceLocator(
bool considerFutureToken)
const
165 std::string serviceLocator =
"";
167 if (serviceLocator.empty()){
169 ReservationCT::const_iterator it = reservations.begin();
170 while(it != reservations.end()) {
171 if (it->second.state == TunerReservation::ACTIVE) {
172 serviceLocator = it->second.getServiceLocator();
179 if (serviceLocator.empty() && considerFutureToken){
180 Assert(getState().getState() == TunerState::kFree);
182 ReservationCT::const_iterator it = reservations.begin();
183 uint64_t startTime = std::numeric_limits<uint64_t>::max();
184 while(it != reservations.end()) {
185 if (it->second.getStartTime() < startTime) {
186 startTime = it->second.getStartTime();
187 serviceLocator = it->second.getServiceLocator();
193 return serviceLocator;
196 uint64_t Tuner::getEndTime(
const Activity &activity)
const
200 uint64_t endTime = 0;
203 ReservationCT::const_iterator it = reservations.begin();
204 while(it != reservations.end() && it->second.getActivity() == activity ) {
205 if ((it->second.getStartTime() + it->second.getDuration()) > endTime) {
206 endTime = it->second.getStartTime() + it->second.getDuration();
215 const std::string &Tuner::getId(
void)
const {
219 void Tuner::addReservation(
const TunerReservation & reservation)
221 std::cout <<
"Enter addReservation" << std::endl;
226 SafeAssert(assertTunerState(TunerReservation::EXPIRED, 0, 0));
229 if (getState() == TunerState::kFree) {
230 SafeAssert(assertTunerState(TunerReservation::ACTIVE, 0, 0));
232 else if (getState() == TunerState::kHybrid) {
238 SafeAssert(assertTunerState(TunerReservation::ACTIVE, 1, 2));
242 ReservationCT::const_iterator it = reservations.find(reservation.getReservationToken());
243 if (it != reservations.end()) {
244 std::cout <<
"Tuner Reservation " << reservation.getReservationToken() <<
" Already Exist!" << std::endl;
247 if (getState() != TunerState::kFree) {
248 Assert(reservations.size() > 0);
249 ReservationCT::const_iterator it = reservations.begin();
251 while(it != reservations.end()) {
252 if (isOverlap(it->second.getStartTime(), it->second.getDuration(), reservation.getStartTime(), reservation.getDuration())) {
253 std::cout <<
"one locator is " << it->second.getServiceLocator() << std::endl;
254 std::cout <<
"other locator is " << reservation.getServiceLocator() << std::endl;
258 if (it->second.getActivity() == reservation.getActivity()) {
259 Assert(it->second.getServiceLocator().compare(reservation.getServiceLocator()) == 0);
271 std::cout <<
"Reservation to Add is new" << std::endl;
273 std::cout <<
" Current Tuner State is " << (
const char *) getState().getState()
274 <<
" Activity requested is " << (
const char *) reservation.getActivity().getActivity() << std::endl;
280 state = state + reservation.getActivity().getActivity();
281 std::cout <<
"New Tuner State is " << (
const char *) state.getState() << std::endl;
283 reservations[reservation.getReservationToken()] = reservation;
288 ReservationCT::const_iterator it = reservations.begin();
289 while(it != reservations.end()) {
290 if (it->second.state == TunerReservation::ACTIVE) {
298 std::cout <<
" Reservation Added Successfully : " << reservation.getReservationToken() << std::endl;
301 void Tuner::releaseReservation(
const std::string & reservationToken)
303 std::cout <<
"Enter releaseReservation" << std::endl;
306 ReservationCT::iterator it = reservations.find(reservationToken);
307 if (it != reservations.end()) {
308 TunerReservation & removedReservation = it->second;
309 printf(
"Releasing Reservation %p\r\n", &removedReservation);
312 if (getState() == TunerState::kFree) {
313 SafeAssert(assertTunerState(TunerReservation::ACTIVE, 0, 0));
314 SafeAssert(assertTunerState(TunerReservation::EXPIRED, 0, 1));
316 else if (getState() == TunerState::kHybrid) {
322 SafeAssert(assertTunerState(TunerReservation::ACTIVE, 1, 2));
323 SafeAssert(assertTunerState(TunerReservation::EXPIRED, 0, 1));
326 Assert((removedReservation).getReservationToken().compare(reservationToken) == 0);
327 extern void delete_ReservationCustomAttributes(
void *p);
328 delete_ReservationCustomAttributes((
void *)removedReservation.getCustomAttributes());
331 if (removedReservation.state == TunerReservation::IDLE) {
332 std::cout <<
"Removing Future Reservation " << std::endl;
333 }
else if (removedReservation.state == TunerReservation::ACTIVE) {
334 std::cout <<
"Removing Current Reservation " << std::endl;
335 state = state - removedReservation.getActivity().getActivity();
338 std::cout <<
" Removing Expired Reservation " << std::endl;
339 state = state - removedReservation.getActivity().getActivity();
342 reservations.erase(it);
347 bool Tuner::assertTunerState(
int state,
int lowMark,
int highMark)
351 ReservationCT::const_iterator it = reservations.begin();
352 while(it != reservations.end()) {
353 if (it->second.state == state) {
358 if (count >= lowMark && count <= highMark) {
362 std::cout <<
"TUner has " << count <<
" reservations in state " << state <<
" vs " << lowMark <<
", " << highMark << std::endl;