Skip to content

Commit 2e89fbf

Browse files
authored
fix: store memoryUsed as long long instead of int (#292)
* fix: store memoryUsed as long long instead of int * upd * fix * fmt * use int64_t instead of long long * use qint64 * merge * fmt * use unsigned 1024 * use long long * fix: update singleCaseFinished method to use qint64 for memory parameters * fix: update memoryUsed handling to convert from int to qint64 during stream read
1 parent 8fe328b commit 2e89fbf

14 files changed

Lines changed: 44 additions & 23 deletions

src/base/LemonUtils.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ namespace Lemon::detail {
3030
} else
3131
return -1;
3232
}
33+
inline qint64 jsonReadHelper(qint64 &val, const QJsonValue &jval) {
34+
if (jval.isDouble()) {
35+
val = jval.toInteger();
36+
return 0;
37+
} else
38+
return -1;
39+
}
3340
inline int jsonReadHelper(bool &val, const QJsonValue &jval) {
3441
if (jval.isBool()) {
3542
val = jval.toBool();

src/component/exportutil/exportutil.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ auto ExportUtil::getContestantHtmlCode(Contest *contest, Contestant *contestant,
126126
QList<QList<ResultState>> result = contestant->getResult(i);
127127
QList<QStringList> message = contestant->getMessage(i);
128128
QList<QList<int>> timeUsed = contestant->getTimeUsed(i);
129-
QList<QList<int>> memoryUsed = contestant->getMemoryUsed(i);
129+
QList<QList<qint64>> memoryUsed = contestant->getMemoryUsed(i);
130130
QList<QList<int>> score = contestant->getScore(i);
131131

132132
for (int j = 0; j < inputFiles.size(); j++) {
@@ -493,7 +493,7 @@ auto ExportUtil::getSmallerContestantHtmlCode(Contest *contest, Contestant *cont
493493
QList<QList<ResultState>> result = contestant->getResult(i);
494494
QList<QStringList> message = contestant->getMessage(i);
495495
QList<QList<int>> timeUsed = contestant->getTimeUsed(i);
496-
QList<QList<int>> memoryUsed = contestant->getMemoryUsed(i);
496+
QList<QList<qint64>> memoryUsed = contestant->getMemoryUsed(i);
497497
QList<QList<int>> score = contestant->getScore(i);
498498

499499
for (int j = 0; j < inputFiles.size(); j++) {

src/core/contest.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class Contest : public QObject {
7171
void taskDeletedForViewer(int);
7272
void problemTitleChanged();
7373
void dialogAlert(QString);
74-
void singleCaseFinished(QString, int, int, int, int, int, int, int);
74+
void singleCaseFinished(QString, int, int, int, int, int, int, qint64);
7575
void singleSubtaskDependenceFinished(int, int, int);
7676
void taskJudgingStarted(QString);
7777
void taskJudgingFinished();

src/core/contestant.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ auto Contestant::getScore(int index) const -> const QList<QList<int>> & { return
3636

3737
auto Contestant::getTimeUsed(int index) const -> const QList<QList<int>> & { return timeUsed[index]; }
3838

39-
auto Contestant::getMemoryUsed(int index) const -> const QList<QList<int>> & { return memoryUsed[index]; }
39+
auto Contestant::getMemoryUsed(int index) const -> const QList<QList<qint64>> & { return memoryUsed[index]; }
4040

4141
auto Contestant::getJudingTime() const -> QDateTime { return judgingTime; }
4242

@@ -60,7 +60,7 @@ void Contestant::setScore(int index, const QList<QList<int>> &_score) { score[in
6060

6161
void Contestant::setTimeUsed(int index, const QList<QList<int>> &_timeUsed) { timeUsed[index] = _timeUsed; }
6262

63-
void Contestant::setMemoryUsed(int index, const QList<QList<int>> &_memoryUsed) {
63+
void Contestant::setMemoryUsed(int index, const QList<QList<qint64>> &_memoryUsed) {
6464
memoryUsed[index] = _memoryUsed;
6565
}
6666

@@ -76,7 +76,7 @@ void Contestant::addTask() {
7676
message.append(QList<QStringList>());
7777
score.append(QList<QList<int>>());
7878
timeUsed.append(QList<QList<int>>());
79-
memoryUsed.append(QList<QList<int>>());
79+
memoryUsed.append(QList<QList<qint64>>());
8080
}
8181

8282
void Contestant::deleteTask(int index) {
@@ -236,7 +236,20 @@ void Contestant::readFromStream(QDataStream &in) {
236236
in >> message;
237237
in >> score;
238238
in >> timeUsed;
239-
in >> memoryUsed;
239+
// memoryUsed 之前存储为 int 三维数组,现在改为了 qint64,因此先读取旧结构,再逐层转换
240+
QList<QList<QList<int>>> oldMemoryUsed;
241+
in >> oldMemoryUsed;
242+
for (const auto &l1 : oldMemoryUsed) {
243+
QList<QList<qint64>> newL1;
244+
for (const auto &l2 : l1) {
245+
QList<qint64> newL2;
246+
for (int v : l2) {
247+
newL2.append(v);
248+
}
249+
newL1.append(newL2);
250+
}
251+
memoryUsed.append(newL1);
252+
}
240253
quint32 judgingTime_date = 0;
241254
quint32 judgingTime_time = 0;
242255
quint8 judgingTime_timespec = 0;

src/core/contestant.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class Contestant : public QObject {
3030
const QList<QStringList> &getMessage(int) const;
3131
const QList<QList<int>> &getScore(int) const;
3232
const QList<QList<int>> &getTimeUsed(int) const;
33-
const QList<QList<int>> &getMemoryUsed(int) const;
33+
const QList<QList<qint64>> &getMemoryUsed(int) const;
3434
QDateTime getJudingTime() const;
3535
int getTaskScore(int) const;
3636
int getTotalScore() const;
@@ -46,7 +46,7 @@ class Contestant : public QObject {
4646
void setMessage(int, const QList<QStringList> &);
4747
void setScore(int, const QList<QList<int>> &);
4848
void setTimeUsed(int, const QList<QList<int>> &);
49-
void setMemoryUsed(int, const QList<QList<int>> &);
49+
void setMemoryUsed(int, const QList<QList<qint64>> &);
5050
void setJudgingTime(QDateTime);
5151

5252
int writeToJson(QJsonObject &);
@@ -64,7 +64,7 @@ class Contestant : public QObject {
6464
QList<QList<QStringList>> message;
6565
QList<QList<QList<int>>> score;
6666
QList<QList<QList<int>>> timeUsed;
67-
QList<QList<QList<int>>> memoryUsed;
67+
QList<QList<QList<qint64>>> memoryUsed;
6868
QDateTime judgingTime;
6969

7070
// QList<TaskResult> taskResults;

src/core/judgingthread.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ void JudgingThread::setInterpreterAsWatcher(bool use) { interpreterAsWatcher = u
8282

8383
auto JudgingThread::getTimeUsed() const -> int { return timeUsed; }
8484

85-
auto JudgingThread::getMemoryUsed() const -> int { return memoryUsed; }
85+
auto JudgingThread::getMemoryUsed() const -> qint64 { return memoryUsed; }
8686

8787
auto JudgingThread::getScore() const -> int { return score; }
8888

@@ -828,4 +828,4 @@ void JudgingThread::run() {
828828
judgeAnswersOnlyTask();
829829
break;
830830
}
831-
}
831+
}

src/core/judgingthread.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class JudgingThread : public QThread {
4141
void setRawMemoryLimit(int);
4242
void setInterpreterAsWatcher(bool);
4343
int getTimeUsed() const;
44-
int getMemoryUsed() const;
44+
qint64 getMemoryUsed() const;
4545
int getScore() const;
4646
int getFullScore() const;
4747
int getJudgeTimes() const;
@@ -72,7 +72,7 @@ class JudgingThread : public QThread {
7272
int memoryLimit{};
7373
int rawMemoryLimit{};
7474
int timeUsed;
75-
int memoryUsed;
75+
qint64 memoryUsed;
7676
int score{};
7777
int judgedTimes;
7878
ResultState result;

src/core/processrunner.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ struct ProcessRunnerResult {
3636
ResultState result = CorrectAnswer;
3737
int score = 0;
3838
int timeUsed = -1;
39-
int memoryUsed = -1;
39+
qint64 memoryUsed = -1;
4040
QString message;
4141
};
4242

src/core/processrunner_win.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,8 @@ ProcessRunnerResult WinProcessRunner::run() {
268268
if (config.memoryLimit != -1) {
269269
GetProcessMemoryInfo(pi.hProcess, (PROCESS_MEMORY_COUNTERS *)&memoryInfo, sizeof(memoryInfo));
270270

271-
if (qMax(memoryInfo.PrivateUsage, memoryInfo.PeakWorkingSetSize) > config.memoryLimit * 1024 * 1024) {
271+
if (qMax(memoryInfo.PrivateUsage, memoryInfo.PeakWorkingSetSize) >
272+
1ll * config.memoryLimit * 1024 * 1024) {
272273
TerminateProcess(pi.hProcess, 0);
273274

274275
res.score = 0;
@@ -292,7 +293,7 @@ ProcessRunnerResult WinProcessRunner::run() {
292293
GetProcessMemoryInfo(pi.hProcess, (PROCESS_MEMORY_COUNTERS *)&memoryInfo, sizeof(memoryInfo));
293294

294295
if (qMax(memoryInfo.PrivateUsage, memoryInfo.PeakWorkingSetSize) >
295-
config.memoryLimit * 1024U * 1024) {
296+
1ll * config.memoryLimit * 1024 * 1024) {
296297
TerminateProcess(pi.hProcess, 0);
297298
res.score = 0;
298299
res.result = MemoryLimitExceeded;

src/core/taskjudger.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ int TaskJudger::judge() {
360360

361361
for (int i = 0; i < task->getTestCaseList().size(); i++) {
362362
timeUsed.append(QList<int>());
363-
memoryUsed.append(QList<int>());
363+
memoryUsed.append(QList<qint64>());
364364
score.append(QList<int>());
365365
result.append(QList<ResultState>());
366366
overallStatus.append(maxDependValue);

0 commit comments

Comments
 (0)