Scheduler is now selectable in make menuconfig in kernel hacking.
[projects/modsched/linux.git] / kernel / sched / modsched / framework / include / fw_list.h
1 #ifndef _FW_LIST_H
2 #define _FW_LIST_H
3
4
5 /*
6  * Copied and heavily modified from Linux implementation.
7  *  Created on:23.07.2013
8  *      Authors: Christian RenĂ© Sechting, Daniel Roehrig
9  *
10  */
11
12 #undef offsetof
13 #define offsetof(TYPE, MEMBER) ((fw_size_t) &((TYPE *)0)->MEMBER)
14
15 /**
16  * fw_container_of - cast a member of a structure out to the containing structure
17  * @ptr:        the pointer to the member.
18  * @type:       the type of the container struct this is embedded in.
19  * @member:     the name of the member within the struct.
20  *
21  */
22 #define fw_container_of(ptr, type, member) ({               \
23         const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
24         (type *)( (char *)__mptr - offsetof(type,member) );})
25
26
27 typedef struct fw_list_head {
28         struct fw_list_head *next, *prev;
29 } fw_list_head_t;
30
31 /**
32  * Initializing the list
33  * @name: the head for your list.
34  */
35 #define FW_LIST_INIT(name)      name.next = name.prev = &(name)
36
37 #define FW_LIST_HEAD_INIT(name) { &(name), &(name) }
38
39 #define FW_LIST_HEAD(name) \
40         struct fw_list_head name = FW_LIST_HEAD_INIT(name)
41
42
43 /**
44  * fw_list_entry - get the struct for this entry
45  * @ptr:        the &struct list_head pointer.
46  * @type:       the type of the struct this is embedded in.
47  * @member:     the name of the list_struct within the struct.
48  */
49 #define fw_list_entry(ptr, type, member) \
50         fw_container_of(ptr, type, member)
51
52 /**
53  * list_for_each_entry  -       iterate over list of given type
54  * @pos:        the type * to use as a loop cursor.
55  * @head:       the head for your list.
56  * @member:     the name of the list_struct within the struct.
57  */
58 #define fw_list_for_each_entry(pos, head, member)                               \
59         for (pos = fw_list_entry((head)->next, typeof(*pos), member);   \
60              &pos->member != (head);    \
61              pos = fw_list_entry(pos->member.next, typeof(*pos), member))
62
63 /**
64  * list_empty - tests whether a list is empty
65  * @head: the list to test.
66  */
67 int fw_list_empty(const struct fw_list_head *head);
68
69 /**
70  * fw_list_length - returns the number of entries in a list.
71  * @head: the &struct fw_list_head pointer.
72  */
73 int fw_list_length(const struct fw_list_head *head);
74
75 /*
76  * Insert a new entry between two known consecutive entries.
77  *
78  * This is only for internal list manipulation where we know
79  * the prev/next entries already!
80  */
81 void __fw_list_add(struct fw_list_head *_new,
82                               struct fw_list_head *prev,
83                               struct fw_list_head *next);
84
85 /**
86  * list_add_tail - add a new entry
87  * @new: new entry to be added
88  * @head: list head to add it before
89  *
90  * Insert a new entry before the specified head.
91  * This is useful for implementing queues.
92  */
93 void fw_list_add_tail(struct fw_list_head *_new, struct fw_list_head *head);
94
95 /**
96  * fw_list_add_first - add a new entry at the beginning of the list
97  * @new: new entry to be added
98  * @head: list head to add it after
99  */
100 void fw_list_add_first(struct fw_list_head *_new, struct fw_list_head *head);
101
102 /**
103  * fw_list_add_at_pos - add a new entry at this position (starting with 0);
104  * @new: new entry to be added
105  * @head: list head to add it after
106  * @pos: position where to insert the element at
107  */
108 void fw_list_add_at_pos(struct fw_list_head *_new, struct fw_list_head *head, int pos);
109
110
111 /*
112  * Delete a list entry by making the prev/next entries
113  * point to each other.
114  *
115  * This is only for internal list manipulation where we know
116  * the prev/next entries already!
117  */
118 void __fw_list_del(struct fw_list_head * prev, struct fw_list_head * next);
119
120 void __fw_list_del_entry(struct fw_list_head *entry);
121
122 /**
123  * fw_list_del - deletes entry from list.
124  * @entry: the element to delete from the list.
125  * Note: list_empty() on entry does not return true after this, the entry is
126  * in an undefined state.
127  */
128 void fw_list_del(struct fw_list_head *entry);
129
130 /*
131  * pop functionality to remove the first element of the list an return it
132  */
133 struct fw_list_head *__fw_list_pop(struct fw_list_head *head);
134
135 /*
136  * use the define here to pop of the list to get the entry and not only the list element
137  */
138 #define fw_list_pop(head,type,member) fw_list_entry(__fw_list_pop(head),type,member)
139
140 #endif