00001 00005 #include "libmgk.h" 00006 00007 void 00008 __mgk_update(mgk_node * np) 00009 { 00010 int i; 00011 int maskv; 00012 mgk_inport *ip; 00013 mgk_mask_trigger *tp; 00014 node_status newstat; 00015 00016 newstat = WAITING; 00017 if (np->priority != MGK_NODE_STOP_PRIORITY) { 00018 for (i = 0; i < itemsof(np->data_mask); i++) { 00019 np->data_mask[i] = 0; 00020 } 00021 for (i = 0, ip = np->ins; i < (int)np->nin; i++, ip++) { 00022 if (ip->head) { 00023 mgk_set_portmask_bit(np->data_mask, i, 1); 00024 } 00025 } 00026 switch (np->tmode) { 00027 case AT_IFALL: 00028 for (i = maskv = 0; i < itemsof(np->data_mask); i++) { 00029 maskv |= (~np->data_mask[i] & np->input_mask[i]); 00030 } 00031 newstat = maskv ? WAITING : READY; 00032 break; 00033 case AT_IFANY: 00034 for (i = maskv = 0; i < itemsof(np->data_mask); i++) { 00035 maskv |= (np->data_mask[i] & np->input_mask[i]); 00036 } 00037 newstat = maskv ? READY : WAITING; 00038 break; 00039 case AT_SPEC: 00040 for (tp = np->trigger_list; tp; tp = tp->next) { 00041 for (i = maskv = 0; i < itemsof(np->data_mask); i++) { 00042 maskv |= (~np->data_mask[i] & np->input_mask[i] & tp->mask[i]); 00043 } 00044 if (maskv == 0) { 00045 break; 00046 } 00047 } 00048 newstat = ((np->active_trigger = tp)) ? READY : WAITING; 00049 break; 00050 } 00051 } 00052 switch (np->status) { 00053 case RUNNING: 00054 break; 00055 case READY: 00056 if (newstat == WAITING) { 00057 np->status = WAITING; 00058 __mgk_dequeue(np); 00059 } 00060 break; 00061 case WAITING: 00062 if (newstat == READY) { 00063 np->status = READY; 00064 __mgk_enqueue(np); 00065 } 00066 break; 00067 } 00068 }