trick/trick_source/sim_services/Executive/Executive_init.cpp
Alex Lin 46aec08b80 Add direct STL checkpointing
Initial checkin of STL checkpointing.  This checkin only covers the sequential
STLs, vector, list, deque, set, and multiset.  This checkin does include the
changes in Trick header files to include/exclude our STLs properly to make a
restartable checkpoint.

refs #206
2016-03-29 09:26:49 -05:00

90 lines
2.9 KiB
C++

#include <iostream>
#include <stdlib.h>
#include <sys/resource.h>
#include "trick/Executive.hh"
#include "trick/ExecutiveException.hh"
#include "trick/exec_proto.h"
/**
@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. */
} catch (Trick::ExecutiveException & ex ) {
/* 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::init 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::init 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) ;
}