Files
VisualSapfor/src/files/Planner/Task.h

172 lines
4.4 KiB
C
Raw Normal View History

2023-09-17 22:13:42 +03:00
#include "File.h"
#include "Utils.h"
#include "Global.h"
#pragma once
enum TaskState {
Inactive, //0
Waiting, //1
WorkspaceCreated, //2
WorkspaceReady, //3
Running, //4
Canceled, //5
Finished, //6
FinishedAbortedByTimeout, //7
FinishedAbortedByUser, //8
Done, //9
DoneWithErrors, //10
AbortedByTimeout, //11
AbortedByUser, //12
Crushed, //13
WrongTestFormat, //14
InternalError, //15
Queued, //16
NoSuchTask, //17
FailedToQueue, //18
AbortingByUser //19
};
#pragma once
enum TestType{
Default, //0
Correctness, //1
Performance, //2
};
#pragma once
class Task {
protected:
long id;
int maxtime;
int kernels; //получение зависит от типа задачи.
String workspace;
TaskState state;
public:
long start_time;
String printState(){
switch(state){
case Inactive:
return String("Inactive");
case Waiting:
return String("Waiting");
case WorkspaceCreated:
return String("WorkspaceCreated");
case WorkspaceReady:
return String("WorkspaceReady");
case Running:
return String("Running");
case Canceled:
return String("Canceled");
case Finished:
return String("Finished");
case FinishedAbortedByTimeout:
return String("FinishedAbortedByTimeout");
case FinishedAbortedByUser:
return String("FinishedAbortedByUser");
case Done:
return String("Done");
case DoneWithErrors:
return String("DoneWithErrors");
case AbortedByTimeout:
return String("AbortedByTimeout");
case AbortedByUser:
return String("AbortedByUser");
case Crushed:
return String("Crushed");
case WrongTestFormat:
return String("WrongTestFormat");
case InternalError:
return String("InternalError");
case Queued:
return String("Queued");
case NoSuchTask:
return String("NoSuchTask");
case FailedToQueue:
return String("FailedToQueue");
case AbortingByUser:
return String("AbortingByUser");
default:
return "?";
}
}
//-------------->>
long getId(){return id;}
long setId(String * id_s){
return id=strtol(id_s->getCharArray(), NULL, 10);
}
int getMaxtime(){return maxtime;}
int setMaxtime(String * maxtime_s){
return maxtime=atoi(maxtime_s->getCharArray());
}
const String& getWorkspace(){return workspace;}
TaskState getState(){return state;}
TaskState setState(TaskState state_in){return state=state_in;}
Task(Text * lines, int offset){
setId(lines->get(offset));
setMaxtime(lines->get(offset+1));
workspace = packageWorkspace+"/"+String(id);
}
virtual void print()=0;
//-
virtual void prepareWorkspace(){}
virtual String getLaunchScriptText()=0;
virtual String getStartCommand(){
return workspace+"/run";
}
void createWorkspace(){
Utils::Mkdir(workspace);
}
void createLaunchScript(){
String launchScriptPath = workspace+"/run";
String launchScriptText =
String("cd ")+String::DQuotes(workspace)+"\n"+
getLaunchScriptText();
File launchScriptFile = File(launchScriptPath, launchScriptText);
Utils::Chmod(launchScriptPath);
}
virtual void Start(){
if (kernels<=freeKernels){
system(getStartCommand().getCharArray());
state=Running;
//-
busyKernels= Utils::min(busyKernels+kernels, maxKernels);
freeKernels= Utils::max(0, maxKernels-busyKernels);
//-
}
}
virtual void analyseResults(){
state=Finished;
}
virtual void Check(){
if (Utils::Exists(workspace+"/DONE")){
analyseResults();
}else {
if (Utils::Exists(workspace+"/TIMEOUT")){
state=AbortedByTimeout;
//todo определить по интервалу времени на всякий случай.
}else if (Utils::Exists(workspace+"/INTERRUPT")){
state=AbortedByUser;
} else {
long now = Utils::getAbsoluteTime();
long delta = now-start_time;
if (maxtime<delta){
state=AbortedByTimeout;
}
}
}
if (state!=Running){
//-
busyKernels= Utils::min(busyKernels-kernels, maxKernels);
freeKernels= Utils::max(0, maxKernels-busyKernels);
//-
saveState(); //не нужно. только для отладки. анализ будет делаться архивом.
}
}
virtual void saveState(){
String stateFile = workspace+"/TaskState";
File(stateFile, printState());
}
};