使用list_sort

时间:2016-02-29 08:27:24

标签: linux list kernel

我正在研究Linux内核模块,我正在使用链接列表构建。我需要对此列表进行排序,并且我看到有一个内置的list_sort函数,如下所述。但是我对priv参数感到困惑。这个参数用于什么以及我需要传递什么?在任何地方都没有很多文档。

linux/list_sort.h中定义:

/**
 * list_sort - sort a list
 * @priv: private data, opaque to list_sort(), passed to @cmp
 * @head: the list to sort
 * @cmp: the elements comparison function
 *
 * This function implements "merge sort", which has O(nlog(n))
 * complexity.
 *
 * The comparison function @cmp must return a negative value if @a
 * should sort before @b, and a positive value if @a should sort after
 * @b. If @a and @b are equivalent, and their original relative
 * ordering is to be preserved, @cmp must return 0.
 */
void list_sort(void *priv, struct list_head *head,
        int (*cmp)(void *priv, struct list_head *a,
            struct list_head *b))

修改 所以我理解我可以为priv参数传递NULL。现在我不确定如何编写我的cmp函数,因为list_sort接受struct list_head指针,但我有自己定义的struct birthday,其中包含list_head。我的下面的比较函数不起作用,因为list_head不包含我的struct birthday所拥有的成员。

struct birthday {
char *name;
int month;
int day;
int year;
struct list_head list;
};

int compare(void *priv, struct list_head *a, struct list_head *b) {
if (a != NULL && b != NULL) {
    struct birthday personA = a;
    struct birthday personB = b;
    int monthA = personA.month;
    int monthB = personB.month;
    int dayA = personA.day;
    int dayB = personB.day;
    int yearA = personA.year;
    int yearB = personB.year;

    if (yearA < yearB) {
        return 1;
    } else if (yearB < yearA) {
        return -1;
    } else {
        if (monthA < monthB) {
            return 1;
        } else if (monthB < monthA) {
            return -1;
        } else {
            if (dayA < dayB) {
                return 1;
            } else if (dayB < dayA) {
                return -1;
            } else {
            return 0;
            }
        }
    }
}

}

2 个答案:

答案 0 :(得分:1)

priv参数只是一个传递回cmp函数的参数,list_sort本身没有使用它。如果您不需要,可以传递NULL

这样的参数对于C中的回调函数是常见的,以避免使用全局变量将信息传递给回调函数。

答案 1 :(得分:0)

使用container_of检索您的实际结构。 container_of函数的第一个操作数是list_head,第二个是结构的类型。用list填充第三个参数。
很容易找出container_of函数的工作原理。它将head->next->prev返回到您通过第二个参数传递的类型中。