#ifndef __PROCESS_H__
#define __PROCESS_H__

#include "rtos_defs.h"

#define OS_PROCESS __attribute__((__noreturn__))

typedef unsigned long StackItem;

class BaseProcess
{
	public:

		BaseProcess( StackItem* Stack, Priority pr, void (*exec)() );
		void Sleep(Timeout ticks);
		bool WakeUpProcess(void);
		void ForceWakeUpProcess(void);
		bool IsSleeping(void) const;
		bool IsBlocked(void) const;
		void SetSP(StackItem* sp)	{ _stackPointer = sp; }
		StackItem* GetSP(void)		{ return _stackPointer; }

	protected:
		StackItem*	_stackPointer;
		Timeout	_timeout;
		Priority	_priority;
};

template<Priority pr, word stack_size>
class Process : public BaseProcess
{
	public:
		Process();
		static void Exec();

	private:
		StackItem Stack[stack_size/sizeof(StackItem)];
};

template<Priority pr, word stack_size>
Process<pr, stack_size>::Process() :
	BaseProcess(&Stack[stack_size/sizeof(StackItem)], pr, reinterpret_cast<void (*)()>(Exec) ) {}


#endif // _ PROCESS_H__
