backend-manager: Simplify sorting peer configs

This commit is contained in:
Tobias Brunner 2018-05-29 12:24:02 +02:00
parent 80c9ae4521
commit 82e237c04e

View File

@ -1,4 +1,5 @@
/* /*
* Copyright (C) 2018 Tobias Brunner
* Copyright (C) 2007-2009 Martin Willi * Copyright (C) 2007-2009 Martin Willi
* HSR Hochschule fuer Technik Rapperswil * HSR Hochschule fuer Technik Rapperswil
* *
@ -295,34 +296,26 @@ CALLBACK(peer_enum_filter_destroy, void,
} }
/** /**
* Insert entry into match-sorted list, using helper * Insert entry into match-sorted list
*/ */
static void insert_sorted(match_entry_t *entry, linked_list_t *list, static void insert_sorted(match_entry_t *entry, linked_list_t *list)
linked_list_t *helper)
{ {
enumerator_t *enumerator;
match_entry_t *current; match_entry_t *current;
while (list->remove_first(list, (void**)&current) == SUCCESS) enumerator = list->create_enumerator(list);
while (enumerator->enumerate(enumerator, &current))
{ {
helper->insert_last(helper, current); if ((entry->match_ike > current->match_ike &&
}
while (helper->remove_first(helper, (void**)&current) == SUCCESS)
{
if (entry && (
(entry->match_ike > current->match_ike &&
entry->match_peer >= current->match_peer) || entry->match_peer >= current->match_peer) ||
(entry->match_ike >= current->match_ike && (entry->match_ike >= current->match_ike &&
entry->match_peer > current->match_peer))) entry->match_peer > current->match_peer))
{ {
list->insert_last(list, entry); break;
entry = NULL;
} }
list->insert_last(list, current);
}
if (entry)
{
list->insert_last(list, entry);
} }
list->insert_before(list, enumerator, entry);
enumerator->destroy(enumerator);
} }
METHOD(backend_manager_t, create_peer_cfg_enumerator, enumerator_t*, METHOD(backend_manager_t, create_peer_cfg_enumerator, enumerator_t*,
@ -332,7 +325,7 @@ METHOD(backend_manager_t, create_peer_cfg_enumerator, enumerator_t*,
enumerator_t *enumerator; enumerator_t *enumerator;
peer_data_t *data; peer_data_t *data;
peer_cfg_t *cfg; peer_cfg_t *cfg;
linked_list_t *configs, *helper; linked_list_t *configs;
INIT(data, INIT(data,
.lock = this->lock, .lock = this->lock,
@ -352,8 +345,6 @@ METHOD(backend_manager_t, create_peer_cfg_enumerator, enumerator_t*,
} }
configs = linked_list_create(); configs = linked_list_create();
/* only once allocated helper list for sorting */
helper = linked_list_create();
while (enumerator->enumerate(enumerator, &cfg)) while (enumerator->enumerate(enumerator, &cfg))
{ {
id_match_t match_peer_me, match_peer_other; id_match_t match_peer_me, match_peer_other;
@ -376,11 +367,10 @@ METHOD(backend_manager_t, create_peer_cfg_enumerator, enumerator_t*,
.match_ike = match_ike, .match_ike = match_ike,
.cfg = cfg->get_ref(cfg), .cfg = cfg->get_ref(cfg),
); );
insert_sorted(entry, configs, helper); insert_sorted(entry, configs);
} }
} }
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
helper->destroy(helper);
return enumerator_create_filter(configs->create_enumerator(configs), return enumerator_create_filter(configs->create_enumerator(configs),
peer_enum_filter, configs, peer_enum_filter, configs,