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);