ITANUPCTask.h 2.77 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
#ifndef __TASK_H__
#define __TASK_H__

#include <ITAConvolutionDefinitions.h>
#include <ITANUPConvolution.h>

#include "ITANUPCStage.h"

#include <ITAStringUtils.h>
#include <ITAHPT.h>

class CNUPCInputImpl;

class Task
{
public:
	int ID;							// Identifikationsnummer
	CNUPCInputImpl*  pInput;			// Eingang
	int iInputOffset;				// Position im Eingangspuffer
	int iOutputOffset;				// Position im Ausgangspuffer
	CStage* pStage;					// Zugeordnete Stufe
	ITANUPC::CYCLE tDeadline;				// Zyklus zu dem der Task bearbeitet sein muss
	int64_t iRDTSCCreation;			// RDTSC-Zhlerstand, an dem der Task erzeugt wurde
	int64_t iRDTSCDeadline;			// RDTSC-Zhlerstand der zeitliche Deadline markiert
	int64_t iRDTSCStart;			// RDTSC-Zhlerstand, an dem die Bearbeitung des Tasks begann
	int64_t iRDTSCEnd;				// RDTSC-Zhlerstand, an dem die Bearbeitung des Tasks beendet wurde
	CStage::CSequencePointer SSP;		// Zeiger auf den Schritte in der Stufenberechnung
	int nInterruptions;				// Anzahl der Unterbrechungen des Task
	double dEstMinQuantum;			// Geschtztes Minimales Zeitbudget fr den nchsten Berechnungsschritt

	inline Task() { };

	explicit inline Task( CNUPCInputImpl*  pInput,
		int iSourceOffset,
		int iDestOffset,
		CStage* pStage,
		ITANUPC::CYCLE tDeadline,
		int64_t iRDTSCDeadline )
	{
		// TODO: ID-Counter ist nicht Thread-safe!
		ID = IDCounter++;
		this->pInput = pInput;
		this->iInputOffset = iSourceOffset;
		this->iOutputOffset = iDestOffset;
		this->pStage = pStage;
		this->tDeadline = tDeadline;
		this->iRDTSCDeadline = iRDTSCDeadline;

		iRDTSCCreation = ITAHPT_now();
		iRDTSCStart = iRDTSCEnd = -1;
		nInterruptions = 0;
		dEstMinQuantum = 0;
	}

	inline std::string toString() const
	{
		std::string s = "Task {\n";
		s += "  ID:				 " + IntToString( ID ) + "\n";
		//s += "  Input channel:  " + IntToString(pInput->getID()) + "\n";
		s += "  Length:         " + IntToString( pStage->iPartLength ) + "\n";
		s += "  Source offset:  " + IntToString( iInputOffset ) + "\n";
		s += "  Dest offset:    " + IntToString( iOutputOffset ) + "\n";
		s += "  Deadline:       " + IntToString( ( int ) tDeadline ) + "\n";
		s += "  SSP (Main,CDI): (" + IntToString( SSP.iMain ) + "," + UIntToString( SSP.iCDI ) + ")\n";
		s += "  EstMinQuantum:  " + DoubleToString( dEstMinQuantum * 1000000, 3 ) + " us\n";
		s += "}\n\n";
		return s;
	}

	inline std::string toShortString() const
	{
		return "#" + IntToString( ID ) + " (L = " + IntToString( pStage->iPartLength ) + ", DL = " + IntToString( ( int ) tDeadline ) + ", SSP Main = " + UIntToString( SSP.iMain ) + ", CDI = " + UIntToString( SSP.iCDI ) + ", EMQ = " + DoubleToString( dEstMinQuantum * 1000000, 3 ) + " us)";
	}

	void inline print() { printf( "%s", toString().c_str() ); }

private:
	static unsigned int IDCounter;  // Globaler Zhler fr Task-IDs
};

#endif