aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2006-05-24 09:02:39 +0000
committerMartin Willi <martin@strongswan.org>2006-05-24 09:02:39 +0000
commitb82908b8b585e87b7405c43774b433b927768a95 (patch)
tree898f4e60c5b4d208304ae09ac18ed07da9aa9590 /src
parenta13448dd2db8a663be2b8dbb06f629f4a5b58fe3 (diff)
downloadstrongswan-b82908b8b585e87b7405c43774b433b927768a95.tar.bz2
strongswan-b82908b8b585e87b7405c43774b433b927768a95.tar.xz
- initiate IKE_SA deletion befor manager destruction
Diffstat (limited to 'src')
-rw-r--r--src/charon/sa/ike_sa_manager.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/charon/sa/ike_sa_manager.c b/src/charon/sa/ike_sa_manager.c
index 2d53ba15b..bc8cad888 100644
--- a/src/charon/sa/ike_sa_manager.c
+++ b/src/charon/sa/ike_sa_manager.c
@@ -776,12 +776,12 @@ static void destroy(private_ike_sa_manager_t *this)
pthread_mutex_lock(&(this->mutex));
- this->logger->log(this->logger,CONTROL | LEVEL1,"Going to destroy IKE_SA manager and all managed IKE_SA's");
+ this->logger->log(this->logger, CONTROL|LEVEL1, "Going to destroy IKE_SA manager and all managed IKE_SA's");
/* Step 1: drive out all waiting threads */
iterator = list->create_iterator(list, TRUE);
- this->logger->log(this->logger,CONTROL | LEVEL2,"Set driveout flags for all stored IKE_SA's");
+ this->logger->log(this->logger, CONTROL|LEVEL2, "Set driveout flags for all stored IKE_SA's");
while (iterator->has_next(iterator))
{
iterator->current(iterator, (void**)&entry);
@@ -790,7 +790,7 @@ static void destroy(private_ike_sa_manager_t *this)
entry->driveout_waiting_threads = TRUE;
}
- this->logger->log(this->logger,CONTROL | LEVEL2,"Wait for all threads to leave IKE_SA's");
+ this->logger->log(this->logger, CONTROL|LEVEL2, "Wait for all threads to leave IKE_SA's");
/* Step 2: wait until all are gone */
iterator->reset(iterator);
while (iterator->has_next(iterator))
@@ -804,17 +804,24 @@ static void destroy(private_ike_sa_manager_t *this)
pthread_cond_wait(&(entry->condvar), &(this->mutex));
}
}
- this->logger->log(this->logger,CONTROL | LEVEL2,"Delete all IKE_SA's");
- /* Step 3: delete all entries */
+ this->logger->log(this->logger, CONTROL|LEVEL2, "Delete all IKE_SA's");
+ /* Step 3: initiate deletion of all IKE_SAs */
+ iterator->reset(iterator);
+ while (iterator->has_next(iterator))
+ {
+ iterator->current(iterator, (void**)&entry);
+ entry->ike_sa->delete(entry->ike_sa);
+ }
iterator->destroy(iterator);
-
+
+ this->logger->log(this->logger, CONTROL|LEVEL2, "Destroy all entries");
+ /* Step 4: destroy all entries */
while (list->get_count(list) > 0)
{
list->get_first(list, (void**)&entry);
this->delete_entry(this, entry);
}
list->destroy(list);
- this->logger->log(this->logger,CONTROL | LEVEL2,"IKE_SA's deleted");
pthread_mutex_unlock(&(this->mutex));
this->randomizer->destroy(this->randomizer);