2015-02-26 15:02:31 +00:00
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <sys/resource.h>
|
|
|
|
|
2015-06-01 15:28:29 +00:00
|
|
|
#include "trick/Executive.hh"
|
2015-06-02 13:29:34 +00:00
|
|
|
#include "trick/ExecutiveException.hh"
|
2015-06-01 15:28:29 +00:00
|
|
|
#include "trick/exec_proto.h"
|
2015-02-26 15:02:31 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
@details
|
|
|
|
-# Set the mode to Initialization
|
|
|
|
Requirement [@ref r_exec_mode_0].
|
|
|
|
-# Start the cpu usage meter
|
|
|
|
-# Call the default_data jobs
|
|
|
|
-# Call the initialization jobs.
|
|
|
|
-# Record the cpu usage during initialization
|
|
|
|
-# The scheduler initializes simulation timers.
|
|
|
|
Requirement [@ref r_exec_time_1].
|
|
|
|
-# If an exception is caught, print as much error information available based
|
|
|
|
on execption type caught and exit.
|
|
|
|
-# If no execption is caught return 0
|
|
|
|
*/
|
|
|
|
int Trick::Executive::init() {
|
|
|
|
|
|
|
|
double cpu_time ;
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
mode = Initialization ;
|
|
|
|
|
|
|
|
/* Start the cpu usage meter */
|
|
|
|
struct rusage cpu_usage_buf ;
|
|
|
|
getrusage(RUSAGE_SELF, &cpu_usage_buf);
|
|
|
|
cpu_start = ((double) cpu_usage_buf.ru_utime.tv_sec) + ((double) cpu_usage_buf.ru_utime.tv_usec / 1000000.0);
|
|
|
|
|
|
|
|
call_default_data() ;
|
|
|
|
|
|
|
|
call_input_processor() ;
|
|
|
|
|
|
|
|
// If we are starting from a checkpoint, restart_called will be true. Skip init routines in this case.
|
|
|
|
if ( ! restart_called ) {
|
|
|
|
call_initialization() ;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Set the initial values for the scheduler times. */
|
|
|
|
next_frame_check_tics = software_frame_tics + time_tics ;
|
|
|
|
job_call_time_tics = next_frame_check_tics ;
|
|
|
|
sim_start = get_sim_time();
|
|
|
|
|
|
|
|
/* Record the cpu usage for initialization */
|
|
|
|
getrusage(RUSAGE_SELF, &cpu_usage_buf);
|
|
|
|
cpu_time = ((double) cpu_usage_buf.ru_utime.tv_sec) + ((double) cpu_usage_buf.ru_utime.tv_usec / 1000000.0);
|
|
|
|
cpu_init = cpu_time - cpu_start;
|
|
|
|
|
|
|
|
initialization_complete = true ;
|
|
|
|
|
|
|
|
/* Print as much error information avaiable for all exception and exit. */
|
2015-06-02 13:29:34 +00:00
|
|
|
} catch (Trick::ExecutiveException & ex ) {
|
2015-02-26 15:02:31 +00:00
|
|
|
/* Set the exit return code, file name, and error message. Return -1 so we go to shutdown */
|
|
|
|
except_return = ex.ret_code ;
|
|
|
|
except_file = ex.file ;
|
|
|
|
except_message = ex.message ;
|
|
|
|
return(-1) ;
|
|
|
|
} catch (const std::exception &ex) {
|
|
|
|
if ( curr_job != NULL ) {
|
|
|
|
except_file = curr_job->name ;
|
|
|
|
} else {
|
|
|
|
except_file = "somewhere in Executive::init" ;
|
|
|
|
}
|
|
|
|
fprintf(stderr, "\nExecutive::loop terminated with std::exception\n ROUTINE: %s\n DIAGNOSTIC: %s\n",
|
|
|
|
except_file.c_str(), ex.what()) ;
|
|
|
|
exit(-1) ;
|
|
|
|
} catch (...) {
|
|
|
|
if ( curr_job != NULL ) {
|
|
|
|
except_file = curr_job->name ;
|
|
|
|
} else {
|
|
|
|
except_file = "somewhere in Executive::init" ;
|
|
|
|
}
|
|
|
|
except_message = "unknown error" ;
|
|
|
|
fprintf(stderr, "\nExecutive::loop terminated with unknown exception\n ROUTINE: %s\n DIAGNOSTIC: %s\n",
|
|
|
|
except_file.c_str() , except_message.c_str()) ;
|
|
|
|
exit(-1) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* return 0 if there are no errors. */
|
|
|
|
return(0) ;
|
|
|
|
}
|
|
|
|
|