diff --git a/src/server/distrend.c b/src/server/distrend.c --- a/src/server/distrend.c +++ b/src/server/distrend.c @@ -69,6 +69,7 @@ struct general_info { short int hibernate; unsigned int timestamp; unsigned long int total_render_power; + unsigned long int total_priority_pieces; } general_info; @@ -419,7 +420,7 @@ int find_jobframe(struct distrenjob *hea return 0; } -int find_jobframe_from_job(struct distrenjob *head, struct distrenjob *distrenjob_ptr, struct distrenjob **job, struct frameset **frame) +int find_jobframe_from_job(struct distrenjob *distrenjob_ptr, struct distrenjob **job, struct frameset **frame) { unsigned int frame_counter; unsigned short int found; @@ -461,20 +462,31 @@ int find_jobframe_new(struct distrenjob if(general_info.hibernate) return 1; + int power_difference; + int greatest_power_difference; unsigned short int found; struct distrenjob *job_to_render; struct distrenjob *distrenjob_ptr; + greatest_power_difference = 0; found = 0; /* iterate through jobs from first to last */ - for(distrenjob_ptr = head->next; distrenjob_ptr && !distrenjob_ptr->hibernate; distrenjob_ptr = distrenjob_ptr->next) + for(distrenjob_ptr = head->next; + distrenjob_ptr && !distrenjob_ptr->hibernate && distrenjob_ptr->prev_frame_index < distrenjob_ptr->total_frames; + distrenjob_ptr = distrenjob_ptr->next) { + power_difference = (general_info.total_render_power / general_info.total_priority_pieces)*distrenjob_ptr->priority; + power_difference = power_difference - distrenjob_ptr->assigned_render_power; - job_to_render = distrenjob_ptr; + if(power_difference > greatest_power_difference) + { + job_to_render = distrenjob_ptr; + greatest_power_difference = power_difference; + } } - find_jobframe_from_job(head, job_to_render, job, frame); + find_jobframe_from_job(job_to_render, job, frame); if(!found) { @@ -491,7 +503,7 @@ int find_jobframe_again(struct distrenjo { if(general_info.hibernate) return 1; - + short int found; struct distrenjob *distrenjob_ptr; distrenjob_ptr = distrenjob_get(head, jobnum); @@ -499,11 +511,16 @@ int find_jobframe_again(struct distrenjo if(!distrenjob_ptr) { 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; } - find_jobframe_new(head, rend_pwr, job, frame); + found = 0; + found = find_jobframe_from_job(distrenjob_ptr, job, frame); + + if(found) + find_jobframe_new(head, rend_pwr, job, frame); return 0; }