void makeflow_gc_prepare( struct dag *d ) { /* Files to be collected: * ((all_files \minus sink_files)) \union collect_list) \minus preserve_list) \minus source_files */ /* Parse GC_*_LIST and record which target files should be * garbage collected. */ char *collect_list = dag_variable_lookup_global_string("GC_COLLECT_LIST", d); char *preserve_list = dag_variable_lookup_global_string("GC_PRESERVE_LIST", d); struct dag_file *f; char *filename; /* add all files, but sink_files */ hash_table_firstkey(d->files); while((hash_table_nextkey(d->files, &filename, (void **) &f))) if(!dag_file_is_sink(f)) { set_insert(d->collect_table, f); } int i, argc; char **argv; /* add collect_list, for sink_files that should be removed */ string_split_quotes(collect_list, &argc, &argv); for(i = 0; i < argc; i++) { f = dag_file_lookup_or_create(d, argv[i]); set_insert(d->collect_table, f); debug(D_MAKEFLOW_RUN, "Added %s to garbage collection list", f->filename); } free(argv); /* remove files from preserve_list */ string_split_quotes(preserve_list, &argc, &argv); for(i = 0; i < argc; i++) { /* Must initialize to non-zero for hash_table functions to work properly. */ f = dag_file_lookup_or_create(d, argv[i]); set_remove(d->collect_table, f); debug(D_MAKEFLOW_RUN, "Removed %s from garbage collection list", f->filename); } free(argv); /* remove source_files from collect_table */ hash_table_firstkey(d->files); while((hash_table_nextkey(d->files, &filename, (void **) &f))) if(dag_file_is_source(f)) { set_remove(d->collect_table, f); debug(D_MAKEFLOW_RUN, "Removed %s from garbage collection list", f->filename); } /* Print reference counts of files to be collected */ set_first_element(d->collect_table); while((f = set_next_element(d->collect_table))) debug(D_MAKEFLOW_RUN, "Added %s to garbage collection list (%d)", f->filename, f->ref_count); }
void makeflow_parse_input_outputs( struct dag *d ) { /* Check if GC_*_LIST is specified and warn user about deprecated usage */ char *collect_list = dag_variable_lookup_global_string("GC_COLLECT_LIST" , d); if(collect_list) debug(D_NOTICE, "GC_COLLECT_LIST is specified: Please refer to manual about MAKEFLOW_INPUTS/OUTPUTS"); char *preserve_list = dag_variable_lookup_global_string("GC_PRESERVE_LIST", d); if(preserve_list) debug(D_NOTICE, "GC_PRESERVE_LIST is specified: Please refer to manual about MAKEFLOW_INPUTS/OUTPUTS"); /* Parse INPUT and OUTPUT lists */ struct dag_file *f; char *filename; int i, argc; char **argv; char *input_list = dag_variable_lookup_global_string("MAKEFLOW_INPUTS" , d); char *output_list = dag_variable_lookup_global_string("MAKEFLOW_OUTPUTS", d); if(input_list) { /* add collect_list, for sink_files that should be removed */ string_split_quotes(input_list, &argc, &argv); for(i = 0; i < argc; i++) { d->completed_files += 1; f = dag_file_lookup_or_create(d, argv[i]); set_insert(d->inputs, f); debug(D_MAKEFLOW_RUN, "Added %s to input list", f->filename); } free(argv); } else { debug(D_NOTICE, "MAKEFLOW_INPUTS is not specified"); } /* add all source files */ hash_table_firstkey(d->files); while((hash_table_nextkey(d->files, &filename, (void **) &f))) if(dag_file_is_source(f)) { set_insert(d->inputs, f); debug(D_MAKEFLOW_RUN, "Added %s to input list", f->filename); } if(output_list) { /* remove files from preserve_list */ string_split_quotes(output_list, &argc, &argv); for(i = 0; i < argc; i++) { /* Must initialize to non-zero for hash_table functions to work properly. */ f = dag_file_lookup_or_create(d, argv[i]); set_remove(d->outputs, f); debug(D_MAKEFLOW_RUN, "Added %s to output list", f->filename); } free(argv); } else { debug(D_NOTICE, "MAKEFLOW_OUTPUTS is not specified"); /* add all sink if OUTPUTS not specified */ hash_table_firstkey(d->files); while((hash_table_nextkey(d->files, &filename, (void **) &f))) if(dag_file_is_sink(f)) { set_insert(d->outputs, f); debug(D_MAKEFLOW_RUN, "Added %s to output list", f->filename); } } }