diff --git a/Planner/File.h b/Planner/File.h index 87f523b5..a93f8925 100644 --- a/Planner/File.h +++ b/Planner/File.h @@ -1,6 +1,7 @@ -#pragma once +#pragma once +#include "String.h" +#include "Text.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; diff --git a/Planner/Planner.cpp b/Planner/Planner.cpp index b58b5d30..5cf67c90 100644 --- a/Planner/Planner.cpp +++ b/Planner/Planner.cpp @@ -3,23 +3,25 @@ using namespace std; #if __cplusplus >= 201703L #include +#else +#include #endif #include "CompilationSupervisor.h" #include "RunSupervisor.h" #include "Global.h" -#include #include //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(); diff --git a/Planner/RunSupervisor.h b/Planner/RunSupervisor.h index de5c5e8f..527fc343 100644 --- a/Planner/RunSupervisor.h +++ b/Planner/RunSupervisor.h @@ -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"); - } + */ }; diff --git a/Planner/String.h b/Planner/String.h index 8ec848ce..2db4de42 100644 --- a/Planner/String.h +++ b/Planner/String.h @@ -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); } } diff --git a/Planner/Supervisor.h b/Planner/Supervisor.h index 43816477..de2c6dcb 100644 --- a/Planner/Supervisor.h +++ b/Planner/Supervisor.h @@ -5,7 +5,8 @@ #include #include #include "File.h" -#include "Task.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(); @@ -162,7 +165,7 @@ public: long activeTasks = 0; long done = 0; - for (auto& task : this->getElements()) { + for (auto& task : this->getElements()) { if (task->getState() == WorkspaceReady) { activeTasks++; sortedByKernelNeeds[task->getKernels()].push(task); @@ -183,7 +186,7 @@ public: for (auto& elem : sortedByKernelNeeds) { int freeKernels = maxKernels - busyKernels; int kernelsNeeded = elem.first; - + while (kernelsNeeded <= freeKernels && elem.second.size()) { T* task = elem.second.front(); elem.second.pop(); @@ -201,18 +204,18 @@ public: //если ядер не осталось, то нет смысла дальше смотреть if (freeKernels == 0) - break; + break; } // очищаем от пустых ключей for (auto& empty : emptyKeys) sortedByKernelNeeds.erase(empty); - + // проверяем нет ли завершившихся задач for (auto it = activeTaskSet.begin(); it != activeTaskSet.end(); ) { T* task = *(it); - + if (task->Check()) { it++; activeTaskSet.erase(task); @@ -225,7 +228,7 @@ public: } it++; } - + if (oldActiveTasks != activeTasks) printf("done %ld / %ld\n", done, this->getLength()); } @@ -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()); } }; \ No newline at end of file diff --git a/Planner/Task.h b/Planner/Task.h index 95c9671f..c3882a92 100644 --- a/Planner/Task.h +++ b/Planner/Task.h @@ -32,61 +32,64 @@ enum TestType { Correctness, //1 Performance, //2 }; - -class Task { -protected: + +class Task { +protected: long id; - int maxtime; + + int maxtime; int kernels; //получение зависит от типа задачи. - String workspace; - TaskState state; + 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 { + long now = Utils::getAbsoluteTime(); + long delta = now-start_time; + if (maxtime