u_int32_t dpd_recv;
};
-/**
- * Flush a single task queue
- */
-static void flush_queue(private_task_manager_t *this, linked_list_t *list)
+METHOD(task_manager_t, flush_queue, void,
+ private_task_manager_t *this, task_queue_t queue)
{
+ linked_list_t *list;
task_t *task;
if (this->queued)
this->queued->destroy(this->queued);
this->queued = NULL;
}
+ switch (queue)
+ {
+ case TASK_QUEUE_ACTIVE:
+ list = this->active_tasks;
+ break;
+ case TASK_QUEUE_PASSIVE:
+ list = this->passive_tasks;
+ break;
+ case TASK_QUEUE_QUEUED:
+ list = this->queued_tasks;
+ break;
+ default:
+ return;
+ }
while (list->remove_last(list, (void**)&task) == SUCCESS)
{
task->destroy(task);
*/
static void flush(private_task_manager_t *this)
{
- flush_queue(this, this->queued_tasks);
- flush_queue(this, this->passive_tasks);
- flush_queue(this, this->active_tasks);
+ flush_queue(this, TASK_QUEUE_QUEUED);
+ flush_queue(this, TASK_QUEUE_PASSIVE);
+ flush_queue(this, TASK_QUEUE_ACTIVE);
}
/**
/* processed, but task needs another exchange */
continue;
case ALREADY_DONE:
- flush_queue(this, this->active_tasks);
+ flush_queue(this, TASK_QUEUE_ACTIVE);
flushed = TRUE;
break;
case FAILED:
}
continue;
case ALREADY_DONE:
- flush_queue(this, this->passive_tasks);
+ flush_queue(this, TASK_QUEUE_PASSIVE);
flushed = TRUE;
break;
case FAILED:
continue;
case ALREADY_DONE:
send_response = FALSE;
- flush_queue(this, this->passive_tasks);
+ flush_queue(this, TASK_QUEUE_PASSIVE);
break;
case FAILED:
default:
/* processed, but task needs another exchange */
continue;
case ALREADY_DONE:
- flush_queue(this, this->active_tasks);
+ flush_queue(this, TASK_QUEUE_ACTIVE);
break;
case FAILED:
default:
.adopt_tasks = _adopt_tasks,
.busy = _busy,
.create_task_enumerator = _create_task_enumerator,
+ .flush_queue = _flush_queue,
.destroy = _destroy,
},
},
double retransmit_base;
};
+METHOD(task_manager_t, flush_queue, void,
+ private_task_manager_t *this, task_queue_t queue)
+{
+ linked_list_t *list;
+ task_t *task;
+
+ switch (queue)
+ {
+ case TASK_QUEUE_ACTIVE:
+ list = this->active_tasks;
+ break;
+ case TASK_QUEUE_PASSIVE:
+ list = this->passive_tasks;
+ break;
+ case TASK_QUEUE_QUEUED:
+ list = this->queued_tasks;
+ break;
+ default:
+ return;
+ }
+ while (list->remove_last(list, (void**)&task) == SUCCESS)
+ {
+ task->destroy(task);
+ }
+}
+
/**
* flush all tasks in the task manager
*/
static void flush(private_task_manager_t *this)
{
- this->passive_tasks->destroy_offset(this->passive_tasks,
- offsetof(task_t, destroy));
- this->passive_tasks = linked_list_create();
- this->active_tasks->destroy_offset(this->active_tasks,
- offsetof(task_t, destroy));
- this->active_tasks = linked_list_create();
- this->queued_tasks->destroy_offset(this->queued_tasks,
- offsetof(task_t, destroy));
- this->queued_tasks = linked_list_create();
+ flush_queue(this, TASK_QUEUE_QUEUED);
+ flush_queue(this, TASK_QUEUE_PASSIVE);
+ flush_queue(this, TASK_QUEUE_ACTIVE);
}
/**
.adopt_tasks = _adopt_tasks,
.busy = _busy,
.create_task_enumerator = _create_task_enumerator,
+ .flush_queue = _flush_queue,
.destroy = _destroy,
},
},