00001 00006 #include <malloc.h> 00007 00008 #include "libmgk.h" 00009 #include "allocate.h" 00010 00011 unsigned long __mgk_tick = 0L; 00012 static mgk_node *schedule = NULL; 00013 static int ready_qlen = 0; 00014 00015 #define NODE_DYNPRI(n) (unsigned int)( \ 00016 (n)->priority + \ 00017 __mgk_tick - \ 00018 (n)->ready_time \ 00019 ) 00020 00021 void 00022 __mgk_enqueue(mgk_node * node) 00023 { 00024 mgk_node **npp, *np; 00025 for (npp = &schedule; (np = *npp); npp = &np->next) { 00026 if (np == node) { 00027 return; 00028 } 00029 if (NODE_DYNPRI(np) < node->priority) { 00030 break; 00031 } 00032 } 00033 node->ready_time = __mgk_tick; 00034 node->next = np; 00035 *npp = node; 00036 ready_qlen++; 00037 } 00038 00039 void 00040 __mgk_dequeue(mgk_node * node) 00041 { 00042 mgk_node **npp, *np; 00043 for (npp = &schedule; (np = *npp); npp = &np->next) { 00044 if (np == node) { 00045 *npp = np->next; 00046 ready_qlen--; 00047 } 00048 } 00049 } 00050 00051 mgk_node * 00052 __mgk_next_node(void) 00053 { 00054 mgk_node *np = schedule; 00055 if (np) { 00056 schedule = np->next; 00057 __mgk_tick++; 00058 ready_qlen--; 00059 } 00060 return (np); 00061 }