# HG changeset patch # User LordOfWar # Date 2009-10-26 23:22:17 # Node ID dc7e1845745eb8a012a3c4d3afe9098e20091554 # Parent 90fbdc8cb5f5f8e2b026827c0b3cd86914894b07 perfected new frame finder which is implimented into the user interface, it assumes that every time you get a frame, that you are a new slave with a render power of 1. I may draw I diagram of how it works later. diff --git a/src/server/distrend.c b/src/server/distrend.c --- a/src/server/distrend.c +++ b/src/server/distrend.c @@ -446,7 +446,7 @@ int find_jobframe_from_job(struct distre if(!found) { fprintf(stderr, "No more frames in this job number %d", distrenjob_ptr->jobnum); - sleep(1); /*< @todo eliminate the need for this line*/ + distrenjob_ptr->prev_frame_index = frame_counter; return 1; } @@ -462,35 +462,39 @@ int find_jobframe_new(struct distrenjob if(general_info.hibernate) return 1; - int power_difference; - int greatest_power_difference; + float power_difference; + float greatest_power_difference; unsigned short int found; struct distrenjob *job_to_render; struct distrenjob *distrenjob_ptr; - greatest_power_difference = 0; + greatest_power_difference = -10000; found = 0; /* iterate through jobs from first to last */ for(distrenjob_ptr = head->next; - distrenjob_ptr && !distrenjob_ptr->hibernate && distrenjob_ptr->prev_frame_index < distrenjob_ptr->total_frames; + distrenjob_ptr && !distrenjob_ptr->hibernate; distrenjob_ptr = distrenjob_ptr->next) { - power_difference = (general_info.total_render_power / general_info.total_priority_pieces)*(11-distrenjob_ptr->priority); - power_difference = power_difference - distrenjob_ptr->assigned_render_power; + if(distrenjob_ptr->prev_frame_index < (distrenjob_ptr->total_frames - 1)) + { + power_difference = (((float)general_info.total_render_power / (float)general_info.total_priority_pieces)*(11-(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); - 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) { fprintf(stderr, "No more jobs to render\n"); - sleep(1); /*< @todo eliminate the need for this line*/ return 1; } @@ -511,12 +515,16 @@ int find_jobframe_again(struct distrenjo distrenjob_ptr = distrenjob_get(head, jobnum); - if(!distrenjob_ptr) + // if the job was not found or there are no frames left in the job... + if(!distrenjob_ptr || distrenjob_ptr->prev_frame_index >= (distrenjob_ptr->total_frames - 1)) { fprintf(stderr, "Job number %d has been finished, finding new job\n", jobnum); - find_jobframe_new(head, rend_pwr, job, frame); - sleep(1); /*< @todo eliminate the need for this line*/ - return 1; + + // 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; + + return find_jobframe_new(head, rend_pwr, job, frame); } found = 0; @@ -1021,13 +1029,14 @@ int printJobInfo(struct distrenjob *job) fprintf(stderr, "name: %s\n", job->email); fprintf(stderr, "submitter: %s\n", job->submitter); fprintf(stderr, "e-mail: %s\n", job->email); - fprintf(stderr, "priority, %d\n", job->priority); + fprintf(stderr, "priority: %d\n", job->priority); fprintf(stderr, "completed: %d\n", job->completed_frames); fprintf(stderr, "assigned: %d\n", job->assigned_frames); fprintf(stderr, "total: %d\n", job->total_frames); fprintf(stderr, "watchdog: %d\n", job->watchdog_forgiveness); fprintf(stderr, "hibernate: %d\n", job->hibernate); fprintf(stderr, "prev_frame: %d\n", job->prev_frame_index); + fprintf(stderr, "render power: %ld\n", job->assigned_render_power); return 1; } @@ -1045,7 +1054,7 @@ int printAllJobnums(struct distrenjob *h total_jobs++; } - fprintf(stderr, "%d jobs in queue\n", total_jobs); + fprintf(stderr, "\n%d jobs in queue\n\n", total_jobs); return 1; } @@ -1129,7 +1138,7 @@ int main(int argc, char *argv[]) //start_data(&head); // Starts fresh or loads data from xml dump. Should we grab the return? // pre-loaded jobs for testing - prepare_distrenjob(&head, 1, "awesome", "LordOfWar", "onlylordofwar@gmail.com", 4, 1, 100, 640, 480); + prepare_distrenjob(&head, 1, "awesome", "LordOfWar", "onlylordofwar@gmail.com", 8, 1, 100, 640, 480); prepare_distrenjob(&head, 1, "hamburger", "Ohnobinki", "ohnobinki@ohnopublishing.net", 3, 1, 50, 1280, 720); while(test == 1) @@ -1141,7 +1150,8 @@ int main(int argc, char *argv[]) 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 \tQuit\n"); + fprintf(stderr, "\t7 \tPrint general info\n"); + fprintf(stderr, "\t8 \tQuit\n"); scanf("%d", &command); @@ -1158,17 +1168,8 @@ int main(int argc, char *argv[]) printJobInfo(distrenjob_get(&head, jobnum)); break; case 3: - fprintf(stderr, "\nPut the number of a non existing job to get a new frame\nJob number: "); - scanf("%d", &jobnum); - fprintf(stderr, "\nRender Power: "); - scanf("%d", &priority); - fprintf(stderr, "\n1->new user (Render Power has not been added to general_info)\n2->returning user\ninput:"); - scanf("%d", &start_frame); - - if(start_frame == 1) - general_info.total_render_power = general_info.total_render_power + priority; - - if(!find_jobframe_again(&head, jobnum, priority, &tmp_job, &tmp_frame)) + general_info.total_render_power++; + if(!find_jobframe_again(&head, -1, 1, &tmp_job, &tmp_frame)) { fprintf(stderr, "frame was found, details below\n"); fprintf(stderr, "Job#:%d\n", tmp_job->jobnum); @@ -1201,6 +1202,14 @@ int main(int argc, char *argv[]) printAllJobnums(&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: %d", 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: