// @Author Lin Ya
// @Email [email protected]
#include "Timer.h"
#include
#include
#include
TimerNode::TimerNode(std::shared_ptr requestData, int timeout)
: deleted_(false), SPHttpData(requestData) {
struct timeval now;
gettimeofday(&now, NULL);
// 以毫ç§è®¡
expiredTime_ =
(((now.tv_sec % 10000) * 1000) + (now.tv_usec / 1000)) + timeout;
}
TimerNode::~TimerNode() {
if (SPHttpData) SPHttpData->handleClose();
}
TimerNode::TimerNode(TimerNode &tn)
: SPHttpData(tn.SPHttpData), expiredTime_(0) {}
void TimerNode::update(int timeout) {
struct timeval now;
gettimeofday(&now, NULL);
expiredTime_ =
(((now.tv_sec % 10000) * 1000) + (now.tv_usec / 1000)) + timeout;
}
bool TimerNode::isValid() {
struct timeval now;
gettimeofday(&now, NULL);
size_t temp = (((now.tv_sec % 10000) * 1000) + (now.tv_usec / 1000));
if (temp < expiredTime_)
return true;
else {
this->setDeleted();
return false;
}
}
void TimerNode::clearReq() {
SPHttpData.reset();
this->setDeleted();
}
TimerManager::TimerManager() {}
TimerManager::~TimerManager() {}
void TimerManager::addTimer(std::shared_ptr SPHttpData, int timeout) {
SPTimerNode new_node(new TimerNode(SPHttpData, timeout));
timerNodeQueue.push(new_node);
SPHttpData->linkTimer(new_node);
}
/* å¤çé»è¾æ¯è¿æ ·ç~
å 为(1) ä¼å
éå䏿¯æéæºè®¿é®
(2) å³ä½¿æ¯æï¼éæºå 餿èç¹åç ´åäºå çç»æï¼éè¦éæ°æ´æ°å ç»æã
æä»¥å¯¹äºè¢«ç½®ä¸ºdeletedçæ¶é´èç¹ï¼ä¼å»¶è¿å°å®(1)è¶
æ¶ æ
(2)å®åé¢çèç¹é½è¢«å 餿¶ï¼å®æä¼è¢«å é¤ã
ä¸ä¸ªç¹è¢«ç½®ä¸ºdeleted,宿è¿ä¼å¨TIMER_TIME_OUTæ¶é´å被å é¤ã
è¿æ ·åæä¸¤ä¸ªå¥½å¤ï¼
(1) 第ä¸ä¸ªå¥½å¤æ¯ä¸éè¦éåä¼å
éåï¼çæ¶ã
(2)
第äºä¸ªå¥½å¤æ¯ç»è¶
æ¶æ¶é´ä¸ä¸ªå®¹å¿çæ¶é´ï¼å°±æ¯è®¾å®çè¶
æ¶æ¶é´æ¯å é¤çä¸é(并䏿¯ä¸å°è¶
æ¶æ¶é´å°±ç«å³å é¤)ï¼å¦æçå¬ç请æ±å¨è¶
æ¶åçä¸ä¸æ¬¡è¯·æ±ä¸å䏿¬¡åºç°äºï¼
å°±ä¸ç¨åéæ°ç³è¯·RequestDataèç¹äºï¼è¿æ ·å¯ä»¥ç»§ç»éå¤å©ç¨åé¢çRequestDataï¼åå°äºä¸æ¬¡deleteå䏿¬¡newçæ¶é´ã
*/
void TimerManager::handleExpiredEvent() {
// MutexLockGuard locker(lock);
while (!timerNodeQueue.empty()) {
SPTimerNode ptimer_now = timerNodeQueue.top();
if (ptimer_now->isDeleted())
timerNodeQueue.pop();
else if (ptimer_now->isValid() == false)
timerNodeQueue.pop();
else
break;
}
}