65 lines
1.4 KiB
C
65 lines
1.4 KiB
C
/*
|
|
* Copyright(c) 2012-2018 Intel Corporation
|
|
* SPDX-License-Identifier: BSD-3-Clause-Clear
|
|
*/
|
|
|
|
#include "ocf/ocf.h"
|
|
#include "utils_list.h"
|
|
|
|
void ocf_lst_sort(struct ocf_lst *lst)
|
|
{
|
|
ocf_cache_line_t iter_idx;
|
|
ocf_cache_line_t next_idx;
|
|
struct ocf_lst_entry *iter;
|
|
|
|
if (!lst->cmp) {
|
|
/* No comparator, no needed to sort */
|
|
return;
|
|
}
|
|
|
|
if (ocf_lst_empty(lst)) {
|
|
/* List is empty nothing to do */
|
|
return;
|
|
}
|
|
|
|
/* Get iterator - first element on the list, and one after */
|
|
iter_idx = lst->head->next;
|
|
iter = lst->getter(lst->cache, iter_idx);
|
|
next_idx = iter->next;
|
|
lst->getter(lst->cache, iter->next);
|
|
|
|
/* Initialize list to initial empty state, it will be empty */
|
|
lst->head->next = lst->invalid;
|
|
lst->head->prev = lst->invalid;
|
|
|
|
while (iter_idx != lst->invalid) {
|
|
ocf_lst_init_entry(lst, iter);
|
|
|
|
if (ocf_lst_empty(lst)) {
|
|
/* Put first at the the list */
|
|
ocf_lst_add(lst, iter_idx);
|
|
} else {
|
|
/* search for place where put element at the list */
|
|
struct ocf_lst_entry *pos;
|
|
ocf_cache_line_t pos_idx;
|
|
|
|
for_each_lst(lst, pos, pos_idx)
|
|
if (lst->cmp(lst->cache, pos, iter) > 0)
|
|
break;
|
|
|
|
if (lst->invalid == pos_idx) {
|
|
/* Put at the end of list */
|
|
ocf_lst_add_tail(lst, iter_idx);
|
|
} else {
|
|
/* Position is known, put it before */
|
|
ocf_lst_add_before(lst, pos_idx, iter_idx);
|
|
}
|
|
}
|
|
|
|
/* Switch to next */
|
|
iter_idx = next_idx;
|
|
iter = lst->getter(lst->cache, iter_idx);
|
|
next_idx = iter->next;
|
|
}
|
|
}
|