ike_sa: Defer task manager destruction after child destruction
This patch exports the task manager's flush to allow flushing of all
queues with one function call from ike_sa->destroy. It allows the
access of intact children during task destructoin (see git-commit
e44ebdcf) and allows the access of the task manager in
child_state_change hook.
Signed-off-by: Thomas Egerer <[email protected]>
This commit is contained in:
committed by
Martin Willi
parent
800b361e19
commit
b190899473
@@ -2138,7 +2138,10 @@ METHOD(ike_sa_t, destroy, void,
|
|||||||
charon->bus->set_sa(charon->bus, &this->public);
|
charon->bus->set_sa(charon->bus, &this->public);
|
||||||
|
|
||||||
set_state(this, IKE_DESTROYING);
|
set_state(this, IKE_DESTROYING);
|
||||||
DESTROY_IF(this->task_manager);
|
if (this->task_manager)
|
||||||
|
{
|
||||||
|
this->task_manager->flush(this->task_manager);
|
||||||
|
}
|
||||||
|
|
||||||
/* remove attributes first, as we pass the IKE_SA to the handler */
|
/* remove attributes first, as we pass the IKE_SA to the handler */
|
||||||
while (array_remove(this->attributes, ARRAY_TAIL, &entry))
|
while (array_remove(this->attributes, ARRAY_TAIL, &entry))
|
||||||
@@ -2182,6 +2185,7 @@ METHOD(ike_sa_t, destroy, void,
|
|||||||
charon->bus->set_sa(charon->bus, NULL);
|
charon->bus->set_sa(charon->bus, NULL);
|
||||||
|
|
||||||
array_destroy(this->child_sas);
|
array_destroy(this->child_sas);
|
||||||
|
DESTROY_IF(this->task_manager);
|
||||||
DESTROY_IF(this->keymat);
|
DESTROY_IF(this->keymat);
|
||||||
array_destroy(this->attributes);
|
array_destroy(this->attributes);
|
||||||
array_destroy(this->my_vips);
|
array_destroy(this->my_vips);
|
||||||
|
|||||||
@@ -339,10 +339,8 @@ METHOD(task_manager_t, flush_queue, void,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
METHOD(task_manager_t, flush, void,
|
||||||
* flush all tasks in the task manager
|
private_task_manager_t *this)
|
||||||
*/
|
|
||||||
static void flush(private_task_manager_t *this)
|
|
||||||
{
|
{
|
||||||
flush_queue(this, TASK_QUEUE_QUEUED);
|
flush_queue(this, TASK_QUEUE_QUEUED);
|
||||||
flush_queue(this, TASK_QUEUE_PASSIVE);
|
flush_queue(this, TASK_QUEUE_PASSIVE);
|
||||||
@@ -2070,6 +2068,7 @@ task_manager_v1_t *task_manager_v1_create(ike_sa_t *ike_sa)
|
|||||||
.adopt_child_tasks = _adopt_child_tasks,
|
.adopt_child_tasks = _adopt_child_tasks,
|
||||||
.busy = _busy,
|
.busy = _busy,
|
||||||
.create_task_enumerator = _create_task_enumerator,
|
.create_task_enumerator = _create_task_enumerator,
|
||||||
|
.flush = _flush,
|
||||||
.flush_queue = _flush_queue,
|
.flush_queue = _flush_queue,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -184,10 +184,8 @@ METHOD(task_manager_t, flush_queue, void,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
METHOD(task_manager_t, flush, void,
|
||||||
* flush all tasks in the task manager
|
private_task_manager_t *this)
|
||||||
*/
|
|
||||||
static void flush(private_task_manager_t *this)
|
|
||||||
{
|
{
|
||||||
flush_queue(this, TASK_QUEUE_QUEUED);
|
flush_queue(this, TASK_QUEUE_QUEUED);
|
||||||
flush_queue(this, TASK_QUEUE_PASSIVE);
|
flush_queue(this, TASK_QUEUE_PASSIVE);
|
||||||
@@ -1569,6 +1567,7 @@ task_manager_v2_t *task_manager_v2_create(ike_sa_t *ike_sa)
|
|||||||
.adopt_child_tasks = _adopt_child_tasks,
|
.adopt_child_tasks = _adopt_child_tasks,
|
||||||
.busy = _busy,
|
.busy = _busy,
|
||||||
.create_task_enumerator = _create_task_enumerator,
|
.create_task_enumerator = _create_task_enumerator,
|
||||||
|
.flush = _flush,
|
||||||
.flush_queue = _flush_queue,
|
.flush_queue = _flush_queue,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -260,6 +260,11 @@ struct task_manager_t {
|
|||||||
enumerator_t* (*create_task_enumerator)(task_manager_t *this,
|
enumerator_t* (*create_task_enumerator)(task_manager_t *this,
|
||||||
task_queue_t queue);
|
task_queue_t queue);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flush all tasks, regardless of the queue.
|
||||||
|
*/
|
||||||
|
void (*flush)(task_manager_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flush a queue, cancelling all tasks.
|
* Flush a queue, cancelling all tasks.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user