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/contest.h b/src/core/contest.h index 83a21942..1aabb6d4 100644 --- a/src/core/contest.h +++ b/src/core/contest.h @@ -71,7 +71,7 @@ class Contest : public QObject { void taskDeletedForViewer(int); void problemTitleChanged(); void dialogAlert(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(QString); void taskJudgingFinished(); diff --git a/src/core/contestant.cpp b/src/core/contestant.cpp index f9f0fb01..d6112716 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) { @@ -236,7 +236,20 @@ void Contestant::readFromStream(QDataStream &in) { in >> message; in >> score; in >> timeUsed; - in >> memoryUsed; + // memoryUsed 之前存储为 int 三维数组,现在改为了 qint64,因此先读取旧结构,再逐层转换 + QList>> oldMemoryUsed; + in >> oldMemoryUsed; + for (const auto &l1 : oldMemoryUsed) { + QList> newL1; + for (const auto &l2 : l1) { + QList newL2; + for (int v : l2) { + newL2.append(v); + } + newL1.append(newL2); + } + memoryUsed.append(newL1); + } quint32 judgingTime_date = 0; quint32 judgingTime_time = 0; quint8 judgingTime_timespec = 0; 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.h b/src/core/processrunner.h index a749cd4e..40d3ec1d 100644 --- a/src/core/processrunner.h +++ b/src/core/processrunner.h @@ -36,7 +36,7 @@ struct ProcessRunnerResult { ResultState result = CorrectAnswer; int score = 0; int timeUsed = -1; - int memoryUsed = -1; + qint64 memoryUsed = -1; QString message; }; 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..4a8fd7a8 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; @@ -81,7 +81,7 @@ class TaskJudger : public QObject { void judgingStarted(QString); void judgingFinished(); void dialogAlert(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 compileError(int, int); void stopJudgingSignal(); 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);