mirror of
https://github.com/nasa/trick.git
synced 2024-12-19 05:07:54 +00:00
1afac18399
Created a thread trigger container class to hold all of the various thread triggering mechanisms. I wanted to avoid allocating/freeing trigger mechanisms. I added an eventfd and futex trigger types. Updated SIM_threads_simple test sim to use show how to set the thread trigger type. refs #148
100 lines
3.0 KiB
C++
100 lines
3.0 KiB
C++
/*
|
|
PURPOSE:
|
|
(Trick Thread trigger implementation)
|
|
*/
|
|
|
|
#ifndef THREADTRIGGER_HH
|
|
#define THREADTRIGGER_HH
|
|
|
|
#include <iostream>
|
|
#include <pthread.h>
|
|
|
|
namespace Trick {
|
|
|
|
enum ThreadTriggerType {
|
|
TT_MUTEX,
|
|
TT_FLAG,
|
|
TT_EVENTFD,
|
|
TT_FUTEX
|
|
} ;
|
|
|
|
class ThreadTriggerBase {
|
|
public:
|
|
ThreadTriggerType tt_type ;
|
|
ThreadTriggerBase(ThreadTriggerType in_tt_type) ;
|
|
virtual ~ThreadTriggerBase() ;
|
|
virtual void init() ;
|
|
virtual void fire() = 0 ;
|
|
virtual void wait() = 0 ;
|
|
virtual void dump( std::ostream & oss ) = 0 ;
|
|
} ;
|
|
|
|
class ThreadTriggerMutex : public Trick::ThreadTriggerBase {
|
|
public:
|
|
ThreadTriggerMutex() ;
|
|
virtual void init() ;
|
|
virtual void fire() ;
|
|
virtual void wait() ;
|
|
virtual void dump( std::ostream & oss ) ;
|
|
protected:
|
|
/** Condition variable to control start of thread processing */
|
|
pthread_cond_t go_cv; /**< trick_io(**) */
|
|
/** Mutex to control start of thread processing */
|
|
pthread_mutex_t go_mutex; /**< trick_io(**) */
|
|
} ;
|
|
|
|
class ThreadTriggerFlag : public Trick::ThreadTriggerBase {
|
|
public:
|
|
ThreadTriggerFlag() ;
|
|
virtual void fire() ;
|
|
virtual void wait() ;
|
|
virtual void dump( std::ostream & oss ) ;
|
|
protected:
|
|
/** Trigger from master to start thread processing */
|
|
volatile bool frame_trigger; /**< trick_io(**) */
|
|
} ;
|
|
|
|
class ThreadTriggerEventFD : public Trick::ThreadTriggerBase {
|
|
public:
|
|
ThreadTriggerEventFD() ;
|
|
virtual void fire() ;
|
|
virtual void wait() ;
|
|
virtual void dump( std::ostream & oss ) ;
|
|
protected:
|
|
/** condition variable to control start of thread using eventfd */
|
|
int efd; /**< trick_io(**) */
|
|
} ;
|
|
|
|
class ThreadTriggerFutex : public Trick::ThreadTriggerBase {
|
|
public:
|
|
ThreadTriggerFutex() ;
|
|
virtual void fire() ;
|
|
virtual void wait() ;
|
|
virtual void dump( std::ostream & oss ) ;
|
|
protected:
|
|
/** condition variable for futex */
|
|
int futex_addr; /**< trick_io(**) */
|
|
} ;
|
|
|
|
/* Container to hold all of the trigger types. This avoids having to
|
|
allocate each trigger type when changing from one type to another */
|
|
class ThreadTriggerContainer {
|
|
|
|
public:
|
|
ThreadTriggerContainer() ;
|
|
ThreadTriggerBase * getThreadTrigger() ;
|
|
void setThreadTrigger( ThreadTriggerType trigger_type ) ;
|
|
|
|
protected:
|
|
ThreadTriggerType trigger_type ;
|
|
ThreadTriggerMutex ttMutex ;
|
|
ThreadTriggerFlag ttFlag ;
|
|
ThreadTriggerEventFD ttEventFD ;
|
|
ThreadTriggerFutex ttFutex ;
|
|
|
|
ThreadTriggerBase * ttBase ;
|
|
|
|
} ;
|
|
}
|
|
#endif
|