/** * Start virtual judger */ void VirtualJudger::run() { log("Judger started"); initHandShake(); while (true) { socket->receiveFile(tmpfilename); Bott * bott = new Bott(tmpfilename); log((string) "Received a new task, problem: " + bott->Getvid() + "."); string result_filename = Bott::RESULTS_DIRECTORY + intToString(bott->Getrunid()); if (bott->Gettype() == NEED_JUDGE) { // Currently for vjudge, only NEED_JUDGE is supported try { if (bott->Getsrc().length() < MIN_SOURCE_LENGTH) { // source code too short, may cause problem in remote OJ, such as PKU bott->Setout_filename(result_filename); generateSpecialResult(bott, "Compile Error"); bott->Setce_info("Source code too short, minimum length: " + intToString(MIN_SOURCE_LENGTH)); bott->save(); } else { judge(bott, result_filename); } } catch (Exception & e) { // Exception occurs, set to Judge Error log((string) "Judge error! Reason: " + e.what()); // reuse bott file bott->Setout_filename(result_filename); generateSpecialResult(bott, "Judge Error"); bott->save(); } catch (exception & e) { // Exception occurs, set to Judge Error log((string) "Judge error! Reason: " + e.what()); // reuse bott file bott->Setout_filename(result_filename); generateSpecialResult(bott, "Judge Error"); bott->save(); } delete bott; } else { delete bott; throw Exception("Type not supported."); } socket->sendFile(result_filename); } }