OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
task_timer_api.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <string>
6 #include "base/timer.h"
7 
8 #include "task_map.h"
9 #include "task_timer_map.h"
10 
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14 #include "task_timer_api.h"
15 #ifdef __cplusplus
16 }
17 #endif
18 
19 extern bool task_timer_callback(void *agent_timer_map);
20 extern bool task_timer_cleanup(void *data);
21 
23 {
24  tp->cleanup_timer = NULL;
26 }
27 
29 {
30  TaskMap *agent_task = (TaskMap *)tp->agent_task;
31 
32  Timer * cleanup_timer;
33  cleanup_timer = TimerManager::CreateTimer(agent_task->io_,
34  "Cleanup Timer",
36  GetTaskId(agent_task->name_),
37  agent_task->instance_, true);
38  tp->cleanup_timer = (void *)cleanup_timer;
39  cleanup_timer->Start(0, boost::bind(task_timer_cleanup, tp));
40 }
41 
43  flag_t flags, task_timer *parent,
44  timer_callback tjob, void *data)
45 {
46  task_timer *timer = (task_timer *)malloc(sizeof(task_timer));
47  if (!timer) {
48  return NULL;
49  }
50 
51  TaskMap *agent_task = (TaskMap *)tp->agent_task;
52  TimerMap *timer_map = new TimerMap();
53 
54  timer_map->timer_name_ = name;
55  timer_map->timer_ = timer;
56  timer_map->agent_timer_ = TimerManager::CreateTimer(agent_task->io_,
57  timer_map->timer_name_,
59  GetTaskId(agent_task->name_),
60  agent_task->instance_, false);
61 
62  timer->tp = tp;
63  timer->callback = tjob;
64  timer->agent_timer_map = timer_map;
65  timer->tdata = data;
66 
67  return timer;
68 }
69 
71 {
72  TimerMap *timer_map = (TimerMap *)timer->agent_timer_map;
73 
74  if (!TimerManager::DeleteTimer(timer_map->agent_timer_)) {
76  &timer->deleted_entry);
78  return;
79  }
80 
81  delete timer_map;
82 
83  free(timer);
84 
85  return;
86 }
87 
89 {
90  return;
91 }
92 
94  task_timer *timer, utime_t *offset, u_int jitter)
95 {
96  TimerMap *timer_map = (TimerMap *)timer->agent_timer_map;
97 
98  Timer *agent_timer = timer_map->agent_timer_;
99 
100  timer->timeout = offset->ut_sec*1000 + offset->ut_usec/1000;
101 
102  task_timer_reset(timer);
103  // If running in the timer context, Agent Timer cannot be started
104  // again. Will inform Agent Timer to restart based on the 'oneshot'
105  // and 'rescheduled' flags in the function 'task_timer_callback'.
106  if (agent_timer->fired()) {
107  agent_timer->Reschedule(timer->timeout);
108  timer->rescheduled = TRUE;
109  } else {
110  agent_timer->Start(timer->timeout,
111  boost::bind(task_timer_callback, timer_map));
112  }
113 
114  timer->oneshot = TRUE;
115 
116  return;
117 }
118 
120 {
121  TimerMap *timer_map = (TimerMap *)timer->agent_timer_map;
122  Timer *agent_timer = (Timer *)timer_map->agent_timer_;
123 
124  agent_timer->Cancel();
125 
126  return;
127 }
128 
130 {
131  return NULL;
132 }
133 
135 {
136  return timer->tdata;
137 }
138 
139 void task_timer_utime_left(task_timer *timer, utime_t *remaining)
140 {
141  TimerMap *timer_map = (TimerMap *)timer->agent_timer_map;
142  Timer *agent_timer = (Timer *)timer_map->agent_timer_;
143 
144  int elapsed = timer->timeout - agent_timer->GetElapsedTime();
145 
146  remaining->ut_usec = elapsed*1000;
147  remaining->ut_sec = 0;
148 
149  return;
150 }
151 
153 {
154  TimerMap *timer_map = (TimerMap *)timer->agent_timer_map;
155  Timer *agent_timer = (Timer *)timer_map->agent_timer_;
156 
157  return agent_timer->running() ? TRUE : FALSE;
158 }
159 
160 bool task_timer_callback(void *agent_timer_map)
161 {
162  TimerMap *timer_map = (TimerMap *)agent_timer_map;
163  task_timer *timer = (task_timer *)timer_map->timer_;
164 
165  timer->callback(timer, 0);
166  bool reschedule = false;
167  if (timer->rescheduled == TRUE) {
168  reschedule = true;
169  timer->rescheduled = FALSE;
170  }
171  if (!reschedule) {
172  reschedule = (!timer->oneshot ? true : false);
173  }
174 
175  return reschedule;
176 }
177 
178 bool task_timer_cleanup(void *data)
179 {
180  task *tp = (task *)data;
181  task_timer *timer = NULL;
182  task_thread *thread_ptr = NULL;
183 
184  while (TRUE) {
185  thread_ptr = thread_circular_top(&tp->deleted_timers);
186  if (!thread_ptr) break;
187 
188  timer = task_timer_list_entry(thread_ptr);
189  thread_remove(thread_ptr);
190  TimerMap *timer_map = (TimerMap *)timer->agent_timer_map;
191  if (!TimerManager::DeleteTimer(timer_map->agent_timer_)) {
192  assert(0);
193  }
194  delete timer_map;
195 
196  free(timer);
197  }
198 
199  tp->cleanup_timer = NULL;
200  return false;
201 }
202 
Timer * agent_timer_
const std::string & name_
Definition: task_map.h:19
#define TRUE
Definition: mcast_common.h:15
void * task_timer_data(task_timer *timer)
void task_timer_delete(task_timer *timer)
bool task_timer_callback(void *agent_timer_map)
task_thread * thread_circular_top(task_thread *head)
void task_timer_init(task *tp)
task_timer * task_timer_create_idle_leaf(task *tp, const char *name, flag_t flags, task_timer *parent, timer_callback tjob, void *data)
void task_timer_reset(task_timer *timer)
Definition: task_int.h:10
bool task_timer_cleanup(void *data)
#define FALSE
Definition: mcast_common.h:14
void(* timer_callback)(task_timer *, time_t)
void * timer_
void task_timer_uset_alt_root_auto_parent_oneshot(task_timer_root *root, task_timer *timer, utime_t *offset, u_int jitter)
time_t ut_sec
static TaskScheduler * GetInstance()
Definition: task.cc:547
unsigned long flag_t
Definition: mcast_common.h:12
timer_callback callback
void * agent_timer_map
task_thread deleted_timers
Definition: task_int.h:13
void task_timer_utime_left(task_timer *timer, utime_t *remaining)
std::string timer_name_
static Timer * CreateTimer(boost::asio::io_context &service, const std::string &name, int task_id=Timer::GetTimerTaskId(), int task_instance=Timer::GetTimerInstanceId(), bool delete_on_completion=false)
Definition: timer.cc:201
void task_timer_smear_auto_parent_timers(task_timer_root *root)
void * agent_task
Definition: task_int.h:11
bool Cancel()
Definition: timer.cc:150
void * cleanup_timer
Definition: task_int.h:12
task_timer_root * task_timer_get_auto_parent_root(void)
void thread_new_circular_thread(task_thread *head)
void thread_circular_add_top(task_thread *head, task_thread *node)
void thread_remove(task_thread *node)
boolean rescheduled
bool running() const
Definition: timer.h:86
boolean task_timer_running(task_timer *timer)
void task_timer_cleanup_deleted(task *tp)
Definition: timer.h:54
boost::asio::io_context & io_
Definition: task_map.h:21
int instance_
Definition: task_map.h:20
time_t ut_usec
boolean oneshot
task_thread deleted_entry
static bool DeleteTimer(Timer *Timer)
Definition: timer.cc:222