41 #include <ldns/ldns.h>
43 static const char* schedule_str =
"scheduler";
55 ods_log_error(
"[%s] unable to create: no allocator available",
64 ods_log_error(
"[%s] unable to create: allocator failed", schedule_str);
85 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
89 if (!schedule || !schedule->
tasks) {
95 node = ldns_rbtree_first(schedule->
tasks);
96 while (node && node != LDNS_RBTREE_NULL) {
101 task->
what =
override;
103 node = ldns_rbtree_next(node);
113 static ldns_rbnode_t*
116 ldns_rbnode_t* node = (ldns_rbnode_t*) malloc(
sizeof(ldns_rbnode_t));
130 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
133 if (!schedule || !task) {
140 node = ldns_rbtree_search(schedule->
tasks, task);
141 if (node && node != LDNS_RBTREE_NULL) {
155 ldns_rbnode_t* new_node = NULL;
156 ldns_rbnode_t* ins_node = NULL;
159 ods_log_error(
"[%s] unable to schedule task: no task", schedule_str);
171 ods_log_debug(
"[%s] schedule task %s for zone %s", schedule_str,
174 ods_log_error(
"[%s] unable to schedule task %s for zone %s: "
179 new_node = task2node(task);
180 ins_node = ldns_rbtree_insert(schedule->
tasks, new_node);
182 ods_log_error(
"[%s] unable to schedule task %s for zone %s: "
185 free((
void*)new_node);
205 ldns_rbnode_t* del_node = LDNS_RBTREE_NULL;
223 del_node = ldns_rbtree_delete(schedule->
tasks, (
const void*) task);
226 free((
void*)del_node);
233 if (del_task->
flush) {
259 del_task->
what = what;
260 del_task->
when = when;
272 ldns_rbnode_t* first_node = LDNS_RBTREE_NULL;
273 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
282 first_node = ldns_rbtree_first(schedule->
tasks);
290 while (node && node != LDNS_RBTREE_NULL) {
295 node = ldns_rbtree_next(node);
299 "find flush-task, while there should be %i flush-tasks left",
301 ods_log_info(
"[%s] reset flush count to 0", schedule_str);
321 ods_log_error(
"[%s] unable to pop task: no schedule", schedule_str);
329 if (pop && (pop->
flush || pop->
when <= now)) {
332 pop->
who?pop->
who:
"(null)");
335 pop->
who?pop->
who:
"(null)");
350 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
353 if (!out || !schedule || !schedule->
tasks) {
360 node = ldns_rbtree_first(schedule->
tasks);
361 while (node && node != LDNS_RBTREE_NULL) {
364 node = ldns_rbtree_next(node);
376 task_delfunc(ldns_rbnode_t* elem)
380 if (elem && elem != LDNS_RBTREE_NULL) {
382 task_delfunc(elem->left);
383 task_delfunc(elem->right);
405 if (schedule->
tasks) {
406 task_delfunc(schedule->
tasks->root);
407 ldns_rbtree_free(schedule->
tasks);
408 schedule->
tasks = NULL;