Changeset - 59546e9e3870
[Not reviewed]
default
0 1 0
ethanzonca - 16 years ago 2009-07-25 18:29:01

Some fun changes, things are getting a bit more complicated as we start integrating code.
1 file changed with 33 insertions and 71 deletions:
0 comments (0 inline, 0 general)
src/server/distrend.c
Show inline comments
 
@@ -172,25 +172,25 @@ void queue(struct blendjob *blendjob, in
 
    blendjob->email = email;
 
    blendjob->priority = priority;
 
    blendjob->frameset = frameset;
 
  }
 
  else{
 
    // Throw error.
 
  }
 
jobnum++; // Advance the jobnumber for the next queued job
 
}
 

	
 

	
 
/**
 
  Status Report Generator: 
 
  Status Report Generator:
 
  -figures out how much of the job is done, where jobnum corresponds to the job number
 
  -removes finished jobs
 

	
 
  @param blendjobs_head a pointer to a pointer because the head of the blendjobs linked list may need to be changed by blendjob_remove
 
*/
 
void status_report_generator(struct blendjob **blendjobs_head)
 
{
 
  struct blendjob *blendjob_ptr;
 
  unsigned short workers_working; /*< used to count the total number of workers working */
 
  unsigned int numjobs; /*< used to track number of jobs */
 

	
 
  blendjob_ptr = *blendjobs_head;
 
@@ -214,25 +214,25 @@ void status_report_generator(struct blen
 
	  percent_frames_finished = 0;
 
	  total_time = 0;
 

	
 
	  while(framecounter < blendjob_ptr->total_frames)
 
	    /* scans through frames, based on their status it runs a statement(s) */
 
	    {
 
	      if(blendjob_ptr->frameset[framecounter].status == 2)
 
		/* If the frame is done */
 
		{
 
		  finished_frames ++;
 
		  total_time += blendjob_ptr->frameset[framecounter].time_to_render;
 
		}
 
	      
 

	
 
	      if(blendjob_ptr->frameset[framecounter].status == 1)
 
		/* If the frame is assigned */
 
		{
 
		  pending_frames ++;
 
		  workers_working ++;
 
		}
 

	
 
	      framecounter ++;
 
	    } /* while(framecounter < blendjob_ptr->total_frames) */
 

	
 
	  // find the percent of completed frames
 
	  percent_frames_finished = (finished_frames / blendjob_ptr->total_frames) * 100; /*< @LordofWar: extraneous parentheses! */
 
@@ -287,25 +287,25 @@ void frame_num_struct_builder(struct ble
 

	
 
	for(counter = 0; counter < numframes; counter ++)
 
	  /* This builds the array, with the array starting at zero and the frameset.num starting at sframe */
 
	  job->frameset[counter].num = counter + startframe;
 

	
 
	highest_jobnum++; // After it has created the job, it adds one to the highest_jobnum interger
 
}
 

	
 

	
 

	
 
/**
 
  Frame Finder: matches your computer up with a lovely frame to render
 
  Major issue here, the client needs to know the frame number, AND the job number!
 
  TODO: Major issue here, the client needs to know the frame number, AND the job number!
 
  Notice that this function starts by looking at the oldest job first
 

	
 
  @return 0 success, other: error
 
*/
 
int frame_finder(struct blendjob *head, struct blendjob **job, struct frameset **frame)
 
{
 
  int your_frame;  // your_frame is an interger value that will be given to the client as the frame number to render
 

	
 
  unsigned short int found;
 
  unsigned short int priority;
 

	
 
  struct blendjob *blendjob_ptr;
 
@@ -345,26 +345,26 @@ int frame_finder(struct blendjob *head, 
 
	  blendjob_ptr->priority --;
 

	
 
	  /* If that job had no open frames for some reason, run the status report generator so that */
 
	  status_report_generator(&head);
 

	
 
	  /* should the job be removed now? */
 
	  fprintf(stderr, "Job %d is finished, this is probably the place to call the job-removal function\n", blendjob_ptr->jobnum);
 
	}
 
    } /* while(!found) */
 

	
 
  fprintf(stderr, "Missing apostrophe !!!!!!!!!!!!!!\n"); abort();
 
  /* sets the value of the frame to 1, which means its taken !!!!!! MISSSING APOSTROPHE!!!!!!! */
 
  blendjob_ptr->frameset[your_frame].status++; 
 
  
 
  blendjob_ptr->frameset[your_frame].status++;
 

	
 
  blendjob_ptr->frameset[your_frame].start_time = clock();
 

	
 
  *job = blendjob_ptr;
 
  *frame =  &blendjob_ptr->frameset[your_frame];
 

	
 
  return 0;
 
}
 

	
 
void blend_frame_watchdog(struct blendjob *blendjob_head)
 
{
 
  unsigned short int watchdog_forgiveness; /*< seconds to wait on a frame before re-assigning it */
 
  struct blendjob *blendjob_ptr;
 
@@ -438,91 +438,26 @@ void blendjob_remove(struct blendjob **h
 

	
 
  /*
 
     @lordofwar: the magic deallocation of memory ;-)
 
   */
 
  free(bj);
 
}
 

	
 

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

	
 
int main(int argc, char *argv[])
 
{
 
//// Begin Getopt Sample, EDITME!Sometime
 
		   int aflag = 0;
 
	       int bflag = 0;
 
	       char *cvalue = NULL;
 
	       int index;
 
	       int c;
 

	
 
	       opterr = 0;
 

	
 
	       while ((c = getopt (argc, argv, "abc:")) != -1)
 
	         switch (c)
 
	           {
 
	           case 'a':
 
	             aflag = 1;
 
	             break;
 
	           case 'b':
 
	             bflag = 1;
 
	             break;
 
	           case 'c':
 
	             cvalue = optarg;
 
	             break;
 
	           case '?':
 
	             if (optopt == 'c')
 
	               fprintf (stderr, "Option -%c requires an argument.\n", optopt);
 
	             else if (isprint (optopt))
 
	               fprintf (stderr, "Unknown option `-%c'.\n", optopt);
 
	             else
 
	               fprintf (stderr,
 
	                        "Unknown option character `\\x%x'.\n",
 
	                        optopt);
 
	             return 1;
 
	           default:
 
	             abort ();
 
	           }
 

	
 
	       printf ("aflag = %d, bflag = %d, cvalue = %s\n",
 
	               aflag, bflag, cvalue);
 

	
 
	       for (index = optind; index < argc; index++)
 
	         printf ("Non-option argument %s\n", argv[index]);
 
//// End getopt sample
 

	
 

	
 
// Just wrote this to try and piece everything together after writing it on paper :D --ethanzonca
 
///////////////////// Semi-pseudo-code for server //////////////////////////////////////////
 
/*
 

	
 
start_data();
 
status_report_generator();
 
blend_frame_watchdog();
 

	
 
	if(client says "i ain't got nuthin to render!"){
 
		frame_finder() ==> returns jobnum/framenum that are sent to slave, "render jobnum framenum"
 
	}
 
	if(client says "done with frame # in job #"){
 
		finish_frame(jobnum, frame);
 
		frame_finder() ==> returns jobnum/framenum that are sent to slave, "render jobnum framenum"
 
	}
 

	
 
*/
 
///////////////////////////////////////////////////////////////////////////////////////
 

	
 

	
 

	
 

	
 

	
 

	
 
/* TODO: Put some arg-grabbing code here */
 

	
 
// Begin non-working framework?
 
	int distrend_do_config(int argc, char *argv[], struct distrend_config *config)
 
	{
 
	  cfg_opt_t myopts_listen[] =
 
	    {
 
	      CFG_SIMPLE_STR("type", NULL),
 
	      CFG_SIMPLE_STR("path", NULL),
 
	      CFG_SIMPLE_INT("port", NULL),
 
	      CFG_END()
 
	  };
 
	  cfg_opt_t myopts[] =
 
@@ -554,20 +489,47 @@ blend_frame_watchdog();
 
  struct distrend_listenset *listenset;
 
  struct distrend_config *config;
 
  distrend_do_config(argc, argv, config);
 

	
 
  distrend_listen(&listenset, config);
 
  /* This is called the ``main loop'' */
 
  while(cont)
 
    {
 
      struct distren_action *action;
 

	
 
      distrend_accept(&action);
 
      cont = distrend_do(action);
 

	
 

	
 
      /* Somewhat Pseudo-code for basic server operation, should be more event-driven */
 

	
 
      start_data();
 
      status_report_generator(); // TODO: Add correct args
 
      blend_frame_watchdog();	 // TODO: Add correct args
 

	
 
// TODO: Okay, so the slave really needs 3 statuses, not just "idle" and "working" so the server can tell when it finishes a frame
 
int iteration; // We shouldn't need this.
 
int framenum;
 
int jobnum;
 
      /* If the client is idle */
 
      	if(clientstatus == DISTREN_REQUEST_DONEFRAME && iteration > 0){
 
      		framenum = frame_finder(); // give framefinder args, framefinder should return job number and frame number
 
      		jobnum = frame_finder();
 
      		remotio_send_to_client(framenum);
 
      	}
 
      /* If the client's status changes from running to idle */
 
      	if(clientstatus == DISTREN_REQUEST_DONEFRAME && iteration == 0){
 
      		finish_frame(jobnum, framenumprevious); // make it finish the previous frame or something.
 
      		frame_finder() ==> returns jobnum/framenum that are sent to slave, "render jobnum framenum"
 
      	}
 

	
 
      /* End Somewhat Pseudo-code */
 

	
 

	
 
      distrend_action_free(action);
 
    }
 

	
 
  distrend_unlisten(listenset);
 
  distrend_config_free(config);
 

	
 
  return 0;
 
}
0 comments (0 inline, 0 general)