2023-12-03 13:09:16 +03:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <unistd.h>
|
2023-09-17 22:13:42 +03:00
|
|
|
#include "File.h"
|
|
|
|
|
#include "Task.h"
|
|
|
|
|
|
|
|
|
|
enum SupervisorState {
|
|
|
|
|
WorkspacesCreation, //0
|
|
|
|
|
Preparation, //1
|
|
|
|
|
Execution, //2
|
|
|
|
|
Archivation, //3
|
|
|
|
|
End //4
|
|
|
|
|
};
|
2023-12-03 13:09:16 +03:00
|
|
|
|
2023-09-17 22:13:42 +03:00
|
|
|
template <class T>
|
2023-12-03 13:09:16 +03:00
|
|
|
class Supervisor : public Array <T> {
|
2023-09-17 22:13:42 +03:00
|
|
|
protected:
|
2023-12-03 13:09:16 +03:00
|
|
|
SupervisorState state;
|
|
|
|
|
public:
|
|
|
|
|
virtual String getStatePrefix() {
|
2023-09-17 22:13:42 +03:00
|
|
|
return String("");
|
|
|
|
|
}
|
2023-12-03 13:09:16 +03:00
|
|
|
String printState() {
|
|
|
|
|
switch (state) {
|
|
|
|
|
case WorkspacesCreation:
|
|
|
|
|
return String("WorkspacesCreation");
|
|
|
|
|
case Preparation:
|
|
|
|
|
return String("Preparation");
|
|
|
|
|
case Execution:
|
|
|
|
|
return String("Execution");
|
|
|
|
|
case Archivation:
|
|
|
|
|
return String("Archivation");
|
|
|
|
|
case End:
|
|
|
|
|
return String("End");
|
|
|
|
|
default:
|
|
|
|
|
return "?";
|
|
|
|
|
}
|
2023-09-17 22:13:42 +03:00
|
|
|
}
|
|
|
|
|
//-
|
2023-12-03 13:09:16 +03:00
|
|
|
void print() {
|
2023-12-03 13:41:29 +03:00
|
|
|
for (auto& elem : this->getElements())
|
|
|
|
|
elem->print();
|
2023-12-03 13:09:16 +03:00
|
|
|
}
|
2023-12-03 13:41:29 +03:00
|
|
|
|
2023-12-03 13:09:16 +03:00
|
|
|
void init(const char* fileName, int recordSize) {
|
|
|
|
|
state = WorkspacesCreation;
|
|
|
|
|
File* packedTasks = new File(fileName);
|
|
|
|
|
Text* lines = packedTasks->readLines();
|
2023-12-03 13:41:29 +03:00
|
|
|
|
|
|
|
|
const long length = lines->getLength() / recordSize;
|
2023-12-03 13:09:16 +03:00
|
|
|
int offset = 0;
|
2023-12-03 13:41:29 +03:00
|
|
|
for (int i = 0; i < length; ++i) {
|
|
|
|
|
this->add(new T(lines, offset));
|
2023-12-03 13:09:16 +03:00
|
|
|
offset += recordSize;
|
|
|
|
|
}
|
|
|
|
|
delete packedTasks;
|
|
|
|
|
delete lines;
|
|
|
|
|
}
|
|
|
|
|
void Do() {
|
2023-09-17 22:13:42 +03:00
|
|
|
saveState();
|
2023-12-03 13:09:16 +03:00
|
|
|
long activeCount = 0;
|
2023-09-17 22:13:42 +03:00
|
|
|
//todo обязательно убрать отладочную печать.
|
2023-12-03 13:41:29 +03:00
|
|
|
printf("tasks count = %ld\n", this->getLength());
|
2023-12-03 13:09:16 +03:00
|
|
|
while (this->state != End) {
|
|
|
|
|
// printf("state=%d\n", this->state);
|
|
|
|
|
// printf("max=%d; busy=%d; free=%d\n", maxKernels, busyKernels, freeKernels);
|
|
|
|
|
activeCount = 0;
|
2023-12-03 13:41:29 +03:00
|
|
|
for (long i = 0; i < this->getLength(); ++i) {
|
|
|
|
|
T* task = this->get(i);
|
2023-12-03 13:09:16 +03:00
|
|
|
switch (this->state) {
|
|
|
|
|
case WorkspacesCreation:
|
|
|
|
|
if (task->getState() == Waiting) {
|
|
|
|
|
activeCount++;
|
|
|
|
|
task->createWorkspace();
|
|
|
|
|
task->setState(WorkspaceCreated);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Preparation:
|
|
|
|
|
if (task->getState() == WorkspaceCreated) {
|
|
|
|
|
activeCount++;
|
|
|
|
|
task->prepareWorkspace();
|
|
|
|
|
task->createLaunchScript();
|
|
|
|
|
task->setState(WorkspaceReady);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Execution:
|
|
|
|
|
if (task->getState() == WorkspaceReady) {
|
|
|
|
|
activeCount++;
|
|
|
|
|
task->Start();
|
|
|
|
|
}
|
|
|
|
|
else if (task->getState() == Running) {
|
|
|
|
|
activeCount++;
|
|
|
|
|
task->Check();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
// printf("id = %ld; state = %d\n", task->getId(), task->getState());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// printf("active count = %d\n", activeCount);
|
|
|
|
|
if (activeCount == 0) {
|
|
|
|
|
switch (this->state) {
|
|
|
|
|
case WorkspacesCreation:
|
|
|
|
|
this->state = Preparation;
|
|
|
|
|
saveState();
|
|
|
|
|
break;
|
|
|
|
|
case Preparation:
|
|
|
|
|
this->state = Execution;
|
|
|
|
|
saveState();
|
|
|
|
|
break;
|
|
|
|
|
case Execution:
|
|
|
|
|
Finalize();
|
|
|
|
|
this->state = End;
|
|
|
|
|
saveState();
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
this->state = End;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Utils::Sleep(2);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
virtual void Finalize() {}
|
|
|
|
|
void saveState() {
|
2023-09-17 22:13:42 +03:00
|
|
|
Utils::Sleep(1); //чтобы не было одинаковых по дате файлов.
|
2023-12-03 13:09:16 +03:00
|
|
|
String stateFile = packageWorkspace + "/state/" + getStatePrefix() + printState();
|
2023-09-17 22:13:42 +03:00
|
|
|
//printf("stateFile=<%s>\n", stateFile.getCharArray());
|
2023-12-03 13:09:16 +03:00
|
|
|
File(stateFile, Utils::getDate());
|
2023-09-17 22:13:42 +03:00
|
|
|
}
|
|
|
|
|
};
|