//////////////////////////////////////////////////////////////////////////////
//
// Asura_PS3_SPURS.h
//
// Copyright (c) 2009 Rebellion. All rights reserved.
//
// Description:
//
//     
//     
//     
//
//     
//
//     
//     
//     
//     
//     
//
//     
//     
//
//     
//     
//     
//     
//
//     
//     
//     
//
//////////////////////////////////////////////////////////////////////////////

// B E G I N   F I L E   W R A P P E R ///////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
    #pragma once
#endif

#ifndef ASURA_PS3_SPURS_H___
#define ASURA_PS3_SPURS_H___ 1  

#include <spurs_util.h>

using namespace cell::Util::Spurs;

class	Asura_PS3_SPURS
{
public:
	Asura_PS3_SPURS();
	virtual ~Asura_PS3_SPURS();

	static void	Initialise( u_int uNumSPUs );
	static void	Shutdown( void );

	static inline bool		IsInitialised( void )	{	return 	m_bInitialised; }
	static inline Spurs*	GetSPURSInstance( void ){	return  m_pxSpurs; }

	class	Asura_PS3_SPURS_Taskset
	{
	public:
		Asura_PS3_SPURS_Taskset( Asura_PS3_SPURS* pxSPURS, const char* szName, uint64_t uiData );

		Task*	Begin( Asura_PS3_SPURS* pxSPURS, const void* pElf, const void* pTaskArg = NULL );
		Task*	Begin( Asura_PS3_SPURS* pxSPURS, const void* pElf, const void* pTaskArg, void* pContext );

		void	End( Asura_PS3_SPURS* pxSPURS );

		inline	Taskset* GetTaskset( void )	{	return m_pxTaskset; }

	protected:
	
		//	
		Taskset*		m_pxTaskset;

	};


	//	Task and Taskset based functions
	static Taskset*	CreateTaskSet( const char* szSetName, uint64_t uiData );
	static Task*	CreateTask( Taskset* pxTaskset, const void* pElf, const void* pTaskArg = NULL);
	static Task*	CreateTask( Taskset* pxTaskset, const void* pElf, const void* pTaskArg, const void* pContext );
	static int		BlockingWaitForTask( Task* pxTask );
	static int		NonBlockingWaitForTask( Task* pxTask );
	static void		ShutdownTask( Task* pxTask );
	static void		ShutdownTaskSet( Taskset* pxTaskset );
	//
	static u_int	m_uNumber_Of_SPUs_To_Use;
protected:
	static Spurs*	m_pxSpurs;

	static bool	m_bInitialised;
private:
};

#endif

// C L A S S E S /////////////////////////////////////////////////////////////