Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
int JudgerProcess::terminate(void){
	if (!ProcessID) return 0;
	MemUsed = max(MemUsed, getMemoryUse(ProcessID));
	if (!kill(ProcessID, SIGKILL)) kill(ProcessID, SIGKILL);
	return 0;
}