From 68c21c69555dcbb42e9db6db11dfa27c43156cc0 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Wed, 5 Feb 2025 19:18:05 +0300 Subject: [PATCH] improved planner --- src/files/Supervisor.h | 40 ++++++++++++++++++++++++++++++++++++---- src/files/Utils.h | 3 +++ src/files/planner.cpp | 7 +++++-- src/files/version.h | 2 +- 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/files/Supervisor.h b/src/files/Supervisor.h index 2c7a2284..0e37176d 100644 --- a/src/files/Supervisor.h +++ b/src/files/Supervisor.h @@ -9,6 +9,13 @@ #include "File.h" #include "Task.h" #include "Array.h" +#include "Utils.h" + +#ifndef _WIN32 + #include + #include +#endif +#include enum SupervisorState { WorkspacesCreation, //0 @@ -16,11 +23,12 @@ enum SupervisorState { Execution, //2 End //3 }; - + template class Supervisor : public Array { protected: SupervisorState state; + public: virtual String getStatePrefix() { return String(""); @@ -108,11 +116,13 @@ public: map, std::greater> sortedByKernelNeeds; size_t activeTasks = 0; + size_t totalProcessTasks = 0; int maxNeededKernels = 0; for (auto& task : this->getElements()) { if (task->getState() == WorkspaceReady) { activeTasks++; + totalProcessTasks += task->getKernels(); sortedByKernelNeeds[task->getKernels()].push(task); if (maxNeededKernels < task->getKernels()) maxNeededKernels = task->getKernels(); @@ -145,9 +155,10 @@ public: vector toDel; size_t done = 0; - size_t step = ceil(activeTasks * 0.01); // step == 1% - const double total = activeTasks; + size_t step = ceil(totalProcessTasks * 0.01); // step == 1% + const double total = totalProcessTasks; + auto timer_start = Utils::getAbsoluteTime(); while (activeTasks) { long oldActiveTasks = activeTasks; emptyKeys.clear(); @@ -189,7 +200,7 @@ public: if (task->Check()) { toDel.push_back(task); activeTasks--; - done++; + done += task->getKernels(); busyKernels -= task->getKernels(); #if DEB printf(" done task with %d kernels and id %ld\n", task->getKernels(), task->getId()); @@ -212,6 +223,16 @@ public: saveProgress(persentDone); } } + + // прошло больше 10 секунд, проверяем паузу + if (Utils::getAbsoluteTime() - timer_start > 30) { + printf("stoped\n"); + while (checkPause()) { + Utils::Sleep(10); + } + timer_start = Utils::getAbsoluteTime(); + printf("resume\n"); + } } changeState(); @@ -219,10 +240,12 @@ public: String outFile(pathRes + "/" + getStatePrefix() + "Info.txt"); File tmp(outFile, String(buf.c_str())); } + void saveState() { String stateFile = packageWorkspace + "/state/" + getStatePrefix() + printState(); File tmp(stateFile, Utils::getDate()); } + void saveProgress(long long persentDone) { FILE *f = fopen("progress", "w"); if (f) { @@ -230,4 +253,13 @@ public: fclose(f); } } + + bool checkPause() { + FILE* f = fopen("pause", "w"); + if (f) { + fclose(f); + return true; + } + return false; + } }; \ No newline at end of file diff --git a/src/files/Utils.h b/src/files/Utils.h index b5633dcb..9269fed6 100644 --- a/src/files/Utils.h +++ b/src/files/Utils.h @@ -55,6 +55,7 @@ public: std::chrono::seconds timespan(s); std::this_thread::sleep_for(timespan); } + static void Copy(const String& src, const String& dst) { #if __cplusplus >= 201703L std::filesystem::copy(src.getCharArray(), dst.getCharArray()); @@ -73,9 +74,11 @@ public: //printf("cp -r '%s' return code = %d\n",src.getCharArray(),i); #endif } + static time_t getAbsoluteTime() { return time(NULL); } + static String getDate() { auto ttime = time(NULL); String res(ctime(&ttime)); diff --git a/src/files/planner.cpp b/src/files/planner.cpp index 1f59b362..ce0d2ef6 100644 --- a/src/files/planner.cpp +++ b/src/files/planner.cpp @@ -3,14 +3,17 @@ using namespace std; #if __cplusplus >= 201703L #include -#else -#include #endif #include "CompilationSupervisor.h" #include "RunSupervisor.h" #include "Global.h" #include +#ifndef _WIN32 +#include +#else + +#endif //https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB_(Unix) void hdl(int sig) diff --git a/src/files/version.h b/src/files/version.h index e440e5c8..bf0d87ab 100644 --- a/src/files/version.h +++ b/src/files/version.h @@ -1 +1 @@ -3 \ No newline at end of file +4 \ No newline at end of file