Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/core/judgingthread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -954,7 +954,7 @@ void JudgingThread::runProgram() {
}

argumentsList << "_tmperr";
argumentsList << QString("%1").arg(timeLimit + extraTime);
argumentsList << QString("%1").arg(timeLimit);
argumentsList << QString("%1").arg(memoryLimit);
argumentsList << QString("%1").arg(rawTimeLimit);
argumentsList << QString("%1").arg(rawMemoryLimit);
Expand Down Expand Up @@ -1007,7 +1007,7 @@ void JudgingThread::runProgram() {
}

argumentsList << "_tmperr";
argumentsList << QString("%1").arg(timeLimit + extraTime);
argumentsList << QString("%1").arg(timeLimit);
argumentsList << QString("%1").arg(memoryLimit);
argumentsList << QString("%1").arg(rawTimeLimit);
argumentsList << QString("%1").arg(rawMemoryLimit);
Expand Down Expand Up @@ -1044,7 +1044,10 @@ void JudgingThread::runProgram() {
QElapsedTimer timer;
timer.start();

while (timer.elapsed() <= timeLimit + extraTime) {
// Using rlimit to limit CPU time can only be accurate to seconds,
// so here it is rounded up to an integer second.
long long killTimeLimit = (timeLimit + 999) / 1000 * 1000 + extraTime;
while (timer.elapsed() <= killTimeLimit) {
if (runner->state() != QProcess::Running) {
isProgramFinishedInExtraTimeLimit = true;
break;
Expand Down
33 changes: 12 additions & 21 deletions unix/watcher_unix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,29 +144,20 @@ auto main(int argc, char *argv[]) -> int {
return RS_RE;
}
} else {
if (! stdinRedirect.empty()) {
if (freopen(stdinRedirect.c_str(), "r", stdin) == NULL) {
perror("freopen stdin");
exit(RS_FAIL);
}
} else {
fclose(stdin);
std::string finalStdinRedirect = stdinRedirect.empty() ? "/dev/null" : stdinRedirect;
if (freopen(finalStdinRedirect.c_str(), "r", stdin) == NULL) {
perror("freopen stdin");
exit(RS_FAIL);
}
if (! stdoutRedirect.empty()) {
if (freopen(stdoutRedirect.c_str(), "w", stdout) == NULL) {
perror("freopen stdout");
exit(RS_FAIL);
}
} else {
fclose(stdout);
std::string finalStdoutRedirect = stdoutRedirect.empty() ? "/dev/null" : stdoutRedirect;
if (freopen(finalStdoutRedirect.c_str(), "w", stdout) == NULL) {
perror("freopen stdout");
exit(RS_FAIL);
}
if (! stderrRedirect.empty()) {
if (freopen(stderrRedirect.c_str(), "w", stderr) == NULL) {
perror("freopen stderr");
exit(RS_FAIL);
}
} else {
fclose(stderr);
std::string finalStderrRedirect = stderrRedirect.empty() ? "/dev/null" : stderrRedirect;
if (freopen(finalStderrRedirect.c_str(), "w", stderr) == NULL) {
perror("freopen stderr");
exit(RS_FAIL);
}

rlimit memlim{}, stalim{}, timlim{};
Expand Down
Loading