5 #ifdef TGT_OS_TYPE_VXWORKS
20 typedef void* (*pthread_func_ptr)(
void*);
23 #define DEBUG_PRINT(x,...)
26 Task::Task() : m_handle(0), m_identifier(0), m_affinity(-1), m_started(
false), m_suspendedOnPurpose(
false) {
33 #ifndef TGT_OS_TYPE_VXWORKS
35 (void)snprintf(pid,
sizeof(pid),
".%d",getpid());
36 pid[
sizeof(pid)-1] = 0;
39 this->m_identifier = identifier;
45 memset(&att,0,
sizeof(att));
47 I32 stat = pthread_attr_init(&att);
49 Fw::Logger::logMsg(
"pthread_attr_init: (%d)(%d): %s\n",stat,errno,
reinterpret_cast<POINTER_CAST
>(strerror(stat)));
52 #ifdef TGT_OS_TYPE_VXWORKS
53 stat = pthread_attr_setstacksize(&att,stackSize);
57 stat = pthread_attr_setschedpolicy(&att,SCHED_FIFO);
61 stat = pthread_attr_setname(&att,(
char*)this->m_name.toChar());
65 stat = pthread_attr_setinheritsched(&att,PTHREAD_EXPLICIT_SCHED);
69 sched_param schedParam;
70 memset(&schedParam,0,
sizeof(sched_param));
71 schedParam.sched_priority = priority;
72 stat = pthread_attr_setschedparam(&att,&schedParam);
76 stat = pthread_attr_setopt(&att,VX_FP_TASK);
80 #elif defined TGT_OS_TYPE_LINUX
81 #if !defined BUILD_CYGWIN // cygwin doesn't support this call
82 stat = pthread_attr_setschedpolicy(&att,SCHED_RR);
84 Fw::Logger::logMsg(
"pthread_attr_setschedpolicy: %s\n",
reinterpret_cast<POINTER_CAST
>(strerror(errno)));
88 #elif defined TGT_OS_TYPE_RTEMS
89 stat = pthread_attr_setstacksize(&att,stackSize);
93 stat = pthread_attr_setschedpolicy(&att,SCHED_FIFO);
97 stat = pthread_attr_setinheritsched(&att,PTHREAD_EXPLICIT_SCHED);
101 sched_param schedParam;
102 memset(&schedParam,0,
sizeof(sched_param));
103 schedParam.sched_priority = priority;
104 stat = pthread_attr_setschedparam(&att,&schedParam);
108 #elif defined TGT_OS_TYPE_DARWIN
110 #error Unsupported OS!
114 if (Task::s_taskRegistry) {
115 Task::s_taskRegistry->addTask(
this);
118 pthread_t* tid =
new pthread_t;
123 this->m_handle = (POINTER_CAST)tid;
128 Fw::Logger::logMsg(
"pthread_create: %s\n",
reinterpret_cast<POINTER_CAST
>(strerror(errno)));
137 (void)pthread_attr_destroy(&att);
146 time1.tv_sec = milliseconds/1000;
147 time1.tv_nsec = (milliseconds%1000)*1000000;
153 timespec* sleepTimePtr = &time1;
154 timespec* remTimePtr = &time2;
157 int stat = nanosleep(sleepTimePtr,remTimePtr);
161 if (EINTR == errno) {
162 timespec* temp = remTimePtr;
163 remTimePtr = sleepTimePtr;
178 if (this->m_handle) {
179 delete (pthread_t*)this->m_handle;
182 if (Task::s_taskRegistry) {
183 Task::s_taskRegistry->removeTask(
this);
211 if (!(this->m_handle)) {
214 stat = pthread_join(*((pthread_t*) this->m_handle), value_ptr);