Changeset - 92b51bd6668b
[Not reviewed]
default
0 1 0
LordOfWar - 16 years ago 2009-10-24 20:12:52

added some more code to the complex frame finder
1 file changed with 23 insertions and 6 deletions:
0 comments (0 inline, 0 general)
src/server/distrend.c
Show inline comments
 
@@ -66,12 +66,13 @@ struct general_info {
 
  unsigned short int total_finished_jobs; //
 
  unsigned int total_frames_rendered; //
 
  unsigned int highest_jobnum;
 
  short int hibernate;
 
  unsigned int timestamp;
 
  unsigned long int total_render_power;
 
  unsigned long int total_priority_pieces;
 
} general_info;
 

	
 

	
 

	
 
/*
 
  internally defined funcs's prototypes @TODO: Make all functions nice and proper */
 
@@ -416,13 +417,13 @@ int find_jobframe(struct distrenjob *hea
 
  *job = distrenjob_ptr;
 
  *frame = &distrenjob_ptr->frameset[frame_counter];
 

	
 
  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;
 

	
 
  found = 0;
 
  for(frame_counter = (distrenjob_ptr->prev_frame_index + 1); frame_counter < distrenjob_ptr->total_frames; frame_counter ++)
 
@@ -458,26 +459,37 @@ int find_jobframe_from_job(struct distre
 
// find a frame to render when the job that the last frame was for no longer exists
 
int find_jobframe_new(struct distrenjob *head, int rend_pwr, struct distrenjob **job, struct frameset **frame)
 
{
 
  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)
 
    {
 
      fprintf(stderr, "No more jobs to render\n");
 
      sleep(1); /*< @todo eliminate the need for this line*/
 
      return 1;
 
@@ -488,25 +500,30 @@ int find_jobframe_new(struct distrenjob 
 

	
 
// gets a frame to render from the same job that the previously rendered frame was from
 
int find_jobframe_again(struct distrenjob *head, int jobnum, int rend_pwr, struct distrenjob **job, struct frameset **frame)
 
{
 
  if(general_info.hibernate)
 
    return 1;
 

	
 
  short int found;
 
  struct distrenjob *distrenjob_ptr;
 

	
 
  distrenjob_ptr = distrenjob_get(head, jobnum);
 

	
 
  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;
 
}
 

	
 
/** Checks for dead, latent, or stale slaves */
 
void frame_watchdog(struct distrenjob *distrenjob_head)
0 comments (0 inline, 0 general)