timers.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MPL-2.0 */
2 
3 #include "precompiled.hpp"
4 #include "timers.hpp"
5 #include "err.hpp"
6 
7 #include <algorithm>
8 
9 zmq::timers_t::timers_t () : _tag (0xCAFEDADA), _next_timer_id (0)
10 {
11 }
12 
14 {
15  // Mark the timers as dead
16  _tag = 0xdeadbeef;
17 }
18 
20 {
21  return _tag == 0xCAFEDADA;
22 }
23 
24 int zmq::timers_t::add (size_t interval_, timers_timer_fn handler_, void *arg_)
25 {
26  if (handler_ == NULL) {
27  errno = EFAULT;
28  return -1;
29  }
30 
31  uint64_t when = _clock.now_ms () + interval_;
32  timer_t timer = {++_next_timer_id, interval_, handler_, arg_};
33  _timers.insert (timersmap_t::value_type (when, timer));
34 
35  return timer.timer_id;
36 }
37 
39 {
40  match_by_id (int timer_id_) : _timer_id (timer_id_) {}
41 
42  bool operator() (timersmap_t::value_type const &entry_) const
43  {
44  return entry_.second.timer_id == _timer_id;
45  }
46 
47  private:
48  int _timer_id;
49 };
50 
51 int zmq::timers_t::cancel (int timer_id_)
52 {
53  // check first if timer exists at all
54  if (_timers.end ()
55  == std::find_if (_timers.begin (), _timers.end (),
56  match_by_id (timer_id_))) {
57  errno = EINVAL;
58  return -1;
59  }
60 
61  // check if timer was already canceled
62  if (_cancelled_timers.count (timer_id_)) {
63  errno = EINVAL;
64  return -1;
65  }
66 
67  _cancelled_timers.insert (timer_id_);
68 
69  return 0;
70 }
71 
72 int zmq::timers_t::set_interval (int timer_id_, size_t interval_)
73 {
74  const timersmap_t::iterator end = _timers.end ();
75  const timersmap_t::iterator it =
76  std::find_if (_timers.begin (), end, match_by_id (timer_id_));
77  if (it != end) {
78  timer_t timer = it->second;
79  timer.interval = interval_;
80  uint64_t when = _clock.now_ms () + interval_;
81  _timers.erase (it);
82  _timers.insert (timersmap_t::value_type (when, timer));
83 
84  return 0;
85  }
86 
87  errno = EINVAL;
88  return -1;
89 }
90 
91 int zmq::timers_t::reset (int timer_id_)
92 {
93  const timersmap_t::iterator end = _timers.end ();
94  const timersmap_t::iterator it =
95  std::find_if (_timers.begin (), end, match_by_id (timer_id_));
96  if (it != end) {
97  timer_t timer = it->second;
98  uint64_t when = _clock.now_ms () + timer.interval;
99  _timers.erase (it);
100  _timers.insert (timersmap_t::value_type (when, timer));
101 
102  return 0;
103  }
104 
105  errno = EINVAL;
106  return -1;
107 }
108 
110 {
111  const uint64_t now = _clock.now_ms ();
112  long res = -1;
113 
114  const timersmap_t::iterator begin = _timers.begin ();
115  const timersmap_t::iterator end = _timers.end ();
116  timersmap_t::iterator it = begin;
117  for (; it != end; ++it) {
118  if (0 == _cancelled_timers.erase (it->second.timer_id)) {
119  // Live timer, lets return the timeout
120  res = std::max (static_cast<long> (it->first - now), 0l);
121  break;
122  }
123  }
124 
125  // Remove timed-out timers
126  _timers.erase (begin, it);
127 
128  return res;
129 }
130 
132 {
133  const uint64_t now = _clock.now_ms ();
134 
135  const timersmap_t::iterator begin = _timers.begin ();
136  const timersmap_t::iterator end = _timers.end ();
137  timersmap_t::iterator it = _timers.begin ();
138  for (; it != end; ++it) {
139  if (0 == _cancelled_timers.erase (it->second.timer_id)) {
140  // Timer is not cancelled
141 
142  // Map is ordered, if we have to wait for current timer we can stop.
143  if (it->first > now)
144  break;
145 
146  const timer_t &timer = it->second;
147 
148  timer.handler (timer.timer_id, timer.arg);
149 
150  _timers.insert (
151  timersmap_t::value_type (now + timer.interval, timer));
152  }
153  }
154  _timers.erase (begin, it);
155 
156  return 0;
157 }
zmq::timers_t::cancel
int cancel(int timer_id_)
Definition: timers.cpp:51
zmq::timers_t::timer_t::arg
void * arg
Definition: timers.hpp:66
zmq::timers_timer_fn
void() timers_timer_fn(int timer_id_, void *arg_)
Definition: timers.hpp:14
end
GLuint GLuint end
Definition: glcorearb.h:2858
NULL
NULL
Definition: test_security_zap.cpp:405
zmq::timers_t::set_interval
int set_interval(int timer_id_, size_t interval_)
Definition: timers.cpp:72
EINVAL
#define EINVAL
Definition: errno.hpp:25
zmq::timers_t::match_by_id::operator()
bool operator()(timersmap_t::value_type const &entry_) const
Definition: timers.cpp:42
precompiled.hpp
zmq::timers_t::timer_t::interval
size_t interval
Definition: timers.hpp:64
errno
int errno
zmq::timers_t::reset
int reset(int timer_id_)
Definition: timers.cpp:91
zmq::timers_t::timers_t
timers_t()
Definition: timers.cpp:9
zmq::timers_t::match_by_id
Definition: timers.cpp:38
begin
static size_t begin(const upb_table *t)
Definition: php/ext/google/protobuf/upb.c:4898
zmq::timers_t::~timers_t
~timers_t()
Definition: timers.cpp:13
zmq::timers_t::add
int add(size_t interval_, timers_timer_fn handler_, void *arg_)
Definition: timers.cpp:24
timers.hpp
zmq::timers_t::match_by_id::match_by_id
match_by_id(int timer_id_)
Definition: timers.cpp:40
zmq::timers_t::match_by_id::_timer_id
int _timer_id
Definition: timers.cpp:48
zmq::timers_t::execute
int execute()
Definition: timers.cpp:131
zmq::timers_t::timer_t::timer_id
int timer_id
Definition: timers.hpp:63
zmq::timers_t::timer_t
Definition: timers.hpp:61
value_type
zend_class_entry * value_type
Definition: php/ext/google/protobuf/message.c:2546
zmq::timers_t::timeout
long timeout()
Definition: timers.cpp:109
err.hpp
EFAULT
#define EFAULT
Definition: errno.hpp:17
it
MapIter it
Definition: php/ext/google/protobuf/map.c:205
zmq::timers_t::check_tag
bool check_tag() const
Definition: timers.cpp:19
zmq::timers_t::timer_t::handler
timers_timer_fn * handler
Definition: timers.hpp:65


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:07:00