/* * Function: exec_tree * -------------------- * Run the program tree * n_array: an array of all the nodes */ void exec_tree(struct node* n_array) { int i; int size = 0; int *d_eligible = determine_eligible(n_array, &size); while(size != 0) { for(i=0; i<size; i++) { int eligible_index = d_eligible[i]; if(n_array[eligible_index].status != FINISHED) { run(n_array, d_eligible[i]); } } size = 0; d_eligible = determine_eligible(n_array, &size); } }
int main(int argc, const char * argv[]) { char filename[MAX_LENGTH]; node_t * nodes[MAX_NODES]; FILE * file; int count; int i; //check that there is correct number of arguments if (argc != 2) { printf("graphexec requires 2 arguments.\n"); return -1; } //open file and check that it was sucessful file = fopen(argv[1], "r"); if (!file) { printf("The file specified does not exist or could not be opened.\n"); } //if things check out, proceed to read and process file else { count = read_file(file, nodes, MAX_NODES); bool finished; while (!finished) { finished = true; determine_eligible(nodes, count); //iterate through and run nodes that are marked READY for (i = 0; i < count; i++) { if (nodes[i]->status != FINISHED) { finished = false; if (nodes[i]->status == READY) { printf("Node %i Status: Running", i); if(run_node(nodes[i]) == FINISHED && run_node(nodes[i]) != -1) { printf(" >> Finished!\n"); } else perror("Error running node"); } } } } //cleanup free_array(nodes, count); if (fclose(file) == -1) perror("Failed to close file"); } return 0; }
// == Update Graph Eligibility == // Run through the whole graph and update all nodes whose parents have completed void update_graph_eligibility(node_t * node_array[], int node_count) { int i; for (i = 0; i < node_count; i++) { determine_eligible(node_array, node_array[i]); } }