12 #ifndef ECL_THREADS_THREAD_POS_HPP_ 
   13 #define ECL_THREADS_THREAD_POS_HPP_ 
   19 #include <ecl/config/ecl.hpp> 
   20 #if defined(ECL_IS_POSIX) 
   53         virtual ~ThreadTaskBase() {};
 
   56         ThreadTaskBase(
const Priority& priority) : priority_level(priority) {}; 
 
   68 template <
typename F, 
bool IsReferenceWrapper = false>
 
   69 class ECL_LOCAL ThreadTask : 
public ThreadTaskBase {
 
   79         ThreadTask(
const F &
f, 
const Priority &priority) : ThreadTaskBase(priority), function(
f) {
 
   82         virtual ~ThreadTask() {}; 
 
   94         static void* EntryPoint(
void *ptr_this) {
 
   95             ThreadTask< F, false > *ptr = 
static_cast< ThreadTask< F, false > * 
>(ptr_this);
 
   96             ecl::set_priority(ptr->priority_level);
 
  116 template <
typename F>
 
  117 class ECL_LOCAL ThreadTask<F, true> : 
public ThreadTaskBase {
 
  127         ThreadTask(
const F &
f, 
const Priority &priority) : ThreadTaskBase(priority), function(
f.reference()) {
 
  130         virtual ~ThreadTask() {}; 
 
  142         static void* EntryPoint(
void *ptr_this) {
 
  143             ThreadTask< F, true > *ptr = 
static_cast< ThreadTask< F, true > * 
>(ptr_this);
 
  144             ecl::set_priority(ptr->priority_level);
 
  152         typename F::type &
function;
 
  245                 join_requested(false)
 
  300         template <
typename C>
 
  312         template <
typename C>
 
  313         Error start(
void (C::*
function)(), C &c, 
const Priority &priority = 
DefaultPriority,  
const long &stack_size = -1 );
 
  353         template <
typename F>
 
  364         template <
typename F>
 
  382         bool isRunning()
 const { 
if ( thread_task == NULL ) { 
return false; } 
else { 
return true; } }
 
  415         pthread_t thread_handle;
 
  416     pthread_attr_t attrs;
 
  417     sched_param schedule_parameters;
 
  418     threads::ThreadTaskBase *thread_task;
 
  422         void initialise(
const long &stack_size);
 
  424         enum ThreadProperties {
 
  425                 DefaultStackSize = -1
 
  433 template <
typename C>
 
  434 Thread::Thread(
void (C::*
function)(), C &c, 
const Priority &priority, 
const long &stack_size) :
 
  437         join_requested(false)
 
  439         start<C>(
function, c, priority, stack_size);
 
  443 template <
typename F>
 
  444 Thread::Thread(
const F &
function, 
const Priority &priority, 
const long &stack_size) :
 
  447         join_requested(false)
 
  449         start<F>(
function, priority, stack_size);
 
  452 template <
typename C>
 
  453 Error Thread::start(
void (C::*
function)(), C &c, 
const Priority &priority, 
const long &stack_size)
 
  456                 ecl_debug_throw(StandardException(LOC,BusyError,
"The thread has already been started."));
 
  457                 return Error(BusyError); 
 
  461         initialise(stack_size);
 
  462         thread_task = 
new threads::ThreadTask< BoundNullaryMemberFunction<C,void> >(
generateFunctionObject( 
function, c ), priority);
 
  463     int result = pthread_create(&(this->thread_handle), &(this->attrs), threads::ThreadTask< BoundNullaryMemberFunction<C,void> >::EntryPoint, thread_task);
 
  464         pthread_attr_destroy(&attrs);
 
  469                 return threads::handlePthreadCreateError(result); 
 
  471     return Error(NoError);
 
  474 template <
typename F>
 
  475 Error Thread::start(
const F &
function, 
const Priority &priority, 
const long &stack_size)
 
  478                 ecl_debug_throw(StandardException(LOC,BusyError,
"The thread has already been started."));
 
  479                 return Error(BusyError); 
 
  483         initialise(stack_size);
 
  484         thread_task = 
new threads::ThreadTask<F, is_reference_wrapper<F>::value >(
function, priority);
 
  485     int result = pthread_create(&(this->thread_handle), &(this->attrs), threads::ThreadTask<F, is_reference_wrapper<F>::value>::EntryPoint, thread_task);
 
  486         pthread_attr_destroy(&attrs);
 
  491                 return threads::handlePthreadCreateError(result); 
 
  493     return Error(NoError);