diff --git a/src/simplified/xf/port/common/timeoutmanager.cpp b/src/simplified/xf/port/common/timeoutmanager.cpp index 2c366fe..0356cc7 100644 --- a/src/simplified/xf/port/common/timeoutmanager.cpp +++ b/src/simplified/xf/port/common/timeoutmanager.cpp @@ -34,9 +34,69 @@ XFTimeoutManager::~XFTimeoutManager() { void XFTimeoutManager::addTimeout(XFTimeout *pNewTimeout) { + const int desireInterval = pNewTimeout->getInterval(); + int intervalOfTimeout = 0; + int ticks; + this->pMutex_->lock(); - this->timeouts_.push_back(pNewTimeout); + + if(this->timeouts_.empty()) { + ticks = (desireInterval-intervalOfTimeout); + if(ticks<=0) ticks = 0; + pNewTimeout->setRelTicks(ticks); + this->timeouts_.push_back(pNewTimeout); + this->pMutex_->unlock(); + return; + } + + TimeoutList::iterator it = this->timeouts_.begin(); + while(intervalOfTimeout < desireInterval) { + if(++it == this->timeouts_.end()){ + ticks = (desireInterval-intervalOfTimeout); + if(ticks<=0) ticks = 0; + pNewTimeout->setRelTicks(ticks); + this->timeouts_.push_back(pNewTimeout); + this->pMutex_->unlock(); + return; + } else { + intervalOfTimeout += (*it)->getRelTicks(); + } + } + + if(intervalOfTimeout == desireInterval) { + if(++it == this->timeouts_.end()) { + ticks = (desireInterval-intervalOfTimeout); + if(ticks<=0) ticks = 0; + pNewTimeout->setRelTicks(ticks); + this->timeouts_.push_back(pNewTimeout); + this->pMutex_->unlock(); + return; + } else { + + while((*it)->getRelTicks() == 0) { + if(++it == this->timeouts_.end()) { + ticks = (desireInterval-intervalOfTimeout); + if(ticks<=0) ticks = 0; + pNewTimeout->setRelTicks(ticks); + this->timeouts_.push_back(pNewTimeout); + this->pMutex_->unlock(); + return; + } + it++; + } + + } + } + + // TODO change for take care of 10ms ecart of timeout + ticks = (desireInterval-intervalOfTimeout); + ticks = ticks > 0 ? ticks/this->tickInterval_ : 0; + + (*it)->substractFromRelTicks(ticks); + pNewTimeout->setRelTicks(ticks); + this->timeouts_.insert(--it, pNewTimeout); this->pMutex_->unlock(); + return; } @@ -70,22 +130,24 @@ void XFTimeoutManager::unscheduleTimeout(int32_t timeoutId, interface::XFBehavio } void XFTimeoutManager::tick() { - //Trace::out("[DEBUG] - Tick"); + if(!this->timeouts_.empty()) { - TimeoutList::iterator it; this->pMutex_->lock(); - for(it=this->timeouts_.begin(); it != this->timeouts_.end(); it++) { - if((*it)->getRelTicks() > 0) { - (*it)->substractFromRelTicks(this->tickInterval_); - } else { - XFEvent* ev = *(it); - XFDispatcher::getInstance()->pushEvent(ev); - it = this->timeouts_.erase(it); - it--; - } + + XFTimeout* timeout = this->timeouts_.front(); + timeout->substractFromRelTicks(tickInterval_); + + while (timeout->getRelTicks() <= 0 ) { + + XFDispatcher::getInstance()->pushEvent(timeout); + this->timeouts_.pop_front(); + timeout = this->timeouts_.front(); + } + this->pMutex_->unlock(); + } }