38 #include <ldns/ldns.h> 40 static const char* schedule_str =
"scheduler";
53 ods_log_error(
"[%s] unable to create schedule: allocator_alloc() " 54 "failed", schedule_str);
60 if (!schedule->
tasks) {
61 ods_log_error(
"[%s] unable to create schedule: ldns_rbtree_create() " 62 "failed", schedule_str);
78 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
81 ods_log_debug(
"[%s] flush all tasks", schedule_str);
82 if (!schedule || !schedule->
tasks) {
85 node = ldns_rbtree_first(schedule->
tasks);
86 while (node && node != LDNS_RBTREE_NULL) {
91 task->
what =
override;
93 node = ldns_rbtree_next(node);
102 static ldns_rbnode_t*
105 ldns_rbnode_t* node = (ldns_rbnode_t*) malloc(
sizeof(ldns_rbnode_t));
121 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
123 if (!schedule || !task) {
126 ods_log_assert(schedule->
tasks);
127 node = ldns_rbtree_search(schedule->
tasks, task);
128 if (node && node != LDNS_RBTREE_NULL) {
142 ldns_rbnode_t* new_node = NULL;
143 ldns_rbnode_t* ins_node = NULL;
144 if (!task || !schedule || !schedule->
tasks) {
145 return ODS_STATUS_ASSERT_ERR;
147 ods_log_debug(
"[%s] schedule task %s for zone %s", schedule_str,
150 ods_log_error(
"[%s] unable to schedule task %s for zone %s: " 153 return ODS_STATUS_ERR;
155 new_node = task2node(task);
157 ods_log_error(
"[%s] unable to schedule task %s for zone %s: " 160 return ODS_STATUS_MALLOC_ERR;
162 ins_node = ldns_rbtree_insert(schedule->
tasks, new_node);
164 ods_log_error(
"[%s] unable to schedule task %s for zone %s: " 167 free((
void*)new_node);
168 return ODS_STATUS_ERR;
176 return ODS_STATUS_OK;
187 ldns_rbnode_t* del_node = LDNS_RBTREE_NULL;
189 if (!task || !schedule || !schedule->
tasks) {
192 ods_log_debug(
"[%s] unschedule task %s for zone %s",
194 del_node = ldns_rbtree_delete(schedule->
tasks, (
const void*) task);
197 free((
void*)del_node);
199 ods_log_warning(
"[%s] unable to unschedule task %s for zone %s: not " 204 if (del_task->
flush) {
219 ldns_rbnode_t* first_node = LDNS_RBTREE_NULL;
220 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
222 if (!schedule || !schedule->
tasks) {
225 first_node = ldns_rbtree_first(schedule->
tasks);
232 while (node && node != LDNS_RBTREE_NULL) {
237 node = ldns_rbtree_next(node);
240 ods_log_warning(
"[%s] unable to get first scheduled task: could not " 241 "find flush-task, while there should be %i flush-tasks left",
243 ods_log_info(
"[%s] reset flush count to 0", schedule_str);
261 if (!schedule || !schedule->
tasks) {
266 if (pop && (pop->
flush || pop->
when <= now)) {
268 ods_log_debug(
"[%s] flush task for zone %s", schedule_str,
271 ods_log_debug(
"[%s] pop task for zone %s", schedule_str,
285 task_delfunc(ldns_rbnode_t* elem)
289 if (elem && elem != LDNS_RBTREE_NULL) {
291 task_delfunc(elem->left);
292 task_delfunc(elem->right);
309 ods_log_debug(
"[%s] cleanup schedule", schedule_str);
310 if (schedule->
tasks) {
311 task_delfunc(schedule->
tasks->root);
312 ldns_rbtree_free(schedule->
tasks);
313 schedule->
tasks = NULL;
schedule_type * schedule_create()
task_type * schedule_get_first_task(schedule_type *schedule)
void task_log(task_type *task)
ods_status schedule_task(schedule_type *schedule, task_type *task, int log)
const char * task_who2str(task_type *task)
void schedule_flush(schedule_type *schedule, task_id override)
task_type * schedule_lookup_task(schedule_type *schedule, task_type *task)
enum task_id_enum task_id
task_type * schedule_pop_task(schedule_type *schedule)
void task_cleanup(task_type *task)
task_type * unschedule_task(schedule_type *schedule, task_type *task)
void schedule_cleanup(schedule_type *schedule)
int task_compare(const void *a, const void *b)
lock_basic_type schedule_lock
const char * task_what2str(task_id what)