#ifndef __PROCESS_H__
#define __PROCESS_H__

#include "rtos_defs.h"

#define OS_PROCESS __attribute__((__noreturn__))

class BaseThread
{
	public:

		BaseThread( StackItem* Stack, Priority pr, void (*exec)() );
		void Sleep(timeout_t ticks);
		bool WakeUpThread(void);
		void ForceWakeUpThread(void);
		bool IsSleeping(void) const;
		bool IsBlocked(void) const;
		void SetSP(StackItem* sp)	{ _stackPointer = sp; }
		StackItem* GetSP(void)		{ return _stackPointer; }

	protected:
		StackItem*	_stackPointer;
		timeout_t	_timeout;
		Priority	_priority;
};

template<Priority pr, uint32_t stack_size>
class Thread : public BaseThread
{
	public:
		Thread();
		static void Exec();

	private:
		StackItem Stack[stack_size/sizeof(stack_item_t)];
};

template<Priority pr, uint32_t stack_size>
Thread<pr, stack_size>::Thread() :
	BaseThread(&Stack[stack_size/sizeof(stack_item_t)], pr, reinterpret_cast<void (*)()>(Exec) ) {}


#endif // _ PROCESS_H__
