Description:
reports running time, checks exit status; modified running time test case, memory test case.
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r114:e28e189186ff - - 4 files changed: 88 inserted, 19 deleted

@@ -265,6 +265,37
265 265 return (max_mem_usage <= max_mem);
266 266 }
267 267
268 + void report_stat(double time_used, int memory_used)
269 + {
270 + fprintf(stderr,"%.4lfr%.4lfu%.4lfs%dm\n",
271 + time_used,
272 + time_used, (double)0,
273 + memory_used);
274 + }
275 +
276 + double get_process_time_usage(HANDLE hProcess)
277 + {
278 + FILETIME creation_time;
279 + FILETIME exit_time;
280 + FILETIME kernel_time;
281 + FILETIME user_time;
282 + GetProcessTimes(hProcess,
283 + &creation_time,
284 + &exit_time,
285 + &kernel_time,
286 + &user_time);
287 +
288 + SYSTEMTIME sys_kernel_time;
289 + SYSTEMTIME sys_user_time;
290 + FileTimeToSystemTime(&kernel_time, &sys_kernel_time);
291 + FileTimeToSystemTime(&user_time, &sys_user_time);
292 +
293 + double time_used =
294 + ((sys_kernel_time.wSecond + sys_kernel_time.wMilliseconds/1000.0) +
295 + (sys_user_time.wSecond + sys_user_time.wMilliseconds/1000.0));
296 + return time_used;
297 + }
298 +
268 299 int execute(char *exname, char *inname, char *outname, double t, int max_mem)
269 300 {
270 301 STARTUPINFO si;
@@ -289,13 +320,19
289 320 &pi)) // Pointer to PROCESS_INFORMATION structure.
290 321 {
291 322 //printf( "CreateProcess failed (%d).\n", GetLastError() );
323 + fprintf(stderr, "Process creation error.\n");
324 + report_stat(0,0);
325 + return EXE_RESULT_ERROR;
292 326 }
293 327 //fprintf(stderr,"Process ID: %ld\n",pi.dwProcessId);
294 328 //fprintf(stderr,"time limit = %d\n",t);
295 329
296 330 // checking memory usage
297 331 // wait 0.1 sec before checking mem usage
298 -
332 +
333 + SetProcessWorkingSetSize(pi.hProcess,
334 + 1,
335 + max_mem);
299 336 int actual_memory_usage = 0;
300 337
301 338 Sleep(INITIAL_WAIT_FOR_MEM_CHECK);
@@ -310,7 +347,7
310 347 (WaitForSingleObject(pi.hProcess,
311 348 (int)(t*1000) + 1
312 349 - INITIAL_WAIT_FOR_MEM_CHECK)==WAIT_TIMEOUT)) {
313 - // need to kill...
350 + // Kill process, because (1) it used too much memory, or (2) time limit
314 351 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pi.dwProcessId);
315 352
316 353 if(ifsuccess != EXE_RESULT_MEMORY)
@@ -343,12 +380,26
343 380 if(ifsuccess != EXE_RESULT_MEMORY)
344 381 ifsuccess = EXE_RESULT_TIMEOUT;
345 382 }
383 +
384 + // check memory after terminated
346 385 if((ifsuccess==EXE_RESULT_OK) &&
347 386 (!check_memory_usage(pi.dwProcessId,max_mem, &actual_memory_usage))) {
348 387 // using too much memory
349 388 ifsuccess = EXE_RESULT_MEMORY;
350 389 }
390 +
391 + // check return code
392 + if(ifsuccess==EXE_RESULT_OK) {
393 + DWORD exitcode;
394 + GetExitCodeProcess(pi.hProcess, &exitcode);
395 + if(exitcode!=0) {
396 + fprintf(stderr,"Exit status %d.\n", (int)exitcode);
397 + ifsuccess = EXE_RESULT_ERROR;
398 + }
399 + }
400 +
351 401 wait_dialog();
402 +
352 403 if(si.hStdInput!=NULL)
353 404 CloseHandle(si.hStdInput);
354 405 if(si.hStdOutput!=NULL)
@@ -358,19 +409,19
358 409 fprintf(stderr,"OK\n");
359 410 else if(ifsuccess==EXE_RESULT_TIMEOUT)
360 411 fprintf(stderr,"Time limit exceeded.\n");
361 - else
412 + else if(ifsuccess==EXE_RESULT_MEMORY)
362 413 fprintf(stderr,"Memory limit exceeded.\n");
363 414
364 - double actual_time_usage;
415 + double actual_time_usage = get_process_time_usage(pi.hProcess);
416 + /*
365 417 if(ifsuccess==EXE_RESULT_TIMEOUT)
366 418 actual_time_usage = t+1;
367 419 else
368 420 actual_time_usage = t;
421 + */
369 422
370 - fprintf(stderr,"%.4lfr%.4lfu%.4lfs%dm\n",
371 - actual_time_usage,
372 - actual_time_usage, (double)0,
373 - (actual_memory_usage + 1023)/1024);
423 + report_stat(actual_time_usage,
424 + (actual_memory_usage + 1023)/1024);
374 425
375 426 return ifsuccess;
376 427 }
@@ -11,6 +11,7
11 11 #define EXE_RESULT_OK 0
12 12 #define EXE_RESULT_TIMEOUT 1
13 13 #define EXE_RESULT_MEMORY 2
14 + #define EXE_RESULT_ERROR 3
14 15
15 16 #ifdef __cplusplus
16 17 extern "C" {
@@ -9,7 +9,7
9 9
10 10 r = scanf("%d %d",&a,&b);
11 11
12 - huge_array = (char *)malloc(5000000);
12 + huge_array = (char *)malloc(5*1024*1024);
13 13 if(huge_array==NULL)
14 14 printf("NO!");
15 15 else
@@ -1,11 +1,34
1 1 #include <stdio.h>
2 2 #include <stdlib.h>
3 3 #include <unistd.h>
4 - #include <sys/time.h>
5 4 #include <time.h>
6 - #include <sys/resource.h>
5 + #include <windows.h>
6 +
7 + // run it for 0.5 s
7 8
8 - // run it for 1.5 s
9 + double get_running_time()
10 + {
11 + FILETIME creation_time;
12 + FILETIME exit_time;
13 + FILETIME kernel_time;
14 + FILETIME user_time;
15 + GetProcessTimes(GetCurrentProcess(),
16 + &creation_time,
17 + &exit_time,
18 + &kernel_time,
19 + &user_time);
20 +
21 + SYSTEMTIME sys_kernel_time;
22 + SYSTEMTIME sys_user_time;
23 +
24 + FileTimeToSystemTime(&kernel_time, &sys_kernel_time);
25 + FileTimeToSystemTime(&user_time, &sys_user_time);
26 +
27 + double time_used =
28 + ((sys_kernel_time.wSecond + sys_kernel_time.wMilliseconds/1000.0) +
29 + (sys_user_time.wSecond + sys_user_time.wMilliseconds/1000.0));
30 + return time_used;
31 + }
9 32
10 33 int main()
11 34 {
@@ -17,8 +40,6
17 40 r = scanf("%d %d",&a,&b);
18 41 printf("%d\n",a+b);
19 42
20 - struct rusage ru;
21 -
22 43 while(1) {
23 44 c++;
24 45 b+=c;
@@ -26,11 +47,7
26 47 c++;
27 48 b+=c;
28 49 }
29 - getrusage(RUSAGE_SELF,&ru);
30 - double rtime = ru.ru_utime.tv_sec + ru.ru_stime.tv_sec;
31 - rtime += (double)ru.ru_utime.tv_usec / 1000000.0;
32 - rtime += (double)ru.ru_stime.tv_usec / 1000000.0;
33 - if(rtime > 0.5)
50 + if(get_running_time() > 0.5)
34 51 break;
35 52 }
36 53 printf("%d\n",b);
You need to be logged in to leave comments. Login now