设为首页 加入收藏

TOP

Linux 内核链表移植(一)
2014-11-24 03:17:16 来源: 作者: 【 】 浏览:9
Tags:Linux 内核 移植

参考网上的文章修改了移植后的Linux内核的双向链表和HASH链表, 使之适用于Linux和Windows平台. 可以在用户态下使用. 任何后果, 本人概不负责!


下面是全部代码:


/**
* dhlist.h
* - deque list and hash list from Linux Kernel
*
* from Linux Kernel
* for Windows and Linux
*
* modified by cheungmine
* 2013-4
*/
#ifndef _DH_LIST_H
#define _DH_LIST_H


#ifdef typeof


static inline void prefetch(const void *x) {;}
static inline void prefetchw(const void *x) {;}


#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)


#define container_of(ptr, type, member) ( { \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) ); } )


#else


static inline int prefetch(const void *x) {;return 1;}
static inline int prefetchw(const void *x) {;return 1;}


#define offsetof(type, field) ((LONG)(LONG_PTR)&((type *)0)->field)


#define container_of(address, type, field) \
((type *)((char *)(address) - offsetof(type, field)))


#endif


#ifndef LIST_POISON1
#define LIST_POISON1 ((void *) 0x00100100)
#endif


#ifndef LIST_POISON2
#define LIST_POISON2 ((void *) 0x00200200)
#endif


struct list_head
{
struct list_head *next, *prev;
};


#define LIST_HEAD_INIT(name) { &(name), &(name) }


#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)


#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)


/*
* Insert a new entry between two known consecutive entries.
*
* This is only for internal list manipulation where we know
* the prev/next entries already!
*/
static inline void __list_add(struct list_head *_new,
struct list_head *prev,
struct list_head *next)
{
next->prev = _new;
_new->next = next;
_new->prev = prev;
prev->next = _new;
}


/**
* list_add - add a new entry
* @new: new entry to be added
* @head: list head to add it after
*
* Insert a new entry after the specified head.
* This is good for implementing stacks.
*/
static inline void list_add(struct list_head *_new, struct list_head *head)
{
__list_add(_new, head, head->next);
}


/**
* list_add_tail - add a new entry
* @new: new entry to be added
* @head: list head to add it before
*
* Insert a new entry before the specified head.
* This is useful for implementing queues.
*/
static inline void list_add_tail(struct list_head *_new, struct list_head *head)
{
__list_add(_new, head->prev, head);
}


static inline void __list_del(struct list_head * prev, struct list_head * next)
{
next->prev = prev;
prev->next = next;
}


static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
entry->next = (list_head*) LIST_POISON1;
entry->prev = (list_head*) LIST_POISON2;
}


static inline void list_del_init(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
INIT_LIST_HEAD(entry);
}


static inline void list_move(struct list_head *list, struct list_head *head)
{
__list_del(list->prev, list->next);
list_add(list, head);
}


static inline void list_move_tail(struct list_head *list, struct list_head *head)
{
__list_del(list->prev, list->next);
list_add_tail(list, head);
}


static inline int list_empty(const struct list_head *head)
{
return head->next == head;
}


static inline int list_empty_careful(const struct list_head *head)
{
struct list_head *next = head->next;
return (next == head) && (next == head->prev);
}


static inline void __list_splice(struct list_head *list, struct list_head *head)
{
struct list_head *first = list->next;

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux内核驱动开发之KGDB单步调试.. 下一篇Linux下程序简单编写_TQ2440第一..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何利用Python做数 (2025-12-24 23:48:36)
·如何使用python进行 (2025-12-24 23:48:34)
·python 爬虫入门该怎 (2025-12-24 23:48:31)
·Java 实现多个大文件 (2025-12-24 23:22:00)
·Java多线程编程在工 (2025-12-24 23:21:56)