00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <const.h>
00013
00014 #include <arch/mem.h>
00015
00016 #include <kernel/kmalloc.h>
00017 #include <kernel/kernel.h>
00018
00019 #include <kernel/queue.h>
00020
00021
00022
00023
00024
00025 int count_queue(queue_t **q)
00026 {
00027 queue_t *temp;
00028 int count;
00029
00030 if (q==NULL) return(NULL);
00031 if (*q==NULL) return(0);
00032
00033 temp = *q; count = 0;
00034 do
00035 {
00036 temp = temp->next;
00037 count++;
00038 }
00039 while (temp != *q);
00040
00041 return(count);
00042 }
00043
00044
00045
00046
00047
00048 void *pick_queue(queue_t **q)
00049 {
00050 void *__ret;
00051
00052 if (q==NULL) return(NULL);
00053 if (*q==NULL) return(NULL);
00054
00055 __ret = (*q)->value;
00056
00057 *q=(*q)->next;
00058
00059 return( __ret );
00060 }
00061
00062
00063
00064
00065
00066
00067
00068
00069 void add_queue(queue_t **q, void *v)
00070 {
00071 queue_t *p;
00072
00073 p = (queue_t *)kmalloc(sizeof(queue_t));
00074 if (p == NULL) error("Out of virtual memory!!!");
00075
00076 p->value = v;
00077
00078 if (*q==NULL)
00079 {
00080 p->next = p;
00081 *q=p;
00082 }
00083 else
00084 {
00085 p->next = (*q)->next;
00086 (*q)->next = p;
00087 }
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097 int rem_queue(queue_t **q, void *v)
00098 {
00099 queue_t *t, *t2;
00100
00101 if (q==NULL) return(FALSE);
00102 if (*q==NULL) return(FALSE);
00103
00104
00105 t = *q;
00106 do
00107 {
00108 t2 = t;
00109 t = t->next;
00110
00111 if (t->value == v)
00112 {
00113
00114 t2->next = t->next;
00115
00116 if (t == *q)
00117 {
00118
00119 if (t == t->next)
00120 *q = NULL;
00121 else
00122 *q = (*q)->next;
00123 };
00124 kfree(t);
00125 return(TRUE);
00126 }
00127 } while (t != *q);
00128 return(FALSE);
00129 }
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 void *find_queue(queue_t **q, void *v)
00142 {
00143 queue_t *t;
00144
00145 if (q==NULL) return(FALSE);
00146 if (*q==NULL) return(FALSE);
00147
00148
00149 t = *q;
00150 do
00151 {
00152 if (t->value == v)
00153 {
00154
00155 return( t->value );
00156 }
00157 t = t->next;
00158 } while (t != *q);
00159
00160 return( NULL );
00161 }