fixed merge
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "String.h"
|
||||
#include "Text.h"
|
||||
|
||||
class File {
|
||||
FILE* ptr;
|
||||
public:
|
||||
@@ -15,6 +16,9 @@ public:
|
||||
fprintf(ptr, "%s\n", text.getCharArray());
|
||||
}
|
||||
~File() {
|
||||
Close();
|
||||
}
|
||||
void Close() {
|
||||
if (ptr != NULL) {
|
||||
fclose(ptr);
|
||||
ptr = NULL;
|
||||
|
||||
@@ -3,23 +3,25 @@ using namespace std;
|
||||
|
||||
#if __cplusplus >= 201703L
|
||||
#include <filesystem>
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "CompilationSupervisor.h"
|
||||
#include "RunSupervisor.h"
|
||||
#include "Global.h"
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
|
||||
//https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB_(Unix)
|
||||
void hdl(int sig)
|
||||
{
|
||||
String file_name = "GOT_SIGNAL_AT_"+String(Utils::getAbsoluteTime());
|
||||
String file_name = "GOT_SIGNAL_AT_"+ String(Utils::getAbsoluteTime());
|
||||
FILE * res = fopen(file_name.getCharArray(),"w");
|
||||
fprintf(res,"%d\n", sig);
|
||||
fclose(res);
|
||||
}
|
||||
void set_handlers(){
|
||||
void set_handlers() {
|
||||
#ifndef _WIN32
|
||||
struct sigaction act;
|
||||
memset(&act, 0, sizeof(act));
|
||||
act.sa_handler = hdl;
|
||||
@@ -80,7 +82,9 @@ void set_handlers(){
|
||||
sigaction(SIGVTALRM, &act, 0);
|
||||
sigaction(SIGXCPU, &act, 0);
|
||||
sigaction(SIGXFSZ, &act, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
//+
|
||||
@@ -104,7 +108,12 @@ int main(int argc, char ** argv)
|
||||
userWorkspace.println();
|
||||
packageWorkspace.println();
|
||||
printf("%d\n", maxKernels);
|
||||
#ifndef _WIN32
|
||||
int pid = getpid();
|
||||
#else
|
||||
int pid = _getpid();
|
||||
#endif
|
||||
|
||||
printf("PID=%d\n", pid);
|
||||
File pidFile("PID", String(pid));
|
||||
pidFile.Close();
|
||||
|
||||
@@ -22,12 +22,14 @@ public:
|
||||
virtual String getStatePrefix() {
|
||||
return String("Running");
|
||||
}
|
||||
virtual void Finalize() {
|
||||
|
||||
/*
|
||||
virtual void Finalize(){
|
||||
this->state = Archivation;
|
||||
saveState();
|
||||
printf("Archivation started\n");
|
||||
Utils::ZipFolder(String("./"), String("archive.zip"));
|
||||
Utils::ZipFolder(String("./"),String("archive.zip"));
|
||||
printf("Archivation ended\n");
|
||||
|
||||
}
|
||||
*/
|
||||
};
|
||||
|
||||
@@ -74,7 +74,12 @@ public:
|
||||
sprintf(body, "%d", s);
|
||||
}
|
||||
}
|
||||
|
||||
String(long s) {
|
||||
String((long long)s);
|
||||
}
|
||||
|
||||
String(long long s) {
|
||||
length = 0;
|
||||
body = new char[1];
|
||||
body[0] = '\0';
|
||||
@@ -87,7 +92,7 @@ public:
|
||||
}
|
||||
length = size;
|
||||
body = new char[size + 1];
|
||||
sprintf(body, "%ld", s);
|
||||
sprintf(body, "%lld", s);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <queue>
|
||||
#include "File.h"
|
||||
#include "Task.h"
|
||||
#include "Array.h"
|
||||
|
||||
enum SupervisorState {
|
||||
WorkspacesCreation, //0
|
||||
@@ -87,8 +88,8 @@ public:
|
||||
//todo обязательно убрать отладочную печать.
|
||||
printf("tasks count = %ld\n", this->getLength());
|
||||
while (this->state != End) {
|
||||
// printf("state=%d\n", this->state);
|
||||
// printf("max=%d; busy=%d; free=%d\n", maxKernels, busyKernels, freeKernels);
|
||||
// printf("state=%d\n", this->state);
|
||||
// printf("max=%d; busy=%d; free=%d\n", maxKernels, busyKernels, freeKernels);
|
||||
activeCount = 0;
|
||||
for (long i = 0; i < this->getLength(); ++i) {
|
||||
T* task = this->get(i);
|
||||
@@ -111,6 +112,7 @@ public:
|
||||
case Execution:
|
||||
if (task->getState() == WorkspaceReady) {
|
||||
activeCount++;
|
||||
task->start_time = Utils::getAbsoluteTime();
|
||||
task->Start();
|
||||
}
|
||||
else if (task->getState() == Running) {
|
||||
@@ -119,17 +121,18 @@ public:
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// printf("id = %ld; state = %d\n", task->getId(), task->getState());
|
||||
// printf("id = %ld; state = %d\n", task->getId(), task->getState());
|
||||
break;
|
||||
}
|
||||
}
|
||||
// printf("active count = %d\n", activeCount);
|
||||
// printf("active count = %d\n", activeCount);
|
||||
if (activeCount == 0)
|
||||
changeState();
|
||||
Utils::Sleep(2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void DoWithSchedule(int maxKernels) {
|
||||
saveState();
|
||||
|
||||
@@ -234,10 +237,11 @@ public:
|
||||
}
|
||||
|
||||
virtual void Finalize() {}
|
||||
|
||||
void saveState() {
|
||||
Utils::Sleep(1); //чтобы не было одинаковых по дате файлов.
|
||||
String stateFile = packageWorkspace + "/state/" + getStatePrefix() + printState();
|
||||
//printf("stateFile=<%s>\n", stateFile.getCharArray());
|
||||
File tmp(stateFile, Utils::getDate());
|
||||
File(stateFile, Utils::getDate());
|
||||
}
|
||||
};
|
||||
105
Planner/Task.h
105
Planner/Task.h
@@ -36,57 +36,60 @@ enum TestType {
|
||||
class Task {
|
||||
protected:
|
||||
long id;
|
||||
|
||||
int maxtime;
|
||||
int kernels; //получение зависит от типа задачи.
|
||||
String workspace;
|
||||
TaskState state;
|
||||
public:
|
||||
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 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) {
|
||||
@@ -146,13 +149,17 @@ public:
|
||||
if (Utils::Exists(workspace + "/TIMEOUT")) {
|
||||
state = AbortedByTimeout;
|
||||
//todo определить по интервалу времени на всякий случай.
|
||||
}
|
||||
else if (Utils::Exists(workspace + "/INTERRUPT")) {
|
||||
state = AbortedByUser;
|
||||
}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) {
|
||||
if (state!=Running){
|
||||
//-
|
||||
busyKernels = Utils::min(busyKernels - kernels, maxKernels);
|
||||
freeKernels = Utils::max(0, maxKernels - busyKernels);
|
||||
|
||||
Reference in New Issue
Block a user