diff --git a/src/base/LemonUtils.hpp b/src/base/LemonUtils.hpp index c4c60795..67d2c195 100644 --- a/src/base/LemonUtils.hpp +++ b/src/base/LemonUtils.hpp @@ -30,6 +30,13 @@ namespace Lemon::detail { } else return -1; } + inline qint64 jsonReadHelper(qint64 &val, const QJsonValue &jval) { + if (jval.isDouble()) { + val = jval.toInteger(); + return 0; + } else + return -1; + } inline int jsonReadHelper(bool &val, const QJsonValue &jval) { if (jval.isBool()) { val = jval.toBool(); diff --git a/src/component/exportutil/exportutil.cpp b/src/component/exportutil/exportutil.cpp index ae27ff87..3cb35652 100644 --- a/src/component/exportutil/exportutil.cpp +++ b/src/component/exportutil/exportutil.cpp @@ -126,7 +126,7 @@ auto ExportUtil::getContestantHtmlCode(Contest *contest, Contestant *contestant, QList> result = contestant->getResult(i); QList message = contestant->getMessage(i); QList> timeUsed = contestant->getTimeUsed(i); - QList> memoryUsed = contestant->getMemoryUsed(i); + QList> memoryUsed = contestant->getMemoryUsed(i); QList> score = contestant->getScore(i); for (int j = 0; j < inputFiles.size(); j++) { @@ -493,7 +493,7 @@ auto ExportUtil::getSmallerContestantHtmlCode(Contest *contest, Contestant *cont QList> result = contestant->getResult(i); QList message = contestant->getMessage(i); QList> timeUsed = contestant->getTimeUsed(i); - QList> memoryUsed = contestant->getMemoryUsed(i); + QList> memoryUsed = contestant->getMemoryUsed(i); QList> score = contestant->getScore(i); for (int j = 0; j < inputFiles.size(); j++) { diff --git a/src/core/contestant.cpp b/src/core/contestant.cpp index f9f0fb01..6268cf38 100644 --- a/src/core/contestant.cpp +++ b/src/core/contestant.cpp @@ -36,7 +36,7 @@ auto Contestant::getScore(int index) const -> const QList> & { return auto Contestant::getTimeUsed(int index) const -> const QList> & { return timeUsed[index]; } -auto Contestant::getMemoryUsed(int index) const -> const QList> & { return memoryUsed[index]; } +auto Contestant::getMemoryUsed(int index) const -> const QList> & { return memoryUsed[index]; } auto Contestant::getJudingTime() const -> QDateTime { return judgingTime; } @@ -60,7 +60,7 @@ void Contestant::setScore(int index, const QList> &_score) { score[in void Contestant::setTimeUsed(int index, const QList> &_timeUsed) { timeUsed[index] = _timeUsed; } -void Contestant::setMemoryUsed(int index, const QList> &_memoryUsed) { +void Contestant::setMemoryUsed(int index, const QList> &_memoryUsed) { memoryUsed[index] = _memoryUsed; } @@ -76,7 +76,7 @@ void Contestant::addTask() { message.append(QList()); score.append(QList>()); timeUsed.append(QList>()); - memoryUsed.append(QList>()); + memoryUsed.append(QList>()); } void Contestant::deleteTask(int index) { diff --git a/src/core/contestant.h b/src/core/contestant.h index b9f693f7..2cd008ac 100644 --- a/src/core/contestant.h +++ b/src/core/contestant.h @@ -30,7 +30,7 @@ class Contestant : public QObject { const QList &getMessage(int) const; const QList> &getScore(int) const; const QList> &getTimeUsed(int) const; - const QList> &getMemoryUsed(int) const; + const QList> &getMemoryUsed(int) const; QDateTime getJudingTime() const; int getTaskScore(int) const; int getTotalScore() const; @@ -46,7 +46,7 @@ class Contestant : public QObject { void setMessage(int, const QList &); void setScore(int, const QList> &); void setTimeUsed(int, const QList> &); - void setMemoryUsed(int, const QList> &); + void setMemoryUsed(int, const QList> &); void setJudgingTime(QDateTime); int writeToJson(QJsonObject &); @@ -64,7 +64,7 @@ class Contestant : public QObject { QList> message; QList>> score; QList>> timeUsed; - QList>> memoryUsed; + QList>> memoryUsed; QDateTime judgingTime; // QList taskResults; diff --git a/src/core/judgingthread.cpp b/src/core/judgingthread.cpp index 310ae1df..b19af4d3 100644 --- a/src/core/judgingthread.cpp +++ b/src/core/judgingthread.cpp @@ -82,7 +82,7 @@ void JudgingThread::setInterpreterAsWatcher(bool use) { interpreterAsWatcher = u auto JudgingThread::getTimeUsed() const -> int { return timeUsed; } -auto JudgingThread::getMemoryUsed() const -> int { return memoryUsed; } +auto JudgingThread::getMemoryUsed() const -> qint64 { return memoryUsed; } auto JudgingThread::getScore() const -> int { return score; } @@ -828,4 +828,4 @@ void JudgingThread::run() { judgeAnswersOnlyTask(); break; } -} +} \ No newline at end of file diff --git a/src/core/judgingthread.h b/src/core/judgingthread.h index 0109d724..8e632452 100644 --- a/src/core/judgingthread.h +++ b/src/core/judgingthread.h @@ -41,7 +41,7 @@ class JudgingThread : public QThread { void setRawMemoryLimit(int); void setInterpreterAsWatcher(bool); int getTimeUsed() const; - int getMemoryUsed() const; + qint64 getMemoryUsed() const; int getScore() const; int getFullScore() const; int getJudgeTimes() const; @@ -72,7 +72,7 @@ class JudgingThread : public QThread { int memoryLimit{}; int rawMemoryLimit{}; int timeUsed; - int memoryUsed; + qint64 memoryUsed; int score{}; int judgedTimes; ResultState result; diff --git a/src/core/processrunner_win.cpp b/src/core/processrunner_win.cpp index a1090389..35ee2907 100644 --- a/src/core/processrunner_win.cpp +++ b/src/core/processrunner_win.cpp @@ -268,7 +268,8 @@ ProcessRunnerResult WinProcessRunner::run() { if (config.memoryLimit != -1) { GetProcessMemoryInfo(pi.hProcess, (PROCESS_MEMORY_COUNTERS *)&memoryInfo, sizeof(memoryInfo)); - if (qMax(memoryInfo.PrivateUsage, memoryInfo.PeakWorkingSetSize) > config.memoryLimit * 1024 * 1024) { + if (qMax(memoryInfo.PrivateUsage, memoryInfo.PeakWorkingSetSize) > + 1ll * config.memoryLimit * 1024 * 1024) { TerminateProcess(pi.hProcess, 0); res.score = 0; @@ -292,7 +293,7 @@ ProcessRunnerResult WinProcessRunner::run() { GetProcessMemoryInfo(pi.hProcess, (PROCESS_MEMORY_COUNTERS *)&memoryInfo, sizeof(memoryInfo)); if (qMax(memoryInfo.PrivateUsage, memoryInfo.PeakWorkingSetSize) > - config.memoryLimit * 1024U * 1024) { + 1ll * config.memoryLimit * 1024 * 1024) { TerminateProcess(pi.hProcess, 0); res.score = 0; res.result = MemoryLimitExceeded; diff --git a/src/core/taskjudger.cpp b/src/core/taskjudger.cpp index e566c9c6..2b289f69 100644 --- a/src/core/taskjudger.cpp +++ b/src/core/taskjudger.cpp @@ -360,7 +360,7 @@ int TaskJudger::judge() { for (int i = 0; i < task->getTestCaseList().size(); i++) { timeUsed.append(QList()); - memoryUsed.append(QList()); + memoryUsed.append(QList()); score.append(QList()); result.append(QList()); overallStatus.append(maxDependValue); diff --git a/src/core/taskjudger.h b/src/core/taskjudger.h index c7cd0db9..926cb090 100644 --- a/src/core/taskjudger.h +++ b/src/core/taskjudger.h @@ -56,7 +56,7 @@ class TaskJudger : public QObject { QProcessEnvironment environment; QList overallStatus; QList> timeUsed; - QList> memoryUsed; + QList> memoryUsed; QList> score; QList> result; QList message; diff --git a/src/detaildialog.cpp b/src/detaildialog.cpp index 15533d96..e2d59d45 100644 --- a/src/detaildialog.cpp +++ b/src/detaildialog.cpp @@ -133,7 +133,7 @@ void DetailDialog::refreshViewer(Contest *_contest, Contestant *_contestant) { QList> result = contestant->getResult(i); QList message = contestant->getMessage(i); QList> timeUsed = contestant->getTimeUsed(i); - QList> memoryUsed = contestant->getMemoryUsed(i); + QList> memoryUsed = contestant->getMemoryUsed(i); QList> score = contestant->getScore(i); for (int j = 0; j < inputFiles.size(); j++) { diff --git a/src/judgingdialog.cpp b/src/judgingdialog.cpp index c703820b..38d64991 100644 --- a/src/judgingdialog.cpp +++ b/src/judgingdialog.cpp @@ -83,7 +83,7 @@ void JudgingDialog::judgeAll() { } void JudgingDialog::singleCaseFinished(QString contestantName, int progress, int x, int y, int result, - int scoreGot, int timeUsed, int memoryUsed) { + int scoreGot, int timeUsed, qint64 memoryUsed) { bool isOnMaxValue = ui->logViewer->verticalScrollBar()->value() == ui->logViewer->verticalScrollBar()->maximum(); QTextBlockFormat blockFormat; diff --git a/src/judgingdialog.h b/src/judgingdialog.h index 66b9fdad..c41b39e7 100644 --- a/src/judgingdialog.h +++ b/src/judgingdialog.h @@ -43,7 +43,7 @@ class JudgingDialog : public QDialog { public slots: void dialogAlert(const QString &); - void singleCaseFinished(QString, int, int, int, int, int, int, int); + void singleCaseFinished(QString, int, int, int, int, int, int, qint64); void singleSubtaskDependenceFinished(int, int, int); void taskJudgingStarted(const QString &); void taskJudgedDisplay(const QString &, const QList> &, const int);