static void lock_single_segment(private_ike_sa_manager_t *this, u_int index)
{
mutex_t *lock = this->segments[index & this->segment_mask].mutex;
+
lock->lock(lock);
}
static void unlock_single_segment(private_ike_sa_manager_t *this, u_int index)
{
mutex_t *lock = this->segments[index & this->segment_mask].mutex;
+
lock->unlock(lock);
}
static void lock_all_segments(private_ike_sa_manager_t *this)
{
u_int i;
+
for (i = 0; i < this->segment_count; ++i)
{
this->segments[i].mutex->lock(this->segments[i].mutex);
static void unlock_all_segments(private_ike_sa_manager_t *this)
{
u_int i;
+
for (i = 0; i < this->segment_count; ++i)
{
this->segments[i].mutex->unlock(this->segments[i].mutex);
if (this->current)
{
entry_t *item;
+
if (this->current->enumerate(this->current, (void**)&item))
{
*entry = item;
else
{
linked_list_t *list;
+
lock_single_segment(this->manager, this->segment);
if ((list = this->manager->ike_sa_table[this->row]) != NULL &&
list->get_count(list))
if ((list = this->ike_sa_table[row]) != NULL)
{
entry_t *current;
+
enumerator_t *enumerator = list->create_enumerator(list);
while (enumerator->enumerate(enumerator, ¤t))
{
entry_t *entry;
ike_sa_t *ike_sa = NULL;
ike_sa_id_t *id = message->get_ike_sa_id(message);
+
id = id->clone(id);
id->switch_initiator(id);
{
enumerator_t *enumerator;
entry_t *entry;
+ u_int segment;
int count = 0;
enumerator = create_table_enumerator(this);
- while (enumerator->enumerate(enumerator, &entry))
+ while (enumerator->enumerate(enumerator, &entry, &segment))
{
/* we check if we have a responder CONNECTING IKE_SA without checkout */
if (!entry->ike_sa_id->is_initiator(entry->ike_sa_id) &&
static void destroy(private_ike_sa_manager_t *this)
{
u_int i;
+
for (i = 0; i < this->table_size; ++i)
{
linked_list_t *list;
+
if ((list = this->ike_sa_table[i]) != NULL)
{
list->destroy(list);
static u_int get_nearest_powerof2(u_int n)
{
u_int i;
+
--n;
for (i = 1; i < sizeof(u_int) * 8; i <<= 1)
{