diff options
author | Martin Willi <martin@revosec.ch> | 2012-05-02 09:03:23 +0200 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2012-05-02 10:22:59 +0200 |
commit | f99d8b10c9f5b5024b4b1e5f5d1e56e2519cdadc (patch) | |
tree | c675eb2564affb806336942de5387ad2ad668c0b /src | |
parent | 13de38e354c055b2c8a5e95fc2e1cb793782bf27 (diff) | |
download | strongswan-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.c | 6 | ||||
-rw-r--r-- | src/libcharon/network/sender.c | 10 | ||||
-rw-r--r-- | src/libcharon/network/sender.h | 7 |
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); |