ike_sa: Defer task manager destruction after child destruction
authorThomas Egerer <thomas.egerer@secunet.com>
Thu, 16 Jan 2014 12:24:08 +0000 (13:24 +0100)
committerMartin Willi <martin@revosec.ch>
Thu, 16 Jan 2014 13:16:13 +0000 (14:16 +0100)
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 <thomas.egerer@secunet.com>
src/libcharon/sa/ike_sa.c
src/libcharon/sa/ikev1/task_manager_v1.c
src/libcharon/sa/ikev2/task_manager_v2.c
src/libcharon/sa/task_manager.h

index d482f8b..000e68f 100644 (file)
@@ -2138,7 +2138,10 @@ METHOD(ike_sa_t, destroy, void,
        charon->bus->set_sa(charon->bus, &this->public);
 
        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 */
        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);
 
        array_destroy(this->child_sas);
+       DESTROY_IF(this->task_manager);
        DESTROY_IF(this->keymat);
        array_destroy(this->attributes);
        array_destroy(this->my_vips);
index 597416e..131d812 100644 (file)
@@ -339,10 +339,8 @@ METHOD(task_manager_t, flush_queue, void,
        }
 }
 
-/**
- * flush all tasks in the task manager
- */
-static void flush(private_task_manager_t *this)
+METHOD(task_manager_t, flush, void,
+       private_task_manager_t *this)
 {
        flush_queue(this, TASK_QUEUE_QUEUED);
        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,
                                .busy = _busy,
                                .create_task_enumerator = _create_task_enumerator,
+                               .flush = _flush,
                                .flush_queue = _flush_queue,
                                .destroy = _destroy,
                        },
index 8e6da16..6ce9ba8 100644 (file)
@@ -184,10 +184,8 @@ METHOD(task_manager_t, flush_queue, void,
        }
 }
 
-/**
- * flush all tasks in the task manager
- */
-static void flush(private_task_manager_t *this)
+METHOD(task_manager_t, flush, void,
+       private_task_manager_t *this)
 {
        flush_queue(this, TASK_QUEUE_QUEUED);
        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,
                                .busy = _busy,
                                .create_task_enumerator = _create_task_enumerator,
+                               .flush = _flush,
                                .flush_queue = _flush_queue,
                                .destroy = _destroy,
                        },
index a1ebb41..e7a6bf4 100644 (file)
@@ -261,6 +261,11 @@ struct task_manager_t {
                                                                                        task_queue_t queue);
 
        /**
+        * Flush all tasks, regardless of the queue.
+        */
+       void (*flush)(task_manager_t *this);
+
+       /**
         * Flush a queue, cancelling all tasks.
         *
         * @param queue                 queue to flush