Added a non-blocking, skipping variant of IKE_SA enumerator

This commit is contained in:
Martin Willi
2011-05-16 15:24:13 +02:00
parent 3f06403705
commit 69c3eca0e9
13 changed files with 65 additions and 28 deletions
+22 -5
View File
@@ -1238,10 +1238,10 @@ METHOD(ike_sa_manager_t, checkout_by_name, ike_sa_t*,
}
/**
* enumerator filter function
* enumerator filter function, waiting variant
*/
static bool enumerator_filter(private_ike_sa_manager_t *this,
entry_t **in, ike_sa_t **out, u_int *segment)
static bool enumerator_filter_wait(private_ike_sa_manager_t *this,
entry_t **in, ike_sa_t **out, u_int *segment)
{
if (wait_for_entry(this, *in, *segment))
{
@@ -1251,11 +1251,28 @@ static bool enumerator_filter(private_ike_sa_manager_t *this,
return FALSE;
}
/**
* enumerator filter function, skipping variant
*/
static bool enumerator_filter_skip(private_ike_sa_manager_t *this,
entry_t **in, ike_sa_t **out, u_int *segment)
{
if (!(*in)->driveout_new_threads &&
!(*in)->driveout_waiting_threads &&
!(*in)->checked_out)
{
*out = (*in)->ike_sa;
return TRUE;
}
return FALSE;
}
METHOD(ike_sa_manager_t, create_enumerator, enumerator_t*,
private_ike_sa_manager_t* this)
private_ike_sa_manager_t* this, bool wait)
{
return enumerator_create_filter(create_table_enumerator(this),
(void*)enumerator_filter, this, NULL);
wait ? (void*)enumerator_filter_wait : (void*)enumerator_filter_skip,
this, NULL);
}
METHOD(ike_sa_manager_t, checkin, void,