45 RTPOSIXSolver::RTPOSIXSolver(
Solver *pS,
47 unsigned long lRTPeriod,
48 unsigned long RTStackSize,
52 :
RTSolverBase(pS, eRTMode, lRTPeriod, RTStackSize, bRTAllowNonRoot, RTCpuMap, bNoOutput),
53 clock_flags(TIMER_ABSTIME)
58 RTPOSIXSolver::~RTPOSIXSolver(
void)
65 RTPOSIXSolver::Restart(std::ostream& out)
const
72 RTPOSIXSolver::Setup(
void)
77 struct sched_param sched;
78 int policy = SCHED_FIFO;
80 int min_priority = sched_get_priority_min(policy);
82 sched.sched_priority = sched_get_priority_max(policy) - priority;
84 if (sched.sched_priority < min_priority) {
85 sched.sched_priority = min_priority;
88 if (sched_setscheduler(0, policy, &sched) < 0) {
89 silent_cerr(
"RTPOSIXSolver: sched_setscheduler failed" << std::endl);
90 if (bRTAllowNonRoot) {
97 #ifdef HAVE_SCHED_SETAFFINITY
98 if (RTCpuMap != 0xFF) {
102 for (
int cpu = 0; cpu < 8; cpu++) {
103 if ((RTCpuMap >> cpu) & 0x1) {
104 CPU_SET(cpu, &cpuset);
108 if (sched_setaffinity(0,
sizeof(cpu_set_t), &cpuset)) {
109 silent_cerr(
"RTPOSIXSolver: sched_setaffinity failed" << std::endl);
113 #endif // HAVE_SCHED_SETAFFINITY
118 RTPOSIXSolver::StopCommanded(
void)
126 RTPOSIXSolver::Log(
void)
134 RTPOSIXSolver::Wait(
void)
136 if (RTWaitPeriod()) {
138 clock_gettime(CLOCK_MONOTONIC, &t0);
142 t.tv_nsec += lRTPeriod;
143 if (t.tv_nsec >= 1000000000L) {
144 t.tv_nsec -= 1000000000L;
148 int rc = clock_nanosleep(CLOCK_MONOTONIC, clock_flags, &t, NULL);
154 silent_cerr(
"RTPOSIXSolver: clock_nanosleep interrupted" << std::endl);
158 silent_cerr(
"RTPOSIXSolver: clock_nanosleep failed "
159 "(rc=" << rc <<
")" << std::endl);
164 }
else if (RTSemWait()) {
178 unsigned long lRTPeriod;
179 unsigned long RTStackSize;
180 bool bRTAllowNonRoot;
182 ReadRTParams(pS, HP, eRTMode, lRTPeriod, RTStackSize, bRTAllowNonRoot, RTCpuMap);
184 bool bNoOutput =
true;
191 RTPOSIXSolver(pS, eRTMode, lRTPeriod,
192 RTStackSize, bRTAllowNonRoot, RTCpuMap,
197 silent_cerr(
"ReadRTPOSIXSolver: need to configure --with-rt "
198 "to use POSIX realtime" << std::endl);
RTSolverBase * ReadRTPOSIXSolver(Solver *pS, MBDynParser &HP)
#define MBDYN_EXCEPT_ARGS
virtual bool GetYesNoOrBool(bool bDefval=false)
virtual bool IsKeyWord(const char *sKeyWord)
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
void ReadRTParams(Solver *pS, MBDynParser &HP, RTSolverBase::RTMode &eRTMode, unsigned long &lRTPeriod, unsigned long &RTStackSize, bool &bRTAllowNonRoot, int &RTCpuMap)