Exemplo n.º 1
0
// 构造函数
Timer::Timer(double val,
             double interval,
             TimerCallback cb)
    : timerfd_(createTimerfd()),
      val_(val),
      interval_(interval),
      callback_(std::move(cb)),
      isStarted_(false)
{ }
Exemplo n.º 2
0
TimerQueue::TimerQueue(Worker* loop)
  : loop_(loop),
    timerfd_(createTimerfd()),
    timerfdChannel_(loop, timerfd_),
    timers_(),
    callingExpiredTimers_(false) {
  timerfdChannel_.SetReadCb(
      boost::bind(&TimerQueue::handleRead, this));
  // we are always reading the timerfd, we disarm it with timerfd_settime.
  timerfdChannel_.enableReading();
}
Exemplo n.º 3
0
int main() {
    int timerfd;
    int ret = 0;
    int numevents = 0;
    int j = 0;
    int processed = 0;
    struct timeval tvp;
    tvp.tv_sec = 0;
    tvp.tv_usec = 1;
    eventLoop *eLoop = createEventLoop();
    timerfd = createTimerfd();
    if ((ret = createFileEvent(eLoop, timerfd, 1, timerCallback)) == -1) {
        printf("timerfd createFileEvent failed!\n");
    } else {
        printf("timerfd createFileEvent ok!\n");
    }
    if ((ret = aePollCreate(eLoop)) == -1) {
        printf("aePollCreate failed!\n");
    } else {
        printf("aePollCreate ok!\n");
    }
    addTimer(eLoop, timerfd, READABLE);
    runEvery(timerfd, 800);

    int count = 0;
    while(1) {
        numevents = 0;
        numevents = aePollPoll(eLoop, &tvp);
        for (j = 0; j < numevents; j++) {
            fileEvent *fe = &eLoop->fEvents[eLoop->fired[j].fd];
            int mask = eLoop->fired[j].mask;
            int fd = eLoop->fired[j].fd;

	    /* note the fe->mask & mask & ... code: maybe an already processed
             * event removed an element that fired and we still didn't
             * processed, so we check if the event is still valid. */
            if (fe->mask & mask & READABLE)
                fe->rfileProc(NULL, eLoop,fd,mask);
            if (fe->mask & mask & WRITEABLE && fe->wfileProc != fe->rfileProc)
                fe->wfileProc(NULL, eLoop,fd,mask);
            processed++;
        }
        count++;
//        if(count==10000000) deleteTimer(eLoop, timerfd, 1);
    } 
}