46 static const int invalidSocketDescriptor = -1;
47 static const int threadMessageSize = 1;
48 static const char finishThreadMessage[] = "F";
49 static const char wakupThreadMessage[] = "W";
53 int timerFileDescriptor;
54 if ((timerFileDescriptor = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK)) < 0) {
55 LOG_ERROR("Failed to create timerfd");
56 return nullptr;
57 }
58
59 if (timerfd_settime(timerFileDescriptor, TFD_TIMER_ABSTIME, &expireTime, 0) == -1) {
60 LOG_ERROR("Failed to set timerfd(%d)", timerFileDescriptor);
61 close(timerFileDescriptor);
62 return nullptr;
63 }
64
65 return adoptPtr(new TimerWorkItem(function, timerFileDescriptor, expire));
66}
67
68WorkQueue::TimerWorkItem::TimerWorkItem(Function<void()> function, int timerFileDescriptor, double expireTime)
69 : m_function(function)
70 , m_timerFileDescriptor(timerFileDescriptor)
71 , m_expireTime(expireTime)
72{
73}
74
75WorkQueue::TimerWorkItem::~TimerWorkItem()
76{
77 struct itimerspec timerValue;
78 timerValue.it_value.tv_sec = 0;
79 timerValue.it_value.tv_nsec = 0;
80 timerValue.it_interval.tv_sec = 0;
81 timerValue.it_interval.tv_nsec = 0;
82
83 if (m_timerFileDescriptor < 0)
84 return;
85
86 if (timerfd_settime(m_timerFileDescriptor, 0, &timerValue, 0) == -1)
87 LOG_ERROR("Failed to clear timerfd(%d)", m_timerFileDescriptor);
88 close(m_timerFileDescriptor);
89}