Changeset - a6a648e19f34
[Not reviewed]
default
0 1 0
NEO - 16 years ago 2009-07-12 18:59:13

added struct general_info and added statements through out the code to update it... but due to errors it doesn't seem to have recognized the struct...
1 file changed with 23 insertions and 7 deletions:
0 comments (0 inline, 0 general)
src/server/distrend.c
Show inline comments
 
@@ -62,25 +62,31 @@ struct distrend_config
 
/*
 
 frame[frame] Status Assignments:
 
  "NULL" - don't render me
 
  "0" - canceled
 
  "1" - unassigned
 
  "2" - assigned to slave
 
  "3" - completed by slave and uploaded
 

	
 
 Have a script crawl through each job in the arrays, priority-biased, and assign a frame to each slave.
 
 Then we will need some sort of watchdog to monitor slaves on the main server to check for stales. Maybe not worry about this for now.
 
*/
 

	
 

	
 
struct general_info {
 
	short int jobs_in_queue; //
 
	unsigned short int free_clients;
 
	unsigned short int rendering_clients;//
 
	unsigned short int total_finished_jobs; //
 
	unsigned int total_frames_rendered; //
 
};
 

	
 
// Stores Blender Job Info
 
struct blendjob {
 
  char *name;
 
  char *submitter;
 
  char *email;
 
  int priority;  // 1 is lowest, 10 is highest, 0 is done
 
  int percent_done;
 
  int completed_frames; // number of completed frames for stats/etc
 
  int assigned_frames; // number of assigned frames (that are not yet completed) for stats/etc
 
  int total_frames; // how many frames are in the animation for stats/etc
 
  int avg_render_time; // average seconds it took to render a frame
 
@@ -101,24 +107,26 @@ struct frameset {
 
                         // Using this method to save memory, because if animation starts on a high frame number, it would waste a lot of RAM on empty structures
 

	
 

	
 

	
 

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

	
 
// **** Finish-Setter: Sets a frame to the "completed" status.
 
void finish_frame(int jobnum, int frame){
 
  blendjob[jobnum].frameset[frame].frame_status = 2;
 

	
 
  blendjob[jobnum].frameset[frame].time_to_render = (clock() - blendjob[jobnum].frameset[frame].start_time);
 

	
 
  general_info.total_frames_rendered++;
 
}
 

	
 

	
 
// **** Queuer: Adds files to the queue
 
void queue(int type, char *name, char *submitter, char *email, int priority, int mode, int spp, struct frameset *frameset) {
 
	// Type: 1 = blender, add more types later
 
	// jobnum is the next available job number
 
	if(type == 1){
 
    blendjob[jobnum].name = name;
 
    blendjob[jobnum].submitter = submitter;
 
    blendjob[jobnum].email = email;
 
    blendjob[jobnum].priority = priority;
 
@@ -130,82 +138,90 @@ void queue(int type, char *name, char *s
 
jobnum++; // Advance the jobnumber for the next queued job
 
}
 

	
 

	
 
// **** Status Report Generator: figures out how much of the job is done, where jobnum corresponds to the job number
 
// This uses pointers, so when it is run it updates certain values in memory
 
void status_report_generator(){
 

	
 
	while(blendjob[(hcfjob+1)].priority == 0)  //If the job after the highest consecutively finished job is finished
 
		hcfjob++;  // adds 1 to the highest consecutively finished job and checks the next one, till the job after the hcfjob is not done
 

	
 
	int num1 = hcfjob+1; // to scan through jobs
 
	unsigned short int workers_working; // used to count the total number of workers working
 

	
 

	
 
	while(num1 <= highest_jobnum){
 
			if(blendjob[num1].priority != 0){ // If the job is not done, scan it
 

	
 
				int num2 = 0;  // to scan through frames
 
				float finished_frames = 0; // variable that counts the completed frames
 
				int pending_frames = 0; // variable that counts the assigned frames
 
				float percent = 0;  // variable that stores the percent done of the blendjob
 
				unsigned int total_time = 0;  // total time taken to render all the completed frames for a job
 

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

	
 
					if(blendjob[num1].frameset[num2].frame_status == 1) // If the frame is assigned
 
					if(blendjob[num1].frameset[num2].frame_status == 1){ // If the frame is assigned
 
						pending_frames++;
 

	
 
						workers_working++;
 
					}
 
					num2++;
 
				}
 

	
 
				// find the percent of completed frames
 
				percent = (finished_frames / blendjob[num1].total_frames) * 100;
 

	
 
				// updates values in the blendjob struct for jobnum held by the variable num1
 
				blendjob[num1].completed_frames = finished_frames;
 
				blendjob[num1].assigned_frames = pending_frames;
 
				blendjob[num1].percent_done = percent;
 
				blendjob[num1].avg_render_time = (total_time / finished_frames);
 
				blendjob[num1].time_remaining = (blendjob[num1].avg_render_time * (blendjob[num1].total_frames - finished_frames));
 

	
 
				if(finished_frames == blendjob[num1].total_frames)  // If all frames are complete, set priority to zero to indicate job is complete
 
					blendjob[num1].priority = 0;
 
				if(finished_frames == blendjob[num1].total_frames){  // If all frames are complete
 
					blendjob[num1].priority = 0;					//set priority to zero to indicate job is complete
 
					general_info.total_finished_jobs++; // add one to the total finished jobs
 

	
 
				}
 
			}
 

	
 
			num1++;
 
			general_info.rendering_clients = workers_working;
 
		}
 

	
 
		general_info.jobs_in_queue = (highest_jobnum - general_info.total_finished_jobs);
 
	}
 

	
 

	
 
// **** Structure Builder: This function creates frame array based on the total number of frames to be rendered, which will then be parsed by function frame_farmer.
 
void frame_num_struct_builder(int sframe, int eframe) {
 
	int jobnum_new = highest_jobnum + 1;
 
	int total = (sframe - eframe) +1;  // total number of frames
 
	int fcount = sframe; // Used to create all the frames in the structure from sframe to eframe
 
	int x = 0;
 

	
 
	blendjob[jobnum_new].total_frames = total; // sets the total number of frames in animation for status purposes
 

	
 
	while(x < total){
 
	while(x < total){ // This builds the array, with the array starting at zero and the frame_num starting at sframe
 
		blendjob[jobnum_new].frameset[x].frame_num = fcount;
 
		x++;
 
		fcount++;
 
	}
 

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

	
 

	
 

	
 
// Frame Assigner: matches your computer up with a lovely frame to render
 
int frame_finder(){
 
	int your_frame = 0;  // your_frame is an interger value that will be given to the client as the frame number to render
 
	int finder_jobnum = 0;
 
	int frameset_count = 0; // the frameset number, note* frames in an animation don't start at zero
 
	short int done = 0;
 
	short int priority = 10;
 

	
0 comments (0 inline, 0 general)