diff --git a/src/server/distrend.c b/src/server/distrend.c --- a/src/server/distrend.c +++ b/src/server/distrend.c @@ -48,7 +48,6 @@ #include /* ******************* Structs ************************ */ - struct general_info { struct distrenjob head; @@ -76,23 +75,149 @@ struct general_info -/* - internally defined funcs's prototypes @TODO: Make all functions nice and proper -*/ -void distrenjob_remove(struct general_info *, struct distrenjob *bj); +/*********************************** + Function Prototypes + *********************************** */ +/* ************General Functions************* */ +int xml_dump(); +int distrend_do(); +int start_data(struct general_info *general_info); +void finish_frame(struct general_info *geninfo, struct distrenjob *distrenjob, int frame); +int mortition(struct general_info *geninfo, struct distrenjob *job); +int restoreJobState(struct distrenjob *job); +int prepare_distrenjob(struct general_info *geninfo, int type, char *name, char *submitter, int priority, int start_frame, int end_frame, int width, int height); +int distrenjob_enqueue(struct general_info *geninfo, struct distrenjob *job); +int change_job_priority(struct general_info *geninfo, struct distrenjob *job, int new_priority); +int find_jobframe(struct general_info *geninfo, struct distrenjob **job, struct frameset **frame); +int find_jobframe_from_job(struct distrenjob *distrenjob_ptr, struct distrenjob **job, struct frameset **frame); +int find_jobframe_new(struct general_info *geninfo, int rend_pwr, struct distrenjob **job, struct frameset **frame); +int find_jobframe_again(struct general_info *geninfo, int jobnum, int rend_pwr, struct distrenjob **job, struct frameset **frame); +void frame_watchdog(struct distrenjob *distrenjob_head); struct distrenjob *distrenjob_get(struct distrenjob *head, jobnum_t jobnum); -int distrenjob_enqueue(struct general_info *, struct distrenjob *job); -int mortition(struct general_info *, struct distrenjob *job); -int update_xml_joblist(struct general_info *); -int createQueueFromXML(struct general_info*); -int reCreateQueueFromXML(struct general_info*, xmlDocPtr doc, xmlNodePtr current); -void update_general_info(struct general_info*); -int import_general_info(struct general_info*); +void distrenjob_remove(struct general_info *geninfo, struct distrenjob *bj); +int distrend_do_config(int argc, char *argv[], struct distrend_config **config); +int distrend_config_free(struct distrend_config *config); + +/* **************XML Functions**************** */ +void update_general_info(struct general_info *geninfo); +int import_general_info(struct general_info *general_info); +int restore_distrenjob(struct general_info *geninfo, struct distrenjob **distrenjob, jobnum_t jobnum); int updateJobStatsXML(struct distrenjob *job); +int update_xml_joblist(struct general_info *geninfo); +int createQueueFromXML(struct general_info *geninfo); +int reCreateQueueFromXML(struct general_info *geninfo, xmlDocPtr doc, xmlNodePtr current); -int job_getserialfilename(char **filename, struct general_info *, unsigned int jobnum, int createdir); -int distren_mkdir_recurse(char *fname); +/* **************Test Functions**************** */ +int printFrameInfo(struct frameset *frame); +int printJob(struct distrenjob *job); +int printJobInfo(struct distrenjob *job); +int printAllJobnums(struct distrenjob *head); +int interactiveTest(int test, struct general_info general_info); +int job_getserialfilename(char **filename, struct general_info *geninfo, unsigned int jobnum, int createdir); +int distren_mkdir_recurse(char *dirname); + +/* ************************** Main ************************* */ + +int main(int argc, char *argv[]) +{ + + /* Parse arguments */ + int counter; + int test = 0; /*< Interactive mode if 1 */ + struct general_info general_info; + int cont; + struct distrend_clientset *clients; + + enum clientstatus + { + CLIENTSTATUS_UNINITIALIZED = 0, + CLIENTSTATUS_BUSY = 1, + CLIENTSTATUS_IDLE = 2 + } clientstatus; + + xmlinit(); + + for(counter = 0; counter < argc; counter ++) + { + if(strcmp(argv[counter], "-h") == 0) + { + fprintf(stderr, "Usage: distrend [option] \nStarts the distrend server\n\t-h\tshow this help\n\t-t\tlaunches queue testing interface \n"); + return 2; + } + + else if(strcmp(argv[counter], "-t") == 0) + { + fprintf(stderr, "Entering into test mode...\n\n"); + test=1; + } + } + cont = 1; + + if(distrend_do_config(argc, argv, &general_info.config)) + return 1; + + /** preset paths */ + _distren_asprintf(&general_info.files.geninfo, "%s/general_info.xml", + general_info.config->datadir); + + if(start_data(&general_info)) + { + fprintf(stderr, "%s:%d: start_data() failed\n", __FILE__, __LINE__); + return 1; + } + + /** pre-loaded jobs for testing */ + prepare_distrenjob(&general_info, 1, "awesome", "LordOfWar", 8, 1, 100, 640, 480); + prepare_distrenjob(&general_info, 1, "hamburger", "ohnobinki", 3, 1, 50, 1280, 720); + + // Execute test function + interactiveTest(test, general_info); + + distrend_listen(general_info.config, &clients); + /* This is called the "main loop" */ + while(!general_info.config->die) + { + int clientsays = 0; /*< temporary example variable, will be replaced when we can handle messages */ + + distrend_accept(general_info.config, clients); + + /* Make the following code more event-driven */ + frame_watchdog(&general_info.head); + + + struct frameset *frame; + struct distrenjob *job; + + /* If the client is idle, must be modified for climbing through linked list of clients (client->clientnum) */ + if(clientstatus == CLIENTSTATUS_IDLE) + { + int returnnum = find_jobframe(&general_info, &job, &frame); // Finds a frame to render + if(returnnum) + { + fprintf(stderr,"No frames are available to render at this time. Idling...\n"); + sleep(10); + } + else + remotio_send_to_client(frame->num, job->jobnum); // Pseudo-sends data to client + } + /* If the client states that they finished the frame */ + if(clientsays == DISTREN_REQUEST_DONEFRAME){ + clientstatus = CLIENTSTATUS_IDLE; // Sets the client back to idle + finish_frame(&general_info, job, frame->num); // @TODO: Make sure this actually works. + } + } /* while(!general_info.config->die) */ + + distrend_unlisten(general_info.config->listens, clients); + distrend_config_free(general_info.config); + + xmlcleanup(); + + /** free() paths */ + free(general_info.files.geninfo); + + return 0; +} /* ********************** Functions ************************* */ @@ -141,11 +266,11 @@ int start_data(struct general_info *gene fprintf(stderr, "Parsing XML files and restoring previous state...\n"); if(import_general_info(general_info)) - fprintf(stderr, "FAILURE\n"); + fprintf(stderr, "FAILURE\n"); fprintf(stderr, "Restoring queue...\n"); if(createQueueFromXML(general_info)) - fprintf(stderr, "FAILURE\n"); + fprintf(stderr, "FAILURE\n"); fprintf(stderr, "done\n"); } @@ -182,15 +307,15 @@ int mortition(struct general_info *genin for(counter = 0; counter < job->total_frames; counter++) { _distren_asprintf(&path_and_number, "%s/stor/job%d/out/%d.%s", - geninfo->config->datadir, - job->jobnum, - job->frameset[counter].num, - job->output_format); + geninfo->config->datadir, + job->jobnum, + job->frameset[counter].num, + job->output_format); if(stat(path_and_number, &buffer) == -1) { - /** - missing frame found - */ + /** + missing frame found + */ job->frameset[counter].status = FRAMESETSTATUS_UNASSIGNED; job->completed_frames--; geninfo->total_frames_rendered--; @@ -202,7 +327,7 @@ int mortition(struct general_info *genin if(isJobDone) { /** - all frames were accounted for + all frames were accounted for */ distrenjob_remove(geninfo, job); distrenjob_free(&job); @@ -302,7 +427,7 @@ int prepare_distrenjob(struct general_in add job to queue */ fprintf(stderr, "prepare_distrenjob(): attempting distrenjob_serialize(%d, \"%s\")\n", - distrenjob->jobnum, serialfile); + distrenjob->jobnum, serialfile); distrenjob_serialize(distrenjob, serialfile); free(serialfile); @@ -341,17 +466,17 @@ int distrenjob_enqueue(struct general_in fprintf(stderr, "enqueue loop iteration\n"); if(job->priority < current_job->priority) { - /** - if job's priority is less than current_job's priority, insert job - keep in mind 1 is the highest priority given to jobs, head has a - priority of zero so it will always be before other jobs - */ - prev_job->next = job; - job->next = current_job; - fprintf(stderr, "added job before jobname: ``%s''\n", current_job->name); + /** + if job's priority is less than current_job's priority, insert job + keep in mind 1 is the highest priority given to jobs, head has a + priority of zero so it will always be before other jobs + */ + prev_job->next = job; + job->next = current_job; + fprintf(stderr, "added job before jobname: ``%s''\n", current_job->name); - geninfo->jobs_in_queue ++; - return 0; + geninfo->jobs_in_queue ++; + return 0; } prev_job = current_job; @@ -392,9 +517,9 @@ int change_job_priority(struct general_i iterate through linked list of jobs */ for(current_job = &geninfo->head; - current_job != NULL - && job->priority > current_job->priority; - current_job = current_job->next) + current_job != NULL + && job->priority > current_job->priority; + current_job = current_job->next) prev_job = current_job; prev_job->next = job; @@ -435,16 +560,16 @@ int find_jobframe(struct general_info *g { if(distrenjob_ptr->frameset[frame_counter].status == FRAMESETSTATUS_UNASSIGNED) // jobframe found { - found = 1; - distrenjob_ptr->frameset[frame_counter].status = FRAMESETSTATUS_ASSIGNED; - distrenjob_ptr->frameset[frame_counter].start_time = clock(); - distrenjob_ptr->assigned_frames++; - distrenjob_ptr->prev_frame_index = frame_counter; - updateJobStatsXML(distrenjob_ptr); + found = 1; + distrenjob_ptr->frameset[frame_counter].status = FRAMESETSTATUS_ASSIGNED; + distrenjob_ptr->frameset[frame_counter].start_time = clock(); + distrenjob_ptr->assigned_frames++; + distrenjob_ptr->prev_frame_index = frame_counter; + updateJobStatsXML(distrenjob_ptr); } if(found) - break; + break; } if(found) @@ -474,12 +599,12 @@ int find_jobframe_from_job(struct distre { if(distrenjob_ptr->frameset[frame_counter].status == FRAMESETSTATUS_UNASSIGNED) // jobframe found { - found = 1; - distrenjob_ptr->frameset[frame_counter].status = FRAMESETSTATUS_ASSIGNED; - distrenjob_ptr->frameset[frame_counter].start_time = clock(); - distrenjob_ptr->assigned_frames++; - distrenjob_ptr->prev_frame_index = frame_counter; - updateJobStatsXML(distrenjob_ptr); + found = 1; + distrenjob_ptr->frameset[frame_counter].status = FRAMESETSTATUS_ASSIGNED; + distrenjob_ptr->frameset[frame_counter].start_time = clock(); + distrenjob_ptr->assigned_frames++; + distrenjob_ptr->prev_frame_index = frame_counter; + updateJobStatsXML(distrenjob_ptr); } if(found) @@ -520,23 +645,23 @@ int find_jobframe_new(struct general_inf distrenjob_ptr && !distrenjob_ptr->hibernate; distrenjob_ptr = distrenjob_ptr->next) { - if(distrenjob_ptr->prev_frame_index < (distrenjob_ptr->total_frames - 1)) - { - /** - Why is the number 11 found here again? --ohnobinki - */ - power_difference = (((float)geninfo->total_render_power / (float)geninfo->total_priority_pieces) * ((float)distrenjob_ptr->priority)); - power_difference = power_difference - (float)distrenjob_ptr->assigned_render_power; + if(distrenjob_ptr->prev_frame_index < (distrenjob_ptr->total_frames - 1)) + { + /** + Why is the number 11 found here again? --ohnobinki + */ + power_difference = (((float)geninfo->total_render_power / (float)geninfo->total_priority_pieces) * ((float)distrenjob_ptr->priority)); + power_difference = power_difference - (float)distrenjob_ptr->assigned_render_power; - fprintf(stderr, "job num %d\npower difference: %f\n", distrenjob_ptr->jobnum, power_difference); + fprintf(stderr, "job num %d\npower difference: %f\n", distrenjob_ptr->jobnum, power_difference); - if(power_difference > greatest_power_difference) - { - job_to_render = distrenjob_ptr; - greatest_power_difference = power_difference; - found = 1; - } - } + if(power_difference > greatest_power_difference) + { + job_to_render = distrenjob_ptr; + greatest_power_difference = power_difference; + found = 1; + } + } } if(!found) @@ -569,7 +694,7 @@ int find_jobframe_again(struct general_i // if previous job isn't yet finished the render power of the slave is removed from it if(distrenjob_ptr) - distrenjob_ptr->assigned_render_power = distrenjob_ptr->assigned_render_power - rend_pwr; + distrenjob_ptr->assigned_render_power = distrenjob_ptr->assigned_render_power - rend_pwr; return find_jobframe_new(geninfo, rend_pwr, job, frame); } @@ -578,7 +703,7 @@ int find_jobframe_again(struct general_i found = find_jobframe_from_job(distrenjob_ptr, job, frame); if(found) - find_jobframe_new(geninfo, rend_pwr, job, frame); + find_jobframe_new(geninfo, rend_pwr, job, frame); return 0; } @@ -596,7 +721,7 @@ void frame_watchdog(struct distrenjob *d if(distrenjob_ptr->frameset[0].status != FRAMESETSTATUS_UNASSIGNED || distrenjob_ptr->frameset[1].status != FRAMESETSTATUS_UNASSIGNED) /* iterate through all frames for this job: */ for(counter = 0; counter < distrenjob_ptr->total_frames; counter ++) - /*watchdog_forgiveness = seconds of forgiveness before frame is re-assigned: */ + /*watchdog_forgiveness = seconds of forgiveness before frame is re-assigned: */ if((distrenjob_ptr->frameset[counter].start_time + distrenjob_ptr->watchdog_forgiveness) < clock()) { /* @@ -645,7 +770,7 @@ void distrenjob_remove(struct general_in for(previous_distrenjob = &geninfo->head; previous_distrenjob - && previous_distrenjob->next != bj; /*< stop on the distrenjob that comes before bj */ + && previous_distrenjob->next != bj; /*< stop on the distrenjob that comes before bj */ previous_distrenjob = previous_distrenjob->next) ; @@ -801,7 +926,7 @@ int restore_distrenjob(struct general_in tmp = distrenjob_unserialize(distrenjob, file_name); if(tmp) fprintf(stderr, "failed to load job %d from ``%s''\n", - jobnum, file_name); + jobnum, file_name); free(file_name); return tmp; @@ -809,45 +934,45 @@ int restore_distrenjob(struct general_in int updateJobStatsXML(struct distrenjob *job) { - xmlTextWriterPtr writer; - char *tmp; + xmlTextWriterPtr writer; + char *tmp; - _distren_asprintf(&tmp, "stor/job%d/stats.xml", job->jobnum); + _distren_asprintf(&tmp, "stor/job%d/stats.xml", job->jobnum); - /** - create xml document at the location tmp with no compression - */ - writer = xmlNewTextWriterFilename(tmp, 0); - free(tmp); - xmlTextWriterStartDocument(writer, NULL, "utf-8", NULL); + /** + create xml document at the location tmp with no compression + */ + writer = xmlNewTextWriterFilename(tmp, 0); + free(tmp); + xmlTextWriterStartDocument(writer, NULL, "utf-8", NULL); - xmlTextWriterStartElement(writer, (xmlChar*)"stats"); - _distren_asprintf(&tmp, "%d", job->assigned_frames); - xmlTextWriterWriteAttribute(writer, (xmlChar*)"assigned_frames", (xmlChar*)tmp); - free(tmp); + xmlTextWriterStartElement(writer, (xmlChar*)"stats"); + _distren_asprintf(&tmp, "%d", job->assigned_frames); + xmlTextWriterWriteAttribute(writer, (xmlChar*)"assigned_frames", (xmlChar*)tmp); + free(tmp); - _distren_asprintf(&tmp, "%d", job->completed_frames); - xmlTextWriterWriteAttribute(writer, (xmlChar*)"completed_frames", (xmlChar*)tmp); - free(tmp); + _distren_asprintf(&tmp, "%d", job->completed_frames); + xmlTextWriterWriteAttribute(writer, (xmlChar*)"completed_frames", (xmlChar*)tmp); + free(tmp); - _distren_asprintf(&tmp, "%d", job->total_render_time); - xmlTextWriterWriteAttribute(writer, (xmlChar*)"total_render_time", (xmlChar*)tmp); - free(tmp); + _distren_asprintf(&tmp, "%d", job->total_render_time); + xmlTextWriterWriteAttribute(writer, (xmlChar*)"total_render_time", (xmlChar*)tmp); + free(tmp); - /** - end document - */ - xmlTextWriterEndDocument(writer); - /** - free writer and save xml file to disk - @TODO confirma that calling xmlFreeTextWriter calls - write() and close(), respectively. - (close() causes asynchronous writes to be - completed). - */ - xmlFreeTextWriter(writer); + /** + end document + */ + xmlTextWriterEndDocument(writer); + /** + free writer and save xml file to disk + @TODO confirma that calling xmlFreeTextWriter calls + write() and close(), respectively. + (close() causes asynchronous writes to be + completed). + */ + xmlFreeTextWriter(writer); - return 1; + return 1; } @@ -870,7 +995,7 @@ int update_xml_joblist(struct general_in geninfo->timestamp = 0; _distren_asprintf(&tmp, "%s/job_list.xml", - geninfo->config->datadir); + geninfo->config->datadir); writer = xmlNewTextWriterFilename(tmp, 0); free(tmp); @@ -894,9 +1019,9 @@ int update_xml_joblist(struct general_in free(tmp); /** - this is needed for the new frame finder to work + this is needed for the new frame finder to work - Why the random constant numeral 11? --ohnobinki + Why the random constant numeral 11? --ohnobinki */ geninfo->total_priority_pieces = geninfo->total_priority_pieces + job->priority; @@ -940,7 +1065,7 @@ int createQueueFromXML(struct general_in if(doc == NULL) { fprintf(stderr, "createQueueFromXML: ``%s'' could not be not loaded\n", - xmllist_path); + xmllist_path); free(xmllist_path); return 1; @@ -998,7 +1123,7 @@ int reCreateQueueFromXML(struct general_ /** bail if failure recursevely ^-- is this the best thing to do in this case? - @TODO bail-out cleanup + @TODO bail-out cleanup */ return 1; @@ -1096,27 +1221,7 @@ int printAllJobnums(struct distrenjob *h return 1; } -/* ************************** Main ************************* */ - -int main(int argc, char *argv[]) -{ - - /* Argument-parser */ - int counter; - int test; /*< Interactive mode if 1 */ - - struct general_info general_info; - - int cont; - struct distrend_clientset *clients; - - enum clientstatus - { - CLIENTSTATUS_UNINITIALIZED = 0, - CLIENTSTATUS_BUSY = 1, - CLIENTSTATUS_IDLE = 2 - } clientstatus; - +int interactiveTest(int test, struct general_info general_info){ int command; jobnum_t jobnum; struct distrenjob *tmp_job; @@ -1132,160 +1237,81 @@ int main(int argc, char *argv[]) int end_frame; size_t read_buf; - xmlinit(); - - test = 0; - for(counter = 0; counter < argc; counter ++) - { - if(strcmp(argv[counter], "-h") == 0) - { - fprintf(stderr, "Usage: distrend [option] \nStarts the distrend server\n\t-h\tshow this help\n\t-t\tlaunches queue testing interface \n"); - return 2; - } + while(test == 1) + { + fprintf(stderr, "Welcome to DistRen Alpha Interactive Test Mode\n\n"); + fprintf(stderr, "\t1 \tPrint all frames in a job\n"); + fprintf(stderr, "\t2 \tExamine certain job\n"); + fprintf(stderr, "\t3 \tGet a frame to render\n"); + fprintf(stderr, "\t4 \tAdd a job\n"); + fprintf(stderr, "\t5 \tDelete a job\n"); + fprintf(stderr, "\t6 \tPrint jobnums in queue\n"); + fprintf(stderr, "\t7 \tPrint general info\n"); + fprintf(stderr, "\t8 \tQuit\n"); - else if(strcmp(argv[counter], "-t") == 0) - { - fprintf(stderr, "Entering into test mode...\n\n"); - test=1; - } - } - cont = 1; - - if(distrend_do_config(argc, argv, &general_info.config)) - return 1; - - /** preset paths */ - _distren_asprintf(&general_info.files.geninfo, "%s/general_info.xml", - general_info.config->datadir); - - if(start_data(&general_info)) - { - fprintf(stderr, "%s:%d: start_data() failed\n", __FILE__, __LINE__); - return 1; - } - - /** pre-loaded jobs for testing */ - prepare_distrenjob(&general_info, 1, "awesome", "LordOfWar", 8, 1, 100, 640, 480); - prepare_distrenjob(&general_info, 1, "hamburger", "ohnobinki", 3, 1, 50, 1280, 720); + scanf("%d", &command); - while(test == 1) - { - fprintf(stderr, "Welcome to DistRen Alpha Interactive Test Mode\n\n"); - fprintf(stderr, "\t1 \tPrint all frames in a job\n"); - fprintf(stderr, "\t2 \tExamine certain job\n"); - fprintf(stderr, "\t3 \tGet a frame to render\n"); - fprintf(stderr, "\t4 \tAdd a job\n"); - fprintf(stderr, "\t5 \tDelete a job\n"); - fprintf(stderr, "\t6 \tPrint jobnums in queue\n"); - fprintf(stderr, "\t7 \tPrint general info\n"); - fprintf(stderr, "\t8 \tQuit\n"); - - scanf("%d", &command); - - switch(command) - { - case 1: - fprintf(stderr, "Job number: "); - scanf("%d", &jobnum); - printJob(distrenjob_get(&general_info.head, jobnum)); - break; - case 2: - fprintf(stderr, "Job number: "); - scanf("%d", &jobnum); - printJobInfo(distrenjob_get(&general_info.head, jobnum)); - break; - case 3: - general_info.total_render_power ++; - if(!find_jobframe_again(&general_info, -1, 1, &tmp_job, &tmp_frame)) - { - fprintf(stderr, "frame was found, details below\n"); - fprintf(stderr, "Job#:%d\n", tmp_job->jobnum); - fprintf(stderr, "Frame#:%d\n", tmp_frame->num); - } - - break; - case 4: - name = NULL; - submitter = NULL; - email = NULL; + switch(command) + { + case 1: + fprintf(stderr, "Job number: "); + scanf("%d", &jobnum); + printJob(distrenjob_get(&general_info.head, jobnum)); + break; + case 2: + fprintf(stderr, "Job number: "); + scanf("%d", &jobnum); + printJobInfo(distrenjob_get(&general_info.head, jobnum)); + break; + case 3: + general_info.total_render_power ++; + if(!find_jobframe_again(&general_info, -1, 1, &tmp_job, &tmp_frame)) + { + fprintf(stderr, "frame was found, details below\n"); + fprintf(stderr, "Job#:%d\n", tmp_job->jobnum); + fprintf(stderr, "Frame#:%d\n", tmp_frame->num); + } - fprintf(stderr, "\nType: \n\t 1 \t blender\n\t 2 \t povray\n"); scanf("%d", &type); - fprintf(stderr, "\nName: "); scanf("\n"); getline(&name, &read_buf, stdin); - fprintf(stderr, "\nSubmitter: "); getline(&submitter, &read_buf, stdin); - fprintf(stderr, "\nEmail: "); getline(&email, &read_buf, stdin); - fprintf(stderr, "\nPriority: "); scanf("%d", &priority); - fprintf(stderr, "\nStart frame: "); scanf("%d", &start_frame); - fprintf(stderr, "\nEnd frame: "); scanf("%d", &end_frame); - fprintf(stderr, "\nWidth: "); scanf("%d", &width); - fprintf(stderr, "\nHeight: "); scanf("%d", &height); - prepare_distrenjob(&general_info, type, name, submitter, priority, start_frame, end_frame, width, height); - break; - case 5: - fprintf(stderr, "\nJob number: "); - scanf("%d", &jobnum); - distrenjob_remove(&general_info, distrenjob_get(&general_info.head, jobnum)); - break; - case 6: - printAllJobnums(&general_info.head); - break; - case 7: - fprintf(stderr, "\nHighest job number: %d", general_info.highest_jobnum); - fprintf(stderr, "\nJobs in queue: %d", general_info.jobs_in_queue); - fprintf(stderr, "\nTotal frames rendered: %d", general_info.total_frames_rendered); - fprintf(stderr, "\nTimestamp: %lu", (long)general_info.timestamp); - fprintf(stderr, "\nTotal priority pieces: %ld", general_info.total_priority_pieces); - fprintf(stderr, "\nTotal render power: %ld\n", general_info.total_render_power); - break; - case 8: - fprintf(stderr,"Goodbye.\n"); - return 0; - default: - fprintf(stderr, "Invalid input, please try again.\n"); - } - } + break; + case 4: + name = NULL; + submitter = NULL; + email = NULL; - distrend_listen(general_info.config, &clients); - /* This is called the "main loop" */ - while(!general_info.config->die) - { - int clientsays = 0; /*< temporary example variable, will be replaced when we can handle messages */ - - distrend_accept(general_info.config, clients); - - /* Make the following code more event-driven */ - frame_watchdog(&general_info.head); - - - struct frameset *frame; - struct distrenjob *job; - - /* If the client is idle, must be modified for climbing through linked list of clients (client->clientnum) */ - if(clientstatus == CLIENTSTATUS_IDLE) - { - int returnnum = find_jobframe(&general_info, &job, &frame); // Finds a frame to render - if(returnnum) - { - fprintf(stderr,"No frames are available to render at this time. Idling...\n"); - sleep(10); - } - else - remotio_send_to_client(frame->num, job->jobnum); // Pseudo-sends data to client - } - /* If the client states that they finished the frame */ - if(clientsays == DISTREN_REQUEST_DONEFRAME){ - clientstatus = CLIENTSTATUS_IDLE; // Sets the client back to idle - finish_frame(&general_info, job, frame->num); // @TODO: Make sure this actually works. - } - } /* while(!general_info.config->die) */ - - distrend_unlisten(general_info.config->listens, clients); - distrend_config_free(general_info.config); - - xmlcleanup(); - - /** free() paths */ - free(general_info.files.geninfo); - + fprintf(stderr, "\nType: \n\t 1 \t blender\n\t 2 \t povray\n"); scanf("%d", &type); + fprintf(stderr, "\nName: "); scanf("\n"); getline(&name, &read_buf, stdin); + fprintf(stderr, "\nSubmitter: "); getline(&submitter, &read_buf, stdin); + fprintf(stderr, "\nEmail: "); getline(&email, &read_buf, stdin); + fprintf(stderr, "\nPriority: "); scanf("%d", &priority); + fprintf(stderr, "\nStart frame: "); scanf("%d", &start_frame); + fprintf(stderr, "\nEnd frame: "); scanf("%d", &end_frame); + fprintf(stderr, "\nWidth: "); scanf("%d", &width); + fprintf(stderr, "\nHeight: "); scanf("%d", &height); + prepare_distrenjob(&general_info, type, name, submitter, priority, start_frame, end_frame, width, height); + break; + case 5: + fprintf(stderr, "\nJob number: "); + scanf("%d", &jobnum); + distrenjob_remove(&general_info, distrenjob_get(&general_info.head, jobnum)); + break; + case 6: + printAllJobnums(&general_info.head); + break; + case 7: + fprintf(stderr, "\nHighest job number: %d", general_info.highest_jobnum); + fprintf(stderr, "\nJobs in queue: %d", general_info.jobs_in_queue); + fprintf(stderr, "\nTotal frames rendered: %d", general_info.total_frames_rendered); + fprintf(stderr, "\nTimestamp: %lu", (long)general_info.timestamp); + fprintf(stderr, "\nTotal priority pieces: %ld", general_info.total_priority_pieces); + fprintf(stderr, "\nTotal render power: %ld\n", general_info.total_render_power); + break; + case 8: + fprintf(stderr,"Goodbye.\n"); + test = 0; + default: + fprintf(stderr, "Invalid input, please try again.\n"); + } + } return 0; }