RunningStatus JudgerProcess::start(void){ value.it_value.tv_sec = int(TimeLimit); value.it_value.tv_usec = int(TimeLimit * 1000000) % 1000000 + 100000; value.it_interval = value.it_value; tReq.tv_sec = 0; tReq.tv_nsec = 5000000; RunningTime = 0; MemUsed = 0; TL = int(TimeLimit * 50.0); if (chdir(Dir.c_str()) < 0) return RunningStatus(); int pfd1[2], pfd2[2]; int p1 = pipe(pfd1); if (p1 == -1){ printf("Pipe Creation Failed\n"); if (errno == EMFILE) printf("Too many pipes open in CURRENT process\n"); else printf("Too many pipes open in operating system\n"); } int p2 = pipe(pfd2); if (p2 == -1){ printf("Pipe Creation Failed\n"); if (errno == EMFILE) printf("Too many pipes open in CURRENT process\n"); else printf("Too many pipes open in operating system\n"); } retAct.sa_flags = SA_NOCLDWAIT | SA_RESTART | SA_SIGINFO; sigemptyset(&retAct.sa_mask); retAct.sa_sigaction = sigHandler; sigaction(SIGCHLD, &retAct, NULL); ProcessID = fork(); if (ProcessID == 0){ if (MemoryLimit > 0){ struct rlimit rlp; rlp.rlim_cur = MemoryLimit << 10; rlp.rlim_max = MemoryLimit << 10; setrlimit(RLIMIT_AS, &rlp); } char c; close(pfd2[0]); if (write(pfd2[1], "c", 1) < 0) return RunningStatus(); close(pfd2[1]); close(pfd1[1]); if (read(pfd1[0], &c, 1) < 0) return RunningStatus(); close(pfd1[0]); execl(("./" + ExeName).c_str(), ExeName.c_str(), NULL); } else if (ProcessID < 0){ } else { RunningTime = 0; act.sa_handler = timeOut; sigemptyset(&act.sa_mask); act.sa_flags = SA_NOCLDWAIT | SA_RESTART; sigaction(SIGALRM, &act, NULL); char c; close(pfd2[1]); if (read(pfd2[0], &c, 1) < 0) return RunningStatus(); close(pfd2[0]); close(pfd1[0]); if (write(pfd1[1], "p", 1) < 0) return RunningStatus(); close(pfd1[1]); ftime(&tNow); setitimer(ITIMER_REAL, &value, NULL); MemUsed = max(MemUsed, getMemoryUse(ProcessID)); while (!kill(ProcessID, 0)){ RunningTime ++; MemUsed = max(MemUsed, getMemoryUse(ProcessID)); nanosleep(&tReq, &tRem); } } MemUsed = max(MemUsed, getMemoryUse(ProcessID)); act.sa_handler = SIG_IGN; sigemptyset(&act.sa_mask); act.sa_flags = SA_NOCLDWAIT | SA_RESTART; sigaction(SIGALRM, &act, NULL); act.sa_handler = SIG_IGN; sigemptyset(&act.sa_mask); act.sa_flags = SA_NOCLDWAIT | SA_RESTART; sigaction(SIGCHLD, &act, NULL); if (chdir("..") < 0) return RunningStatus(); RunningStatus ret; ret.ExitStatus = ExitStatus; ret.Time = max(0.0, difftime(tNew.time, tNow.time) * 1000.0 + tNew.millitm - tNow.millitm); ret.MemoryUsed = MemUsed; return ret; }
void SignatureGB::displayMemoryUse(std::ostream& out) const { // set up printer mic::ColumnPrinter pr; pr.addColumn(); pr.addColumn(false); pr.addColumn(false); std::ostream& name = pr[0]; std::ostream& value = pr[1]; std::ostream& extra = pr[2]; const size_t total = getMemoryUse(); { // Grobner basis const size_t basisMem = GB->getMemoryUse(); name << "Grobner basis:\n"; value << mic::ColumnPrinter::bytesInUnit(basisMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(basisMem, total) << '\n'; } { // Spairs const size_t sPairMem = SP->getMemoryUse(); name << "S-pairs:\n"; value << mic::ColumnPrinter::bytesInUnit(sPairMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(sPairMem, total) << '\n'; const size_t knownSyzygyMem = SP->getKnownSyzygyBitsMemoryUse(); name << " Known syzygy bits:\n"; value << mic::ColumnPrinter::bytesInUnit(knownSyzygyMem) << '\n'; extra << '\n'; } { // Syzygies const size_t syzMem = Hsyz->getMemoryUse(); name << "Minimal syzygies:\n"; value << mic::ColumnPrinter::bytesInUnit(syzMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(syzMem, total) << '\n'; } { // Koszul queue const size_t syzQueueMem = mKoszuls.getMemoryUse(); name << "Koszul queue:\n"; value << mic::ColumnPrinter::bytesInUnit(syzQueueMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(syzQueueMem, total) << '\n'; } { // Reducer const size_t reducerMem = reducer->getMemoryUse(); name << "Reducer:\n"; value << mic::ColumnPrinter::bytesInUnit(reducerMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(reducerMem, total) << '\n'; } { // Signatures const size_t sigMem = R->getMemoryUse(); name << "Signatures:\n"; value << mic::ColumnPrinter::bytesInUnit(sigMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(sigMem, total) << '\n'; } // total name << "-------------\n"; value << '\n'; extra << '\n'; name << "Memory used in total:\n"; value << mic::ColumnPrinter::bytesInUnit(total) << "\n"; extra << "\n"; out << "*** Summary of memory use ***\n" << pr << std::flush; }
int JudgerProcess::terminate(void){ if (!ProcessID) return 0; MemUsed = max(MemUsed, getMemoryUse(ProcessID)); if (!kill(ProcessID, SIGKILL)) kill(ProcessID, SIGKILL); return 0; }