aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2012-05-02 09:03:23 +0200
committerMartin Willi <martin@revosec.ch>2012-05-02 10:22:59 +0200
commitf99d8b10c9f5b5024b4b1e5f5d1e56e2519cdadc (patch)
treec675eb2564affb806336942de5387ad2ad668c0b /src
parent13de38e354c055b2c8a5e95fc2e1cb793782bf27 (diff)
downloadstrongswan-f99d8b10c9f5b5024b4b1e5f5d1e56e2519cdadc.tar.bz2
strongswan-f99d8b10c9f5b5024b4b1e5f5d1e56e2519cdadc.tar.xz
Added a dedicated sender flush method, delay sender destruction until users gone
Diffstat (limited to 'src')
-rw-r--r--src/libcharon/daemon.c6
-rw-r--r--src/libcharon/network/sender.c10
-rw-r--r--src/libcharon/network/sender.h7
3 files changed, 20 insertions, 3 deletions
diff --git a/src/libcharon/daemon.c b/src/libcharon/daemon.c
index 3fb49d475..f2c054a12 100644
--- a/src/libcharon/daemon.c
+++ b/src/libcharon/daemon.c
@@ -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 */
diff --git a/src/libcharon/network/sender.c b/src/libcharon/network/sender.c
index 4df930b15..6d5ad8f2a 100644
--- a/src/libcharon/network/sender.c
+++ b/src/libcharon/network/sender.c
@@ -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(),
diff --git a/src/libcharon/network/sender.h b/src/libcharon/network/sender.h
index f77fadab2..6ee070435 100644
--- a/src/libcharon/network/sender.h
+++ b/src/libcharon/network/sender.h
@@ -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);