Changeset - dc7e1845745e
[Not reviewed]
default
0 1 0
LordOfWar - 16 years ago 2009-10-26 23:22:17

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.
1 file changed with 41 insertions and 32 deletions:
0 comments (0 inline, 0 general)
src/server/distrend.c
Show inline comments
 
@@ -443,13 +443,13 @@ 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;
 
    }
 

	
 
  *job = distrenjob_ptr;
 
  *frame = &distrenjob_ptr->frameset[frame_counter];
 

	
 
@@ -459,41 +459,45 @@ 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;
 
  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;
 
    }
 

	
 
  find_jobframe_from_job(job_to_render, job, frame);
 
  job_to_render->assigned_render_power = job_to_render->assigned_render_power + rend_pwr;
 

	
 
@@ -508,18 +512,22 @@ int find_jobframe_again(struct distrenjo
 

	
 
  short int found;
 
  struct distrenjob *distrenjob_ptr;
 

	
 
  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;
 
  found = find_jobframe_from_job(distrenjob_ptr, job, frame);
 

	
 
  if(found)
 
@@ -1018,19 +1026,20 @@ int printJob(struct distrenjob *job)
 
int printJobInfo(struct distrenjob *job)
 
{
 
  fprintf(stderr, "type: %d\n", job->type);
 
  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;
 
}
 

	
 
int printAllJobnums(struct distrenjob *head)
 
{
 
@@ -1042,13 +1051,13 @@ int printAllJobnums(struct distrenjob *h
 
  for(current_job = head->next; current_job; current_job = current_job->next)
 
    {
 
      fprintf(stderr, "%d: %s\n", current_job->jobnum, current_job->name);
 
      total_jobs++;
 
    }
 

	
 
  fprintf(stderr, "%d jobs in queue\n", total_jobs);
 
  fprintf(stderr, "\n%d jobs in queue\n\n", total_jobs);
 

	
 
  return 1;
 
}
 

	
 
/* ************************** Main ************************* */
 

	
 
@@ -1126,25 +1135,26 @@ int main(int argc, char *argv[])
 

	
 
  distrend_do_config(argc, argv, &config);
 

	
 
  //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)
 
  {
 
    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 \tQuit\n");
 
    fprintf(stderr, "\t7 \tPrint general info\n");
 
    fprintf(stderr, "\t8 \tQuit\n");
 

	
 
    scanf("%d", &command);
 

	
 
    switch(command)
 
    {
 
    case 1:
 
@@ -1155,23 +1165,14 @@ int main(int argc, char *argv[])
 
    case 2:
 
      fprintf(stderr, "Job number: ");
 
      scanf("%d", &jobnum);
 
      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);
 
          fprintf(stderr, "Frame#:%d\n", tmp_frame->num);
 
      }
 

	
 
@@ -1198,12 +1199,20 @@ int main(int argc, char *argv[])
 
      distrenjob_remove(&head, distrenjob_get(&head, jobnum));
 
      break;
 
    case 6:
 
      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:
 
      fprintf(stderr, "Invalid input, please try again.\n");
 
    }
 
  }
0 comments (0 inline, 0 general)