Skip to content

Commit dc15530

Browse files
authored
fix: Watcher on MacOS (#254)
* fix: Watcher on MacOS * fix: Kill time limit for watcher
1 parent fbcc3f7 commit dc15530

2 files changed

Lines changed: 18 additions & 24 deletions

File tree

src/core/judgingthread.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,7 @@ void JudgingThread::runProgram() {
954954
}
955955

956956
argumentsList << "_tmperr";
957-
argumentsList << QString("%1").arg(timeLimit + extraTime);
957+
argumentsList << QString("%1").arg(timeLimit);
958958
argumentsList << QString("%1").arg(memoryLimit);
959959
argumentsList << QString("%1").arg(rawTimeLimit);
960960
argumentsList << QString("%1").arg(rawMemoryLimit);
@@ -1007,7 +1007,7 @@ void JudgingThread::runProgram() {
10071007
}
10081008

10091009
argumentsList << "_tmperr";
1010-
argumentsList << QString("%1").arg(timeLimit + extraTime);
1010+
argumentsList << QString("%1").arg(timeLimit);
10111011
argumentsList << QString("%1").arg(memoryLimit);
10121012
argumentsList << QString("%1").arg(rawTimeLimit);
10131013
argumentsList << QString("%1").arg(rawMemoryLimit);
@@ -1044,7 +1044,10 @@ void JudgingThread::runProgram() {
10441044
QElapsedTimer timer;
10451045
timer.start();
10461046

1047-
while (timer.elapsed() <= timeLimit + extraTime) {
1047+
// Using rlimit to limit CPU time can only be accurate to seconds,
1048+
// so here it is rounded up to an integer second.
1049+
long long killTimeLimit = (timeLimit + 999) / 1000 * 1000 + extraTime;
1050+
while (timer.elapsed() <= killTimeLimit) {
10481051
if (runner->state() != QProcess::Running) {
10491052
isProgramFinishedInExtraTimeLimit = true;
10501053
break;

unix/watcher_unix.cpp

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -144,29 +144,20 @@ auto main(int argc, char *argv[]) -> int {
144144
return RS_RE;
145145
}
146146
} else {
147-
if (! stdinRedirect.empty()) {
148-
if (freopen(stdinRedirect.c_str(), "r", stdin) == NULL) {
149-
perror("freopen stdin");
150-
exit(RS_FAIL);
151-
}
152-
} else {
153-
fclose(stdin);
147+
std::string finalStdinRedirect = stdinRedirect.empty() ? "/dev/null" : stdinRedirect;
148+
if (freopen(finalStdinRedirect.c_str(), "r", stdin) == NULL) {
149+
perror("freopen stdin");
150+
exit(RS_FAIL);
154151
}
155-
if (! stdoutRedirect.empty()) {
156-
if (freopen(stdoutRedirect.c_str(), "w", stdout) == NULL) {
157-
perror("freopen stdout");
158-
exit(RS_FAIL);
159-
}
160-
} else {
161-
fclose(stdout);
152+
std::string finalStdoutRedirect = stdoutRedirect.empty() ? "/dev/null" : stdoutRedirect;
153+
if (freopen(finalStdoutRedirect.c_str(), "w", stdout) == NULL) {
154+
perror("freopen stdout");
155+
exit(RS_FAIL);
162156
}
163-
if (! stderrRedirect.empty()) {
164-
if (freopen(stderrRedirect.c_str(), "w", stderr) == NULL) {
165-
perror("freopen stderr");
166-
exit(RS_FAIL);
167-
}
168-
} else {
169-
fclose(stderr);
157+
std::string finalStderrRedirect = stderrRedirect.empty() ? "/dev/null" : stderrRedirect;
158+
if (freopen(finalStderrRedirect.c_str(), "w", stderr) == NULL) {
159+
perror("freopen stderr");
160+
exit(RS_FAIL);
170161
}
171162

172163
rlimit memlim{}, stalim{}, timlim{};

0 commit comments

Comments
 (0)