trick/include/trick/ScheduledJobQueue.hh
Alex Lin 19025d77ad Standardize directory names
Reorganized.  Created a new top level include directory that will hold all of Trick's header files. Moved all of the Trick headers to this directory.  Created a libexec directory that holds all of the executables that users don't need to execute directly.  Changed all of the executables remaining in bin to start with "trick-".  In the sim_services directories changed all source files to find the Trick headers in their new location.  Since all of the include files are gone in sim_services, removed the src directories as well, moving all of the source files up a level.  Moved the makefiles, docs, man, and other architecture independent files into a top level share directory.  Renamed lib_${TRICK_HOST_CPU} to lib64 or lib depending on the platform we're currently on.

refs #63
2015-06-09 08:44:42 -05:00

217 lines
7.9 KiB
C++

/*
PURPOSE:
(Class to hold queue of scheduled jobs)
*/
#ifndef SCHEDULEDJOBQUEUE_HH
#define SCHEDULEDJOBQUEUE_HH
#include <string>
#include "trick/JobData.hh"
namespace Trick {
/**
* The ScheduledJobQueue is specifically for the scheduled jobs. It does not
* allocate memory during normal cycling through jobs and is considerably
* faster than the generalized priority_queue.
*
* @author Robert W. Bailey
* @author many other Trick developers of the past who did not add their names.
* @author Alexander S. Lin
*/
class ScheduledJobQueue {
friend class ScheduledJobQueueTest ;
public:
/**
* @brief This is the constructor of the class. It initializes
* the most member data to 0, or TRICK_MAX_LONG_LONG for next_job_time
*/
ScheduledJobQueue() ;
/**
* @brief This is the destructor of the class. It frees list.
*/
~ScheduledJobQueue() ;
/**
* @brief Adds a new job into list. The exact placement of job is dependent on
* job_class, phase , sim_object order , and finally job order in sim object.
* @param in_job - Job to add to the list
* @return always 0.
*/
int push(JobData * in_job ) ;
/**
* @brief Adds a new job into list ignoring the sim_object id. This is useful for
* schedulers that redefine the order sim_objects are processed and are only
* concerned with phase ordering.
* @param in_job - Job to add to the list
* @return always 0.
*/
int push_ignore_sim_object(JobData * in_job ) ;
/**
* @brief Removes a job from the list if present.
* @param in_job - Job to remove to the list
* @return always 0.
*/
int remove(JobData * in_job ) ;
/**
* @brief Gets the curr_index.
* @return curr_index.
*/
unsigned int get_curr_index() ;
/**
* @brief Sets the curr_index to value.
* @param value - Value of index.
* @return always 0.
*/
int set_curr_index( unsigned int ii ) ;
/**
* @brief Resets the curr_index data member to 0.
* @return always 0.
*/
int reset_curr_index() ;
/**
* @brief Returns the size of the queue
* @return the number of elements in the queue.
*/
unsigned int size() ;
/**
* @brief Tests if the list is empty or not.
* @return 0 if the list is empty or 1 if the list has at least one job.
*/
bool empty() ;
/**
* @brief Clears the list of jobs.
* @return 0
*/
int clear() ;
/**
* @brief Clears the list of jobs.
* @return 0
*/
int execute_all_jobs() ;
/**
* @brief Write all job information out as scheduled jobs in a format suitable for S_job_execution
* @return 0
*/
int write_sched_queue( FILE * fp ) ;
/**
* @brief Write all job information out as non scheduled jobs in a format suitable for S_job_execution
* @return 0
*/
int write_non_sched_queue( FILE * fp ) ;
/**
* @brief Adds the incoming instrumentation job before target job if specified, or all jobs in list.
* Will reallocate list to accommodate additional instrumentation jobs.
* @param instrumentation_job - name of the instrument job
* @param target_job - name of the target job, empty string means all jobs are to be instrumented
* @param in_event - instrumentation data to be stored with instrument job
* @return number of insertions made
*/
int instrument_before(JobData * instrumentation_job) ;
/**
* @brief Adds the incoming instrumentation job after target job if specified, or all jobs in the list.
* Will reallocate list to accommodate additional instrumentation jobs.
* @param instrumentation_job - name of the instrument job
* @param target_job - name of the target job, empty string means all jobs are to be instrumented
* @param in_event - instrumentation data to be stored with instrument job
* @return number of insertions made
*/
int instrument_after(JobData * instrumentation_job) ;
/**
* @brief Removes all jobs in the list that match the name job_name.
* If in_event is specified, only remove this event's instrument job.
* @param job_name - name of the instrument job
* @param in_event - instrumentation data to be stored with instrument job
* @return always 0
*/
int instrument_remove(std::string job_name) ;
/**
* @brief Gets the job pointed to by current_index, the top of the list.
* @return top job in the list, or NULL if the list is empty.
*/
JobData * top() ;
/**
* @brief Gets the job pointed to by current_index, the top of the list.
* Increments current_index to advance to next job.
* @return top job in the list, or NULL if the list is empty or the end of list reached.
*/
JobData * get_next_job() ;
/**
* @brief Finds the next job where the next job call time equals the incoming time.
* @param time - the requested time next job call time
* @return next job in list who's next call time matches incoming time, or NULL if no match found.
*/
JobData * find_next_job(long long time ) ;
/**
* @brief Finds the next job where the next job call time equals the incoming time. Does not
* update any information so find_next_job can still find the job returned by this function.
* @param time - the requested time next job call time
* @return next job in list who's next call time matches incoming time, or NULL if no match found.
*/
JobData * find_job(long long time ) ;
/**
* @brief Sets the next_job_call_time to the incoming time
* @param in_time - the requested next job call time
* @return always 0
*/
int set_next_job_call_time(long long in_time ) ;
/**
* @brief Returns the next_job_time tracked while looping through jobs with find_next_job(long long)
* @return next job call time in tics. Design [@ref d_schedqueue_getnextcalltime_0]
*/
long long get_next_job_call_time() ;
/**
* @brief tests the current job next job call time against the current time and the overall next job call
* time. Sets the overall next job call time to the current job's time if it is lower
* @return always 0
*/
int test_next_job_call_time(Trick::JobData * curr_job, long long time_tics) ;
private:
/** number of jobs in list */
unsigned int list_size ;
/** Simple reallocable list of JobData pointers. */
JobData ** list ; /* ** This list is allocated outside of the memory manager. */
/** current index to top job in list */
unsigned int curr_index ;
/** next lowest job call time as tracked by calls to find_next_job(long long) */
long long next_job_time ;
} ;
}
#endif