Changeset - 4d01516c95d1
[Not reviewed]
default
0 1 0
Ethan Zonca (ethanzonca) - 16 years ago 2010-02-09 19:03:39
e@ethanzonca.com
Reorganization, cleanup
1 file changed with 305 insertions and 279 deletions:
0 comments (0 inline, 0 general)
src/server/distrend.c
Show inline comments
 
@@ -48,7 +48,6 @@
 
#include <libxml/xmlwriter.h>
 

	
 
/* ******************* Structs ************************ */
 

	
 
struct general_info
 
{
 
  struct distrenjob head;
 
@@ -76,23 +75,149 @@ struct general_info
 

	
 

	
 

	
 
/*
 
  internally defined funcs's prototypes @TODO: Make all functions nice and proper 
 
*/
 
void distrenjob_remove(struct general_info *, struct distrenjob *bj);
 
/***********************************
 
  Function Prototypes
 
 *********************************** */
 

	
 
/* ************General Functions************* */
 
int xml_dump();
 
int distrend_do();
 
int start_data(struct general_info *general_info);
 
void finish_frame(struct general_info *geninfo, struct distrenjob *distrenjob, int frame);
 
int mortition(struct general_info *geninfo, struct distrenjob *job);
 
int restoreJobState(struct distrenjob *job);
 
int prepare_distrenjob(struct general_info *geninfo, int type, char *name, char *submitter, int priority, int start_frame, int end_frame, int width, int height);
 
int distrenjob_enqueue(struct general_info *geninfo, struct distrenjob *job);
 
int change_job_priority(struct general_info *geninfo, struct distrenjob *job, int new_priority);
 
int find_jobframe(struct general_info *geninfo, struct distrenjob **job, struct frameset **frame);
 
int find_jobframe_from_job(struct distrenjob *distrenjob_ptr, struct distrenjob **job, struct frameset **frame);
 
int find_jobframe_new(struct general_info *geninfo, int rend_pwr, struct distrenjob **job, struct frameset **frame);
 
int find_jobframe_again(struct general_info *geninfo, int jobnum, int rend_pwr, struct distrenjob **job, struct frameset **frame);
 
void frame_watchdog(struct distrenjob *distrenjob_head);
 
struct distrenjob *distrenjob_get(struct distrenjob *head, jobnum_t jobnum);
 
int distrenjob_enqueue(struct general_info *, struct distrenjob *job);
 
int mortition(struct general_info *, struct distrenjob *job);
 
int update_xml_joblist(struct general_info *);
 
int createQueueFromXML(struct general_info*);
 
int reCreateQueueFromXML(struct general_info*, xmlDocPtr doc, xmlNodePtr current);
 
void update_general_info(struct general_info*);
 
int import_general_info(struct general_info*);
 
void distrenjob_remove(struct general_info *geninfo, struct distrenjob *bj);
 
int distrend_do_config(int argc, char *argv[], struct distrend_config **config);
 
int distrend_config_free(struct distrend_config *config);
 

	
 
/* **************XML Functions**************** */
 
void update_general_info(struct general_info *geninfo);
 
int import_general_info(struct general_info *general_info);
 
int restore_distrenjob(struct general_info *geninfo, struct distrenjob **distrenjob, jobnum_t jobnum);
 
int updateJobStatsXML(struct distrenjob *job);
 
int update_xml_joblist(struct general_info *geninfo);
 
int createQueueFromXML(struct general_info *geninfo);
 
int reCreateQueueFromXML(struct general_info *geninfo, xmlDocPtr doc, xmlNodePtr current);
 

	
 
int job_getserialfilename(char **filename, struct general_info *, unsigned int jobnum, int createdir);
 
int distren_mkdir_recurse(char *fname);
 
/* **************Test Functions**************** */
 
int printFrameInfo(struct frameset *frame);
 
int printJob(struct distrenjob *job);
 
int printJobInfo(struct distrenjob *job);
 
int printAllJobnums(struct distrenjob *head);
 
int interactiveTest(int test, struct general_info general_info);
 
int job_getserialfilename(char **filename, struct general_info *geninfo, unsigned int jobnum, int createdir);
 
int distren_mkdir_recurse(char *dirname);
 

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

	
 
int main(int argc, char *argv[])
 
{
 

	
 
  /* Parse arguments */
 
  int counter;
 
  int test = 0; /*< Interactive mode if 1 */
 
  struct general_info general_info;
 
  int cont;
 
  struct distrend_clientset *clients;
 

	
 
  enum clientstatus
 
  {
 
    CLIENTSTATUS_UNINITIALIZED = 0,
 
    CLIENTSTATUS_BUSY = 1,
 
    CLIENTSTATUS_IDLE = 2
 
  } clientstatus;
 

	
 
  xmlinit();
 

	
 
  for(counter = 0; counter < argc; counter ++)
 
    {
 
      if(strcmp(argv[counter], "-h") == 0)
 
      {
 
    	  fprintf(stderr, "Usage: distrend [option] \nStarts the distrend server\n\t-h\tshow this help\n\t-t\tlaunches queue testing interface \n");
 
		  return 2;
 
      }
 

	
 
      else if(strcmp(argv[counter], "-t") == 0)
 
      {
 
    	  fprintf(stderr, "Entering into test mode...\n\n");
 
		  test=1;
 
      }
 
    }
 
  cont = 1;
 

	
 
  if(distrend_do_config(argc, argv, &general_info.config))
 
    return 1;
 

	
 
  /** preset paths */
 
  _distren_asprintf(&general_info.files.geninfo, "%s/general_info.xml",
 
		    general_info.config->datadir);
 

	
 
  if(start_data(&general_info))
 
    {
 
      fprintf(stderr, "%s:%d: start_data() failed\n", __FILE__, __LINE__);
 
      return 1;
 
    }
 

	
 
  /** pre-loaded jobs for testing */
 
  prepare_distrenjob(&general_info, 1, "awesome", "LordOfWar", 8, 1, 100, 640, 480);
 
  prepare_distrenjob(&general_info, 1, "hamburger", "ohnobinki", 3, 1, 50, 1280, 720);
 

	
 
 // Execute test function
 
 interactiveTest(test, general_info);
 

	
 
  distrend_listen(general_info.config, &clients);
 
  /* This is called the "main loop" */
 
  while(!general_info.config->die)
 
    {
 
      int clientsays = 0; /*< temporary example variable, will be replaced when we can handle messages */
 

	
 
      distrend_accept(general_info.config, clients);
 

	
 
      /* Make the following code more event-driven */
 
      frame_watchdog(&general_info.head);
 

	
 

	
 
      struct frameset *frame;
 
      struct distrenjob *job;
 

	
 
      /* If the client is idle, must be modified for climbing through linked list of clients (client->clientnum) */
 
      if(clientstatus == CLIENTSTATUS_IDLE)
 
	{
 
	  int returnnum = find_jobframe(&general_info, &job, &frame); // Finds a frame to render
 
	  if(returnnum)
 
	    {
 
	      fprintf(stderr,"No frames are available to render at this time. Idling...\n");
 
	      sleep(10);
 
	    }
 
	  else
 
	    remotio_send_to_client(frame->num, job->jobnum); // Pseudo-sends data to client
 
	}
 
      /* If the client states that they finished the frame */
 
      	if(clientsays == DISTREN_REQUEST_DONEFRAME){
 
      	  clientstatus = CLIENTSTATUS_IDLE; // Sets the client back to idle
 
      	  finish_frame(&general_info, job, frame->num); // @TODO: Make sure this actually works.
 
      	}
 
    } /* while(!general_info.config->die) */
 

	
 
  distrend_unlisten(general_info.config->listens, clients);
 
  distrend_config_free(general_info.config);
 

	
 
  xmlcleanup();
 

	
 
  /** free() paths */
 
  free(general_info.files.geninfo);
 

	
 
  return 0;
 
}
 

	
 
/* ********************** Functions ************************* */
 

	
 
@@ -141,11 +266,11 @@ int start_data(struct general_info *gene
 

	
 
      fprintf(stderr, "Parsing XML files and restoring previous state...\n");
 
      if(import_general_info(general_info))
 
	fprintf(stderr, "FAILURE\n");
 
        fprintf(stderr, "FAILURE\n");
 
      
 
      fprintf(stderr, "Restoring queue...\n");
 
      if(createQueueFromXML(general_info))
 
	fprintf(stderr, "FAILURE\n");
 
        fprintf(stderr, "FAILURE\n");
 
      
 
      fprintf(stderr, "done\n");
 
    }
 
@@ -182,15 +307,15 @@ int mortition(struct general_info *genin
 
  for(counter = 0; counter < job->total_frames; counter++)
 
    {
 
      _distren_asprintf(&path_and_number, "%s/stor/job%d/out/%d.%s",
 
			geninfo->config->datadir,
 
			job->jobnum,
 
			job->frameset[counter].num,
 
			job->output_format);
 
                        geninfo->config->datadir,
 
                        job->jobnum,
 
                        job->frameset[counter].num,
 
                        job->output_format);
 
      if(stat(path_and_number, &buffer) == -1)
 
        {
 
	  /**
 
	     missing frame found
 
	   */
 
          /**
 
             missing frame found
 
           */
 
          job->frameset[counter].status = FRAMESETSTATUS_UNASSIGNED;
 
          job->completed_frames--;
 
          geninfo->total_frames_rendered--;
 
@@ -202,7 +327,7 @@ int mortition(struct general_info *genin
 
  if(isJobDone)
 
    {
 
      /**
 
	 all frames were accounted for
 
         all frames were accounted for
 
      */
 
      distrenjob_remove(geninfo, job);
 
      distrenjob_free(&job);
 
@@ -302,7 +427,7 @@ int prepare_distrenjob(struct general_in
 
     add job to queue
 
  */
 
  fprintf(stderr, "prepare_distrenjob(): attempting distrenjob_serialize(%d, \"%s\")\n",
 
	  distrenjob->jobnum, serialfile);
 
          distrenjob->jobnum, serialfile);
 
  distrenjob_serialize(distrenjob, serialfile);
 
  free(serialfile);
 

	
 
@@ -341,17 +466,17 @@ int distrenjob_enqueue(struct general_in
 
    fprintf(stderr, "enqueue loop iteration\n");
 
    if(job->priority < current_job->priority)
 
      {
 
	/**
 
	   if job's priority is less than current_job's priority, insert job
 
	   keep in mind 1 is the highest priority given to jobs, head has a
 
	   priority of zero so it will always be before other jobs
 
	*/
 
	prev_job->next = job;
 
	job->next = current_job;
 
	fprintf(stderr, "added job before jobname: ``%s''\n", current_job->name);
 
        /**
 
           if job's priority is less than current_job's priority, insert job
 
           keep in mind 1 is the highest priority given to jobs, head has a
 
           priority of zero so it will always be before other jobs
 
        */
 
        prev_job->next = job;
 
        job->next = current_job;
 
        fprintf(stderr, "added job before jobname: ``%s''\n", current_job->name);
 

	
 
	geninfo->jobs_in_queue ++;
 
	return 0;
 
        geninfo->jobs_in_queue ++;
 
        return 0;
 
      }
 

	
 
    prev_job = current_job;
 
@@ -392,9 +517,9 @@ int change_job_priority(struct general_i
 
     iterate through linked list of jobs 
 
  */
 
    for(current_job = &geninfo->head;
 
	current_job != NULL
 
	  && job->priority > current_job->priority;
 
	current_job = current_job->next)
 
        current_job != NULL
 
          && job->priority > current_job->priority;
 
        current_job = current_job->next)
 
      prev_job = current_job;
 

	
 
    prev_job->next = job;
 
@@ -435,16 +560,16 @@ int find_jobframe(struct general_info *g
 
    {
 
      if(distrenjob_ptr->frameset[frame_counter].status == FRAMESETSTATUS_UNASSIGNED) // jobframe found
 
      {
 
    	found = 1;
 
    	distrenjob_ptr->frameset[frame_counter].status = FRAMESETSTATUS_ASSIGNED;
 
    	distrenjob_ptr->frameset[frame_counter].start_time = clock();
 
    	distrenjob_ptr->assigned_frames++;
 
    	distrenjob_ptr->prev_frame_index = frame_counter;
 
    	updateJobStatsXML(distrenjob_ptr);
 
        found = 1;
 
        distrenjob_ptr->frameset[frame_counter].status = FRAMESETSTATUS_ASSIGNED;
 
        distrenjob_ptr->frameset[frame_counter].start_time = clock();
 
        distrenjob_ptr->assigned_frames++;
 
        distrenjob_ptr->prev_frame_index = frame_counter;
 
        updateJobStatsXML(distrenjob_ptr);
 
      }
 

	
 
      if(found)
 
    	break;
 
        break;
 
    }
 

	
 
    if(found)
 
@@ -474,12 +599,12 @@ int find_jobframe_from_job(struct distre
 
  {
 
    if(distrenjob_ptr->frameset[frame_counter].status == FRAMESETSTATUS_UNASSIGNED) // jobframe found
 
      {
 
    	found = 1;
 
		distrenjob_ptr->frameset[frame_counter].status = FRAMESETSTATUS_ASSIGNED;
 
		distrenjob_ptr->frameset[frame_counter].start_time = clock();
 
		distrenjob_ptr->assigned_frames++;
 
		distrenjob_ptr->prev_frame_index = frame_counter;
 
		updateJobStatsXML(distrenjob_ptr);
 
        found = 1;
 
                distrenjob_ptr->frameset[frame_counter].status = FRAMESETSTATUS_ASSIGNED;
 
                distrenjob_ptr->frameset[frame_counter].start_time = clock();
 
                distrenjob_ptr->assigned_frames++;
 
                distrenjob_ptr->prev_frame_index = frame_counter;
 
                updateJobStatsXML(distrenjob_ptr);
 
      }
 

	
 
    if(found)
 
@@ -520,23 +645,23 @@ int find_jobframe_new(struct general_inf
 
      distrenjob_ptr && !distrenjob_ptr->hibernate;
 
      distrenjob_ptr = distrenjob_ptr->next)
 
  {
 
	  if(distrenjob_ptr->prev_frame_index < (distrenjob_ptr->total_frames - 1))
 
	  {
 
	    /**
 
	       Why is the number 11 found here again? --ohnobinki
 
	     */
 
		  power_difference = (((float)geninfo->total_render_power / (float)geninfo->total_priority_pieces) * ((float)distrenjob_ptr->priority));
 
		  power_difference = power_difference - (float)distrenjob_ptr->assigned_render_power;
 
          if(distrenjob_ptr->prev_frame_index < (distrenjob_ptr->total_frames - 1))
 
          {
 
            /**
 
               Why is the number 11 found here again? --ohnobinki
 
             */
 
                  power_difference = (((float)geninfo->total_render_power / (float)geninfo->total_priority_pieces) * ((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);
 
                  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)
 
@@ -569,7 +694,7 @@ int find_jobframe_again(struct general_i
 

	
 
      // 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;
 
          distrenjob_ptr->assigned_render_power = distrenjob_ptr->assigned_render_power - rend_pwr;
 

	
 
      return find_jobframe_new(geninfo, rend_pwr, job, frame);
 
    }
 
@@ -578,7 +703,7 @@ int find_jobframe_again(struct general_i
 
  found = find_jobframe_from_job(distrenjob_ptr, job, frame);
 

	
 
  if(found)
 
	  find_jobframe_new(geninfo, rend_pwr, job, frame);
 
          find_jobframe_new(geninfo, rend_pwr, job, frame);
 

	
 
  return 0;
 
}
 
@@ -596,7 +721,7 @@ void frame_watchdog(struct distrenjob *d
 
    if(distrenjob_ptr->frameset[0].status != FRAMESETSTATUS_UNASSIGNED || distrenjob_ptr->frameset[1].status != FRAMESETSTATUS_UNASSIGNED)
 
      /* iterate through all frames for this job: */
 
      for(counter = 0; counter < distrenjob_ptr->total_frames; counter ++)
 
	    /*watchdog_forgiveness = seconds of forgiveness before frame is re-assigned: */
 
            /*watchdog_forgiveness = seconds of forgiveness before frame is re-assigned: */
 
        if((distrenjob_ptr->frameset[counter].start_time + distrenjob_ptr->watchdog_forgiveness) < clock())
 
        {
 
            /*
 
@@ -645,7 +770,7 @@ void distrenjob_remove(struct general_in
 

	
 
  for(previous_distrenjob = &geninfo->head;
 
      previous_distrenjob
 
	&& previous_distrenjob->next != bj; /*< stop on the distrenjob that comes before bj */
 
        && previous_distrenjob->next != bj; /*< stop on the distrenjob that comes before bj */
 
      previous_distrenjob = previous_distrenjob->next)
 
    ;
 

	
 
@@ -801,7 +926,7 @@ int restore_distrenjob(struct general_in
 
  tmp = distrenjob_unserialize(distrenjob, file_name);
 
  if(tmp)
 
    fprintf(stderr, "failed to load job %d from ``%s''\n",
 
	    jobnum, file_name);
 
            jobnum, file_name);
 
  
 
  free(file_name);
 
  return tmp;
 
@@ -809,45 +934,45 @@ int restore_distrenjob(struct general_in
 

	
 
int updateJobStatsXML(struct distrenjob *job)
 
{
 
	  xmlTextWriterPtr writer;
 
	  char *tmp;
 
          xmlTextWriterPtr writer;
 
          char *tmp;
 

	
 
	  _distren_asprintf(&tmp, "stor/job%d/stats.xml", job->jobnum);
 
          _distren_asprintf(&tmp, "stor/job%d/stats.xml", job->jobnum);
 

	
 
	  /**
 
	     create xml document at the location tmp with no compression
 
	  */
 
	  writer = xmlNewTextWriterFilename(tmp, 0);
 
	  free(tmp);
 
	  xmlTextWriterStartDocument(writer, NULL, "utf-8", NULL);
 
          /**
 
             create xml document at the location tmp with no compression
 
          */
 
          writer = xmlNewTextWriterFilename(tmp, 0);
 
          free(tmp);
 
          xmlTextWriterStartDocument(writer, NULL, "utf-8", NULL);
 

	
 
	  xmlTextWriterStartElement(writer, (xmlChar*)"stats");
 
	  _distren_asprintf(&tmp, "%d", job->assigned_frames);
 
	  xmlTextWriterWriteAttribute(writer, (xmlChar*)"assigned_frames", (xmlChar*)tmp);
 
	  free(tmp);
 
          xmlTextWriterStartElement(writer, (xmlChar*)"stats");
 
          _distren_asprintf(&tmp, "%d", job->assigned_frames);
 
          xmlTextWriterWriteAttribute(writer, (xmlChar*)"assigned_frames", (xmlChar*)tmp);
 
          free(tmp);
 

	
 
	  _distren_asprintf(&tmp, "%d", job->completed_frames);
 
	  xmlTextWriterWriteAttribute(writer, (xmlChar*)"completed_frames", (xmlChar*)tmp);
 
	  free(tmp);
 
          _distren_asprintf(&tmp, "%d", job->completed_frames);
 
          xmlTextWriterWriteAttribute(writer, (xmlChar*)"completed_frames", (xmlChar*)tmp);
 
          free(tmp);
 

	
 
	  _distren_asprintf(&tmp, "%d", job->total_render_time);
 
	  xmlTextWriterWriteAttribute(writer, (xmlChar*)"total_render_time", (xmlChar*)tmp);
 
	  free(tmp);
 
          _distren_asprintf(&tmp, "%d", job->total_render_time);
 
          xmlTextWriterWriteAttribute(writer, (xmlChar*)"total_render_time", (xmlChar*)tmp);
 
          free(tmp);
 

	
 
	  /**
 
	     end document
 
	  */
 
	  xmlTextWriterEndDocument(writer);
 
	  /**
 
	     free writer and save xml file to disk
 
	     @TODO confirma that calling xmlFreeTextWriter calls
 
	           write() and close(), respectively.
 
		   (close() causes asynchronous writes to be
 
		   completed).
 
	  */
 
	  xmlFreeTextWriter(writer);
 
          /**
 
             end document
 
          */
 
          xmlTextWriterEndDocument(writer);
 
          /**
 
             free writer and save xml file to disk
 
             @TODO confirma that calling xmlFreeTextWriter calls
 
                   write() and close(), respectively.
 
                   (close() causes asynchronous writes to be
 
                   completed).
 
          */
 
          xmlFreeTextWriter(writer);
 

	
 
	  return 1;
 
          return 1;
 
}
 

	
 

	
 
@@ -870,7 +995,7 @@ int update_xml_joblist(struct general_in
 
    geninfo->timestamp = 0;
 

	
 
  _distren_asprintf(&tmp, "%s/job_list.xml",
 
		    geninfo->config->datadir);
 
                    geninfo->config->datadir);
 
  writer = xmlNewTextWriterFilename(tmp, 0);
 
  free(tmp);
 

	
 
@@ -894,9 +1019,9 @@ int update_xml_joblist(struct general_in
 
      free(tmp);
 

	
 
      /**
 
	this is needed for the new frame finder to work 
 
        this is needed for the new frame finder to work
 
      
 
	Why the random constant numeral 11? --ohnobinki
 
        Why the random constant numeral 11? --ohnobinki
 
      */
 
      geninfo->total_priority_pieces = geninfo->total_priority_pieces + job->priority;
 

	
 
@@ -940,7 +1065,7 @@ int createQueueFromXML(struct general_in
 
  if(doc == NULL)
 
    {
 
      fprintf(stderr, "createQueueFromXML: ``%s'' could not be not loaded\n",
 
	      xmllist_path);
 
              xmllist_path);
 

	
 
      free(xmllist_path);
 
      return 1;
 
@@ -998,7 +1123,7 @@ int reCreateQueueFromXML(struct general_
 
    /**
 
       bail if failure recursevely
 
        ^-- is this the best thing to do in this case?
 
	@TODO bail-out cleanup
 
        @TODO bail-out cleanup
 
     */
 
    return 1;
 

	
 
@@ -1096,27 +1221,7 @@ int printAllJobnums(struct distrenjob *h
 
  return 1;
 
}
 

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

	
 
int main(int argc, char *argv[])
 
{
 

	
 
  /* Argument-parser */
 
  int counter;
 
  int test; /*< Interactive mode if 1 */
 

	
 
  struct general_info general_info;
 

	
 
  int cont;
 
  struct distrend_clientset *clients;
 

	
 
  enum clientstatus
 
  {
 
    CLIENTSTATUS_UNINITIALIZED = 0,
 
    CLIENTSTATUS_BUSY = 1,
 
    CLIENTSTATUS_IDLE = 2
 
  } clientstatus;
 

	
 
int interactiveTest(int test, struct general_info general_info){
 
  int command;
 
  jobnum_t jobnum;
 
  struct distrenjob *tmp_job;
 
@@ -1132,160 +1237,81 @@ int main(int argc, char *argv[])
 
  int end_frame;
 
  size_t read_buf;
 

	
 
  xmlinit();
 

	
 
  test = 0;
 
  for(counter = 0; counter < argc; counter ++)
 
    {
 
      if(strcmp(argv[counter], "-h") == 0)
 
      {
 
    	  fprintf(stderr, "Usage: distrend [option] \nStarts the distrend server\n\t-h\tshow this help\n\t-t\tlaunches queue testing interface \n");
 
		  return 2;
 
      }
 
  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 \tPrint general info\n");
 
     fprintf(stderr, "\t8 \tQuit\n");
 

	
 
      else if(strcmp(argv[counter], "-t") == 0)
 
      {
 
    	  fprintf(stderr, "Entering into test mode...\n\n");
 
		  test=1;
 
      }
 
    }
 
  cont = 1;
 

	
 
  if(distrend_do_config(argc, argv, &general_info.config))
 
    return 1;
 

	
 
  /** preset paths */
 
  _distren_asprintf(&general_info.files.geninfo, "%s/general_info.xml",
 
		    general_info.config->datadir);
 

	
 
  if(start_data(&general_info))
 
    {
 
      fprintf(stderr, "%s:%d: start_data() failed\n", __FILE__, __LINE__);
 
      return 1;
 
    }
 

	
 
  /** pre-loaded jobs for testing */
 
  prepare_distrenjob(&general_info, 1, "awesome", "LordOfWar", 8, 1, 100, 640, 480);
 
  prepare_distrenjob(&general_info, 1, "hamburger", "ohnobinki", 3, 1, 50, 1280, 720);
 
     scanf("%d", &command);
 

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

	
 
    scanf("%d", &command);
 

	
 
    switch(command)
 
    {
 
    case 1:
 
      fprintf(stderr, "Job number: ");
 
      scanf("%d", &jobnum);
 
      printJob(distrenjob_get(&general_info.head, jobnum));
 
      break;
 
    case 2:
 
      fprintf(stderr, "Job number: ");
 
      scanf("%d", &jobnum);
 
      printJobInfo(distrenjob_get(&general_info.head, jobnum));
 
      break;
 
    case 3:
 
      general_info.total_render_power ++;
 
      if(!find_jobframe_again(&general_info, -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);
 
      }
 

	
 
      break;
 
    case 4:
 
      name = NULL;
 
      submitter = NULL;
 
      email = NULL;
 
     switch(command)
 
     {
 
     case 1:
 
       fprintf(stderr, "Job number: ");
 
       scanf("%d", &jobnum);
 
       printJob(distrenjob_get(&general_info.head, jobnum));
 
       break;
 
     case 2:
 
       fprintf(stderr, "Job number: ");
 
       scanf("%d", &jobnum);
 
       printJobInfo(distrenjob_get(&general_info.head, jobnum));
 
       break;
 
     case 3:
 
       general_info.total_render_power ++;
 
       if(!find_jobframe_again(&general_info, -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);
 
       }
 

	
 
      fprintf(stderr, "\nType: \n\t 1 \t blender\n\t 2 \t povray\n"); scanf("%d", &type);
 
      fprintf(stderr, "\nName: ");        scanf("\n"); getline(&name, &read_buf, stdin);
 
      fprintf(stderr, "\nSubmitter: ");                getline(&submitter, &read_buf, stdin);
 
      fprintf(stderr, "\nEmail: ");                    getline(&email, &read_buf, stdin);
 
      fprintf(stderr, "\nPriority: ");                 scanf("%d", &priority);
 
      fprintf(stderr, "\nStart frame: ");              scanf("%d", &start_frame);
 
      fprintf(stderr, "\nEnd frame: ");                scanf("%d", &end_frame);
 
      fprintf(stderr, "\nWidth: ");                    scanf("%d", &width);
 
      fprintf(stderr, "\nHeight: ");                   scanf("%d", &height);
 
      prepare_distrenjob(&general_info, type, name, submitter, priority, start_frame, end_frame, width, height);
 
      break;
 
    case 5:
 
      fprintf(stderr, "\nJob number: ");
 
      scanf("%d", &jobnum);
 
      distrenjob_remove(&general_info, distrenjob_get(&general_info.head, jobnum));
 
      break;
 
    case 6:
 
      printAllJobnums(&general_info.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: %lu", (long)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");
 
    }
 
  }
 
       break;
 
     case 4:
 
       name = NULL;
 
       submitter = NULL;
 
       email = NULL;
 

	
 
  distrend_listen(general_info.config, &clients);
 
  /* This is called the "main loop" */
 
  while(!general_info.config->die)
 
    {
 
      int clientsays = 0; /*< temporary example variable, will be replaced when we can handle messages */
 

	
 
      distrend_accept(general_info.config, clients);
 

	
 
      /* Make the following code more event-driven */
 
      frame_watchdog(&general_info.head);
 

	
 

	
 
      struct frameset *frame;
 
      struct distrenjob *job;
 

	
 
      /* If the client is idle, must be modified for climbing through linked list of clients (client->clientnum) */
 
      if(clientstatus == CLIENTSTATUS_IDLE)
 
	{
 
	  int returnnum = find_jobframe(&general_info, &job, &frame); // Finds a frame to render
 
	  if(returnnum)
 
	    {
 
	      fprintf(stderr,"No frames are available to render at this time. Idling...\n");
 
	      sleep(10);
 
	    }
 
	  else
 
	    remotio_send_to_client(frame->num, job->jobnum); // Pseudo-sends data to client
 
	}
 
      /* If the client states that they finished the frame */
 
      	if(clientsays == DISTREN_REQUEST_DONEFRAME){
 
      	  clientstatus = CLIENTSTATUS_IDLE; // Sets the client back to idle
 
      	  finish_frame(&general_info, job, frame->num); // @TODO: Make sure this actually works.
 
      	}
 
    } /* while(!general_info.config->die) */
 

	
 
  distrend_unlisten(general_info.config->listens, clients);
 
  distrend_config_free(general_info.config);
 

	
 
  xmlcleanup();
 

	
 
  /** free() paths */
 
  free(general_info.files.geninfo);
 

	
 
       fprintf(stderr, "\nType: \n\t 1 \t blender\n\t 2 \t povray\n"); scanf("%d", &type);
 
       fprintf(stderr, "\nName: ");        scanf("\n"); getline(&name, &read_buf, stdin);
 
       fprintf(stderr, "\nSubmitter: ");                getline(&submitter, &read_buf, stdin);
 
       fprintf(stderr, "\nEmail: ");                    getline(&email, &read_buf, stdin);
 
       fprintf(stderr, "\nPriority: ");                 scanf("%d", &priority);
 
       fprintf(stderr, "\nStart frame: ");              scanf("%d", &start_frame);
 
       fprintf(stderr, "\nEnd frame: ");                scanf("%d", &end_frame);
 
       fprintf(stderr, "\nWidth: ");                    scanf("%d", &width);
 
       fprintf(stderr, "\nHeight: ");                   scanf("%d", &height);
 
       prepare_distrenjob(&general_info, type, name, submitter, priority, start_frame, end_frame, width, height);
 
       break;
 
     case 5:
 
       fprintf(stderr, "\nJob number: ");
 
       scanf("%d", &jobnum);
 
       distrenjob_remove(&general_info, distrenjob_get(&general_info.head, jobnum));
 
       break;
 
     case 6:
 
       printAllJobnums(&general_info.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: %lu", (long)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");
 
       test = 0;
 
     default:
 
       fprintf(stderr, "Invalid input, please try again.\n");
 
     }
 
   }
 
  return 0;
 
}
 

	
0 comments (0 inline, 0 general)