trick/trick_source/sim_services/ThreadBase/include/ThreadBase.hh

189 lines
4.8 KiB
C++
Raw Normal View History

2015-02-26 15:02:31 +00:00
/*
PURPOSE:
(Trick Threads implementation)
*/
#ifndef THREADBASE_HH
#define THREADBASE_HH
2015-02-26 15:02:31 +00:00
#include <stdio.h>
#include <pthread.h>
#include <iostream>
#include <string>
#if __linux
#include <sys/types.h>
#endif
#include <unistd.h>
#include <sched.h>
namespace Trick {
/**
* One instance of this class is instantiated for each thread in the simulation. This class
* manages the scheduled jobs associated with it's thread. It also manages the thread specific
* realtime capabilities
*
* @author Robert W. Bailey
* @author many other Trick developers of the past who did not add their names.
* @author Alexander S. Lin
*
* @todo implement realtime controls rt_on and rt_off
*/
class ThreadBase {
friend class InputProcessor ;
friend void init_attrTrick__ThreadBase() ;
public:
/**
* This constructor initializes the member data and initializes the mutexes.
*/
ThreadBase(std::string in_name = "") ;
virtual ~ThreadBase() ;
std::string get_name() ;
void set_name(std::string in_name) ;
/**
* Gets the thread pthread ID.
*/
pthread_t get_pthread_id() ;
#if 0
/**
* Sets the thread pthread ID.
*/
void set_pthread_id( pthread_t in_pthread_id ) ;
#endif
/**
* Gets the thread process ID.
*/
pid_t get_pid() ;
/**
* Tells thread to set the thread process ID.
*/
void set_pid() ;
/**
* Adds a CPU affinity to a single CPU
* @return always 0
*/
int cpu_set(unsigned int cpu) ;
/**
* Clears a CPU to the affinity mask.
* @return always 0
*/
int cpu_clr(unsigned int cpu ) ;
#if __linux
#ifndef SWIG
/**
* Gets the cpu set for this thread
* @return always 0
*/
cpu_set_t * get_cpus() ;
/**
* Copys the cpu set from the incoming set to this thread
* @return always 0
*/
void copy_cpus(cpu_set_t * in_cpus) ;
#endif
#endif
#if __APPLE__
/**
* Gets the cpu set for this thread
* @return always 0
*/
void * get_cpus() ;
/**
* Copys the cpu set from the incoming set to this thread
* @return always 0
*/
void copy_cpus(void * in_cpus) ;
#endif
/**
* Executes the CPU affinity settings
* @return always 0
*/
int execute_cpu_affinity() ;
/**
* Executes the CPU affinity settings
* @return always 0
*/
int set_priority(unsigned int req_priority) ;
/**
* Sets the priority to run this thread with.
* @param yes_no - do we wait for the thread at shutdown or not?
* @return always 0
*/
int execute_priority() ;
/**
* Creates a new thread.
* @return always 0
*/
virtual int create_thread() ;
/**
* Cancels thread.
* @return always 0
*/
virtual int cancel_thread() ;
/**
* The thread body.
* @return always 0
*/
virtual void * thread_body() = 0 ;
/**
* pthread_create compatible function to start new thread
* @return always 0
*/
static void * thread_helper( void * context ) ;
/**
* Prints thread information to the incoming file pointer
*/
virtual void dump( std::ostream & oss = std::cout ) ;
protected:
/** optional name of thread */
std::string name ; /**< trick_units(--) */
/** pthread id associated with thread when created with pthread_create */
pthread_t pthread_id; /**< trick_io(**) */
/** process id associated with thread. This differs from the pthread_id */
pid_t pid; /**< trick_io(**) */
/** Priority to set if rt_nond_pri = Yes , the highest priority is 1 */
unsigned int rt_priority; /**< trick_units(--) */
/** Set of cpus to use with thread */
unsigned int max_cpu ;
#if __linux
#ifndef SWIG
/** Set of cpus to use with thread */
cpu_set_t * cpus ; /**< trick_io(**) */
#endif
#endif
} ;
}
#endif