Added a dedicated sender flush method, delay sender destruction until users gone
authorMartin Willi <martin@revosec.ch>
Wed, 2 May 2012 07:03:23 +0000 (09:03 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 2 May 2012 08:22:59 +0000 (10:22 +0200)
src/libcharon/daemon.c
src/libcharon/network/sender.c
src/libcharon/network/sender.h

index 3fb49d4..f2c054a 100644 (file)
@@ -109,8 +109,11 @@ static void destroy(private_daemon_t *this)
        {
                this->public.traps->flush(this->public.traps);
        }
+       if (this->public.sender)
+       {
+               this->public.sender->flush(this->public.sender);
+       }
        DESTROY_IF(this->public.receiver);
-       DESTROY_IF(this->public.sender);
 #ifdef ME
        DESTROY_IF(this->public.connect_manager);
        DESTROY_IF(this->public.mediation_manager);
@@ -129,6 +132,7 @@ static void destroy(private_daemon_t *this)
        DESTROY_IF(this->public.controller);
        DESTROY_IF(this->public.eap);
        DESTROY_IF(this->public.backends);
+       DESTROY_IF(this->public.sender);
        DESTROY_IF(this->public.socket);
 
        /* rehook library logging, shutdown logging */
index 4df930b..6d5ad8f 100644 (file)
@@ -149,7 +149,7 @@ static job_requeue_t send_packets(private_sender_t * this)
        return JOB_REQUEUE_DIRECT;
 }
 
-METHOD(sender_t, destroy, void,
+METHOD(sender_t, flush, void,
        private_sender_t *this)
 {
        /* send all packets in the queue */
@@ -159,8 +159,13 @@ METHOD(sender_t, destroy, void,
                this->sent->wait(this->sent, this->mutex);
        }
        this->mutex->unlock(this->mutex);
+}
+
+METHOD(sender_t, destroy, void,
+       private_sender_t *this)
+{
        this->job->cancel(this->job);
-       this->list->destroy(this->list);
+       this->list->destroy_offset(this->list, offsetof(packet_t, destroy));
        this->got->destroy(this->got);
        this->sent->destroy(this->sent);
        this->mutex->destroy(this->mutex);
@@ -177,6 +182,7 @@ sender_t * sender_create()
        INIT(this,
                .public = {
                        .send = _send_,
+                       .flush = _flush,
                        .destroy = _destroy,
                },
                .list = linked_list_create(),
index f77fada..6ee0704 100644 (file)
@@ -44,6 +44,13 @@ struct sender_t {
        void (*send) (sender_t *this, packet_t *packet);
 
        /**
+        * Enforce a flush of the send queue.
+        *
+        * This function blocks until all queued packets have been sent.
+        */
+       void (*flush)(sender_t *this);
+
+       /**
         * Destroys a sender object.
         */
        void (*destroy) (sender_t *this);