1
#include "source/common/event/timer_impl.h"
2

            
3
#include <chrono>
4

            
5
#include "source/common/common/assert.h"
6

            
7
#include "event2/event.h"
8

            
9
namespace Envoy {
10
namespace Event {
11

            
12
TimerImpl::TimerImpl(Libevent::BasePtr& libevent, TimerCb cb, Dispatcher& dispatcher)
13
401197
    : cb_(cb), dispatcher_(dispatcher) {
14
401197
  ASSERT(cb_);
15
401197
  evtimer_assign(
16
401197
      &raw_event_, libevent.get(),
17
401197
      [](evutil_socket_t, short, void* arg) -> void {
18
401197
        TimerImpl* timer = static_cast<TimerImpl*>(arg);
19
401197
        if (timer->object_ == nullptr) {
20
401197
          timer->cb_();
21
401197
          return;
22
401197
        }
23
401197
        ScopeTrackerScopeState scope(timer->object_, timer->dispatcher_);
24
401197
        timer->object_ = nullptr;
25
401197
        timer->cb_();
26
401197
      },
27
401197
      this);
28
401197
}
29

            
30
779470
void TimerImpl::disableTimer() {
31
779470
  ASSERT(dispatcher_.isThreadSafe());
32
779470
  event_del(&raw_event_);
33
779470
}
34

            
35
7845465
void TimerImpl::enableTimer(const std::chrono::milliseconds d, const ScopeTrackedObject* object) {
36
7845465
  timeval tv;
37
7845465
  TimerUtils::durationToTimeval(d, tv);
38
7845465
  internalEnableTimer(tv, object);
39
7845465
}
40

            
41
void TimerImpl::enableHRTimer(const std::chrono::microseconds d,
42
291621
                              const ScopeTrackedObject* object = nullptr) {
43
291621
  timeval tv;
44
291621
  TimerUtils::durationToTimeval(d, tv);
45
291621
  internalEnableTimer(tv, object);
46
291621
}
47

            
48
8136880
void TimerImpl::internalEnableTimer(const timeval& tv, const ScopeTrackedObject* object) {
49
8136880
  ASSERT(dispatcher_.isThreadSafe());
50
8136880
  object_ = object;
51

            
52
8136880
  event_add(&raw_event_, &tv);
53
8136880
}
54

            
55
7818368
bool TimerImpl::enabled() {
56
7818368
  ASSERT(dispatcher_.isThreadSafe());
57
7818368
  return 0 != evtimer_pending(&raw_event_, nullptr);
58
7818368
}
59

            
60
} // namespace Event
61
} // namespace Envoy