source: flair-src/trunk/lib/FlairCore/src/Thread.cpp @ 213

Last change on this file since 213 was 213, checked in by Sanahuja Guillaume, 4 years ago

thread stack size rework
add Matrix class

File size: 4.0 KB
Line 
1// %flair:license{
2// This file is part of the Flair framework distributed under the
3// CECILL-C License, Version 1.0.
4// %flair:license}
5//  created:    2012/10/04
6//  filename:   Thread.cpp
7//
8//  author:     Guillaume Sanahuja
9//              Copyright Heudiasyc UMR UTC/CNRS 7253
10//
11//  version:    $Id: $
12//
13//  purpose:    Abstract class for a thread
14//
15//
16/*********************************************************************/
17
18#include "Thread.h"
19#include "Thread_impl.h"
20#ifdef __XENO__
21#include <native/timer.h>
22#else
23#include <sys/time.h>
24#include <unistd.h>
25#endif
26
27using std::string;
28
29namespace flair {
30namespace core {
31
32Thread::Thread(const Object *parent, string name, uint8_t priority,uint32_t stackSize)
33    : Object(parent, name, "Thread") {
34  pimpl_ = new Thread_impl(this, priority,stackSize);
35}
36
37Thread::~Thread() { delete pimpl_; }
38
39void Thread::Start(void) { pimpl_->Start(); }
40
41void Thread::SafeStop(void) { pimpl_->SafeStop(); }
42
43bool Thread::ToBeStopped(void) const { return pimpl_->ToBeStopped(); }
44
45#ifdef __XENO__
46void Thread::WarnUponSwitches(bool value) {
47  // Ask Xenomai to warn us upon switches to secondary mode.
48  if (value == true) {
49    rt_task_set_mode(0, T_WARNSW, NULL);
50  } else {
51    rt_task_set_mode(T_WARNSW, 0, NULL);
52  }
53}
54#else
55void Thread::WarnUponSwitches(bool value) {
56  // Warn("Not applicable in non real time\n");
57}
58#endif
59
60void Thread::Join(void) { pimpl_->Join(); }
61
62void Thread::SetPeriodUS(uint32_t period) { pimpl_->SetPeriodUS(period); }
63
64uint32_t Thread::GetPeriodUS(void) const { return pimpl_->GetPeriodUS(); }
65
66void Thread::SetPeriodMS(uint32_t period) { pimpl_->SetPeriodMS(period); }
67
68uint32_t Thread::GetPeriodMS(void) const { return pimpl_->GetPeriodMS(); }
69
70bool Thread::IsPeriodSet(void) { return pimpl_->period_set; }
71
72void Thread::WaitPeriod(void) const { pimpl_->WaitPeriod(); }
73
74void Thread::Suspend(void) { pimpl_->Suspend(); }
75
76bool Thread::SuspendUntil(Time date) { return pimpl_->SuspendUntil(date); }
77
78bool Thread::IsSuspended(void) const { return pimpl_->IsSuspended(); }
79
80bool Thread::IsRunning(void) const { return pimpl_->isRunning; }
81
82void Thread::Resume(void) { pimpl_->Resume(); }
83
84int Thread::WaitUpdate(const IODevice *device) {
85  return pimpl_->WaitUpdate(device);
86}
87
88void Thread::SleepUntil(Time time) const {
89#ifdef __XENO__
90  int status = rt_task_sleep_until(time);
91  if (status != 0) {
92                char errorMsg[256];
93    Err("%error rt_task_sleep_until (%s), resume time: %lld, actual time: "
94        "%lld\n",strerror_r(-status, errorMsg, sizeof(errorMsg)), time, GetTime());
95        }
96// Printf("rt_task_sleep_until, resume time: %lld, actual time:
97// %lld\n",time,GetTime());
98#else
99  Time current = GetTime();
100  if (current < time) {
101    //usleep((time - current) / 1000);
102    struct timespec req;
103    req.tv_nsec = time - current;
104    req.tv_sec = req.tv_nsec / 1000000000;
105    req.tv_nsec %= 1000000000;
106    struct timespec rem;
107    if(nanosleep(&req,&rem)!=0) Err("error in nanosleep\n");//todo, handle EINTR
108  } else {
109    Err("error resume time is passed by %lldns\n", ( current-time));
110  }
111#endif
112}
113
114void Thread::SleepMS(uint32_t time) const {
115#ifdef __XENO__
116  int status = rt_task_sleep(time * 1000 * 1000);
117  if (status != 0) {
118                char errorMsg[256];
119    Err("erreur rt_task_sleep (%s)\n", strerror_r(-status, errorMsg, sizeof(errorMsg)));
120        }
121#else
122  //usleep(time * 1000);
123  struct timespec req;
124  req.tv_nsec = time * 1000000;
125  req.tv_sec = req.tv_nsec / 1000000000;
126  req.tv_nsec %= 1000000000;
127  struct timespec rem;
128  if(nanosleep(&req,&rem)!=0) Err("error in nanosleep\n");//todo, handle EINTR
129#endif
130}
131
132void Thread::SleepUS(uint32_t time) const {
133#ifdef __XENO__
134  int status = rt_task_sleep(time * 1000);
135  if (status != 0) {
136                char errorMsg[256];
137    Err("erreur rt_task_sleep (%s)\n", strerror_r(-status, errorMsg, sizeof(errorMsg)));
138        }
139#else
140  //usleep(time);
141  struct timespec req;
142  req.tv_nsec = time * 1000;
143  req.tv_sec = req.tv_nsec / 1000000000;
144  req.tv_nsec %= 1000000000;
145  struct timespec rem;
146  if(nanosleep(&req,&rem)!=0) Err("error in nanosleep\n");//todo, handle EINTR
147#endif
148}
149
150} // end namespace core
151} // end namespace flair
Note: See TracBrowser for help on using the repository browser.