trick/trick_source/sim_services/Executive/Executive_instrument_job.cpp
Alex Lin 0072e7d6f0 Unintended performance issue with integ_loop at end of scheduled job classes #243
Created a new executive job that waits for threads to finish and readies them
for their next frame of execution.  Created a new job class system_thread_sync
after the top of frame jobs and before the input processor is run to sync the
threads.  Along the way cleaned up instrumentation jobs on the threads to fix #290.
2016-08-24 10:55:27 -05:00

132 lines
4.9 KiB
C++

#include <iostream>
#include <iomanip>
#include "trick/Executive.hh"
int Trick::Executive::instrument_job_before( std::string in_job , unsigned int instance ) {
Trick::JobData * instrument_job ;
instrument_job = get_job(in_job , instance) ;
return instrument_job_before( instrument_job ) ;
}
int Trick::Executive::instrument_job_before( Trick::JobData * instrument_job ) {
unsigned int ii, count ;
count = 0 ;
if ( instrument_job != NULL ) {
// instrument scheduled jobs
for ( ii = 0 ; ii < threads.size() ; ii++ ) {
count += threads[ii]->job_queue.instrument_before(instrument_job) ;
count += threads[ii]->top_of_frame_queue.instrument_before(instrument_job) ;
count += threads[ii]->end_of_frame_queue.instrument_before(instrument_job) ;
}
// instrument other queued jobs
// cannot instrument default_data because they come before input processor
count += default_data_queue.instrument_before(instrument_job) ;
count += initialization_queue.instrument_before(instrument_job) ;
count += top_of_frame_queue.instrument_before(instrument_job) ;
count += end_of_frame_queue.instrument_before(instrument_job) ;
count += shutdown_queue.instrument_before(instrument_job) ;
count += freeze_init_queue.instrument_before(instrument_job) ;
count += freeze_scheduled_queue.instrument_before(instrument_job) ;
count += freeze_queue.instrument_before(instrument_job) ;
count += unfreeze_queue.instrument_before(instrument_job) ;
count += time_tic_changed_queue.instrument_before(instrument_job) ;
count += thread_sync_queue.instrument_before(instrument_job) ;
for ( ii = 0 ; ii < other_schedulers.size() ; ii++ ) {
count += other_schedulers[ii]->instrument_job_before( instrument_job ) ;
}
}
return(count) ;
}
int Trick::Executive::instrument_job_after( std::string in_job , unsigned int instance ) {
Trick::JobData * instrument_job ;
instrument_job = get_job(in_job , instance) ;
return instrument_job_after( instrument_job ) ;
}
int Trick::Executive::instrument_job_after( Trick::JobData * instrument_job) {
unsigned int ii, count ;
count = 0 ;
if ( instrument_job != NULL ) {
// instrument scheduled jobs
for ( ii = 0 ; ii < threads.size() ; ii++ ) {
count += threads[ii]->job_queue.instrument_after(instrument_job) ;
count += threads[ii]->top_of_frame_queue.instrument_after(instrument_job) ;
count += threads[ii]->end_of_frame_queue.instrument_after(instrument_job) ;
}
// instrument other queued jobs
// cannot instrument default_data because they come after input processor
count += default_data_queue.instrument_after(instrument_job) ;
count += initialization_queue.instrument_after(instrument_job) ;
count += top_of_frame_queue.instrument_after(instrument_job) ;
count += end_of_frame_queue.instrument_after(instrument_job) ;
count += shutdown_queue.instrument_after(instrument_job) ;
count += freeze_init_queue.instrument_after(instrument_job) ;
count += freeze_scheduled_queue.instrument_after(instrument_job) ;
count += freeze_queue.instrument_after(instrument_job) ;
count += unfreeze_queue.instrument_after(instrument_job) ;
count += time_tic_changed_queue.instrument_after(instrument_job) ;
count += thread_sync_queue.instrument_after(instrument_job) ;
for ( ii = 0 ; ii < other_schedulers.size() ; ii++ ) {
count += other_schedulers[ii]->instrument_job_after( instrument_job ) ;
}
}
return(count) ;
}
int Trick::Executive::instrument_job_remove(std::string in_job) {
unsigned int ii ;
/** @par Detailed Design */
/** @li Remove instrumentation job from initialization, scheduled,
integration, end of frame, & shutdown queues by calling ScheduledJobQueue::instrument_remove(string). */
default_data_queue.instrument_remove(in_job) ;
initialization_queue.instrument_remove(in_job) ;
top_of_frame_queue.instrument_remove(in_job) ;
end_of_frame_queue.instrument_remove(in_job) ;
shutdown_queue.instrument_remove(in_job) ;
freeze_init_queue.instrument_remove(in_job) ;
freeze_scheduled_queue.instrument_remove(in_job) ;
freeze_queue.instrument_remove(in_job) ;
unfreeze_queue.instrument_remove(in_job) ;
time_tic_changed_queue.instrument_remove(in_job) ;
thread_sync_queue.instrument_remove(in_job) ;
for ( ii = 0 ; ii < threads.size() ; ii++ ) {
threads[ii]->job_queue.instrument_remove(in_job) ;
threads[ii]->top_of_frame_queue.instrument_remove(in_job) ;
threads[ii]->end_of_frame_queue.instrument_remove(in_job) ;
}
for ( ii = 0 ; ii < other_schedulers.size() ; ii++ ) {
other_schedulers[ii]->instrument_job_remove(in_job) ;
}
return(0) ;
}