Scheduler is now selectable in make menuconfig in kernel hacking.
[projects/modsched/linux.git] / kernel / sched / modsched / framework / sys / fw_list.c
1 #include "fw_list.h"
2 #include "fw_types.h"
3
4 /*
5  *      ALL LIST FUNCTIONALITIES
6  */
7
8 int fw_list_empty(const fw_list_head_t *head)
9 {
10         return (head->next == (fw_list_head_t*)head);
11 }
12
13 int fw_list_length(const fw_list_head_t *head)
14 {
15         int length = 0;
16         fw_list_head_t* start;
17
18         if (fw_list_empty(head)) {
19                 return 0;
20         }
21         start = head->next;
22
23         while (start != head) {
24                 start = start->next;
25                 length++;
26         }
27
28         return length;
29 }
30
31 void __fw_list_add(fw_list_head_t *_new,
32                               fw_list_head_t *prev,
33                               fw_list_head_t *next)
34 {
35         next->prev = _new;
36         _new->next = next;
37         _new->prev = prev;
38         prev->next = _new;
39 }
40
41 void fw_list_add_tail(fw_list_head_t *_new, fw_list_head_t *head)
42 {
43         __fw_list_add(_new, head->prev, head);
44 }
45
46 void fw_list_add_first(fw_list_head_t *_new, fw_list_head_t *head)
47 {
48         __fw_list_add(_new, head, head->next);
49 }
50
51 void fw_list_add_at_pos(fw_list_head_t *_new, fw_list_head_t *head, int pos)
52 {
53         if ((pos <= fw_list_length(head)) && (pos >= 0)) {
54                 while (pos-- > 0) {
55                         head = head->next;
56                 }
57                 __fw_list_add(_new, head, head->next);
58         }
59         else{
60                 // TODO: was is wenn pos >fw_list_length ist? hinten einfuegen?
61                 fw_list_add_tail(_new, head);
62         }
63 }
64
65 void __fw_list_del(fw_list_head_t * prev, fw_list_head_t * next)
66 {
67         next->prev = prev;
68         prev->next = next;
69 }
70
71 void __fw_list_del_entry(fw_list_head_t *entry)
72 {
73         __fw_list_del(entry->prev, entry->next);
74 }
75
76 #define LIST_POISON1  ((void *) 0x00100100)
77 #define LIST_POISON2  ((void *) 0x00200200)
78
79 void fw_list_del(fw_list_head_t *entry)
80 {
81         if (entry->next!=LIST_POISON1 && entry->prev!=LIST_POISON2)
82         {
83                 __fw_list_del(entry->prev, entry->next);
84                 entry->next = LIST_POISON1;
85                 entry->prev = LIST_POISON2;
86         }
87 }
88
89 fw_list_head_t *__fw_list_pop(fw_list_head_t *head)
90 {
91         fw_list_head_t *ret = head->next;
92         if (fw_list_empty(head)){
93                 return NULL;
94         }
95
96         fw_list_del(ret);
97
98         return ret;
99 }