int main( int argc, char *argv[] ) { signed char c; int work_queue_master_mode = WORK_QUEUE_MASTER_MODE_STANDALONE; char *project = NULL; int priority = 0; const char *progname = "wavefront"; debug_config(progname); struct option long_options[] = { {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'v'}, {"debug", required_argument, 0, 'd'}, {"advertise", no_argument, 0, 'a'}, {"project-name", required_argument, 0, 'N'}, {"debug-file", required_argument, 0, 'o'}, {"port", required_argument, 0, 'p'}, {"priority", required_argument, 0, 'P'}, {"estimated-time", required_argument, 0, 't'}, {"random-port", required_argument, 0, 'Z'}, {"bitmap", required_argument, 0, 'B'}, {0,0,0,0} }; while((c=getopt_long(argc,argv,"aB:d:hN:p:P:o:v:Z:", long_options, NULL)) >= 0) { switch(c) { case 'a': break; case 'd': debug_flags_set(optarg); break; case 'h': show_help(progname); exit(0); break; case 'N': work_queue_master_mode = WORK_QUEUE_MASTER_MODE_CATALOG; free(project); project = xxstrdup(optarg); break; case 'p': port = atoi(optarg); break; case 'P': priority = atoi(optarg); break; case 'o': debug_config_file(optarg); break; case 'v': cctools_version_print(stdout, progname); exit(0); break; case 'Z': port_file = optarg; port = 0; break; case 'B': progress_bitmap_file = optarg; break; default: show_help(progname); return 1; } } cctools_version_debug(D_DEBUG, argv[0]); if( (argc-optind)!=5 ) { show_help(progname); exit(1); } function = argv[optind]; xsize=atoi(argv[optind+1]); ysize=atoi(argv[optind+2]); infile=argv[optind+3]; outfile=argv[optind+4]; start_time = time(0); last_display_time = 0; cells_total = xsize*ysize; xsize++; ysize++; array = text_array_create(xsize,ysize); if(!text_array_load(array,infile)) { fprintf(stderr,"couldn't load %s: %s",infile,strerror(errno)); return 1; } int count = text_array_load(array,outfile); if(count>0) printf("recovered %d results from %s\n",count,outfile); logfile = fopen(outfile,"a"); if(!logfile) { fprintf(stderr,"couldn't open %s for append: %s\n",outfile,strerror(errno)); return 1; } if(work_queue_master_mode == WORK_QUEUE_MASTER_MODE_CATALOG && !project) { fprintf(stderr, "wavefront: wavefront master running in catalog mode. Please use '-N' option to specify the name of this project.\n"); fprintf(stderr, "wavefront: Run \"%s -h\" for help with options.\n", argv[0]); return 1; } queue = work_queue_create(port); //Read the port the queue is actually running, in case we just called //work_queue_create(LINK_PORT_ANY) port = work_queue_port(queue); if(!queue) { fprintf(stderr,"%s: could not create work queue on port %d: %s\n",progname,port,strerror(errno)); return 1; } if(port_file) opts_write_port_file(port_file, port); // advanced work queue options work_queue_specify_master_mode(queue, work_queue_master_mode); work_queue_specify_name(queue, project); work_queue_specify_priority(queue, priority); fprintf(stdout, "%s: listening for workers on port %d...\n",progname,work_queue_port(queue)); if(progress_bitmap_file) { bmap = bitmap_create(xsize,ysize); wavefront_bitmap_initialize(bmap); } task_prime(); struct work_queue_task *t; while(1) { if(time(0)!=last_display_time) display_progress(queue); t = work_queue_wait(queue,WORK_QUEUE_WAITFORTASK); if(!t) break; if(t->return_status==0) { int x,y; if(sscanf(t->tag,"%d %d",&x,&y)==2) { text_array_set(array,x,y,t->output); task_complete(x,y); fprintf(logfile,"%d %d %s\n",x,y,t->output); fflush(logfile); tasks_done++; } else { fprintf(stderr,"unexpected output: %s\nfrom command: %s\non host: %s",t->output,t->command_line,t->host); } } else { fprintf(stderr,"function failed return value (%i) result (%i) on host %s. output:\n%s\n",t->return_status,t->result,t->host,t->output); } work_queue_task_delete(t); if(work_queue_empty(queue)) break; } display_progress(queue); return 0; }
int main( int argc, char *argv[] ) { char c; const char *progname = "wavefront"; debug_config(progname); while((c=getopt(argc,argv,"p:Pd:o:vh"))!=(char)-1) { switch(c) { case 'p': port = atoi(optarg); break; case 'd': debug_flags_set(optarg); break; case 'o': debug_config_file(optarg); break; case 'v': show_version(progname); exit(0); break; case 'h': show_help(progname); exit(0); break; } } if( (argc-optind)!=5 ) { show_help(progname); exit(1); } function = argv[optind]; xsize=atoi(argv[optind+1]); ysize=atoi(argv[optind+2]); infile=argv[optind+3]; outfile=argv[optind+4]; start_time = time(0); last_display_time = 0; cells_total = xsize*ysize; xsize++; ysize++; array = text_array_create(xsize,ysize); if(!text_array_load(array,infile)) { fprintf(stderr,"couldn't load %s: %s",infile,strerror(errno)); return 1; } int count = text_array_load(array,outfile); if(count>0) printf("recovered %d results from %s\n",count,outfile); logfile = fopen(outfile,"a"); if(!logfile) { fprintf(stderr,"couldn't open %s for append: %s\n",outfile,strerror(errno)); return 1; } queue = work_queue_create(port); task_prime(); struct work_queue_task *t; while(1) { if(time(0)!=last_display_time) display_progress(queue); t = work_queue_wait(queue,WORK_QUEUE_WAITFORTASK); if(!t) break; if(t->return_status==0) { int x,y; if(sscanf(t->tag,"%d %d",&x,&y)==2) { text_array_set(array,x,y,t->output); task_complete(x,y); fprintf(logfile,"%d %d %s\n",x,y,t->output); fflush(logfile); tasks_done++; } else { fprintf(stderr,"unexpected output: %s\nfrom command: %s\non host: %s",t->output,t->command_line,t->host); } } else { fprintf(stderr,"function failed return value (%i) result (%i) on host %s. output:\n%s\n",t->return_status,t->result,t->host,t->output); } work_queue_task_delete(t); if(work_queue_empty(queue)) break; } display_progress(queue); return 0; }