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 return (max_mem_usage <= max_mem);
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 int execute(char *exname, char *inname, char *outname, double t, int max_mem)
299 int execute(char *exname, char *inname, char *outname, double t, int max_mem)
269 {
300 {
270 STARTUPINFO si;
301 STARTUPINFO si;
@@ -289,13 +320,19
289 &pi)) // Pointer to PROCESS_INFORMATION structure.
320 &pi)) // Pointer to PROCESS_INFORMATION structure.
290 {
321 {
291 //printf( "CreateProcess failed (%d).\n", GetLastError() );
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 //fprintf(stderr,"Process ID: %ld\n",pi.dwProcessId);
327 //fprintf(stderr,"Process ID: %ld\n",pi.dwProcessId);
294 //fprintf(stderr,"time limit = %d\n",t);
328 //fprintf(stderr,"time limit = %d\n",t);
295
329
296 // checking memory usage
330 // checking memory usage
297 // wait 0.1 sec before checking mem usage
331 // wait 0.1 sec before checking mem usage
298 -
332 +
333 + SetProcessWorkingSetSize(pi.hProcess,
334 + 1,
335 + max_mem);
299 int actual_memory_usage = 0;
336 int actual_memory_usage = 0;
300
337
301 Sleep(INITIAL_WAIT_FOR_MEM_CHECK);
338 Sleep(INITIAL_WAIT_FOR_MEM_CHECK);
@@ -310,7 +347,7
310 (WaitForSingleObject(pi.hProcess,
347 (WaitForSingleObject(pi.hProcess,
311 (int)(t*1000) + 1
348 (int)(t*1000) + 1
312 - INITIAL_WAIT_FOR_MEM_CHECK)==WAIT_TIMEOUT)) {
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 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pi.dwProcessId);
351 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pi.dwProcessId);
315
352
316 if(ifsuccess != EXE_RESULT_MEMORY)
353 if(ifsuccess != EXE_RESULT_MEMORY)
@@ -343,12 +380,26
343 if(ifsuccess != EXE_RESULT_MEMORY)
380 if(ifsuccess != EXE_RESULT_MEMORY)
344 ifsuccess = EXE_RESULT_TIMEOUT;
381 ifsuccess = EXE_RESULT_TIMEOUT;
345 }
382 }
383 +
384 + // check memory after terminated
346 if((ifsuccess==EXE_RESULT_OK) &&
385 if((ifsuccess==EXE_RESULT_OK) &&
347 (!check_memory_usage(pi.dwProcessId,max_mem, &actual_memory_usage))) {
386 (!check_memory_usage(pi.dwProcessId,max_mem, &actual_memory_usage))) {
348 // using too much memory
387 // using too much memory
349 ifsuccess = EXE_RESULT_MEMORY;
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 wait_dialog();
401 wait_dialog();
402 +
352 if(si.hStdInput!=NULL)
403 if(si.hStdInput!=NULL)
353 CloseHandle(si.hStdInput);
404 CloseHandle(si.hStdInput);
354 if(si.hStdOutput!=NULL)
405 if(si.hStdOutput!=NULL)
@@ -358,19 +409,19
358 fprintf(stderr,"OK\n");
409 fprintf(stderr,"OK\n");
359 else if(ifsuccess==EXE_RESULT_TIMEOUT)
410 else if(ifsuccess==EXE_RESULT_TIMEOUT)
360 fprintf(stderr,"Time limit exceeded.\n");
411 fprintf(stderr,"Time limit exceeded.\n");
361 - else
412 + else if(ifsuccess==EXE_RESULT_MEMORY)
362 fprintf(stderr,"Memory limit exceeded.\n");
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 if(ifsuccess==EXE_RESULT_TIMEOUT)
417 if(ifsuccess==EXE_RESULT_TIMEOUT)
366 actual_time_usage = t+1;
418 actual_time_usage = t+1;
367 else
419 else
368 actual_time_usage = t;
420 actual_time_usage = t;
421 + */
369
422
370 - fprintf(stderr,"%.4lfr%.4lfu%.4lfs%dm\n",
423 + report_stat(actual_time_usage,
371 - actual_time_usage,
424 + (actual_memory_usage + 1023)/1024);
372 - actual_time_usage, (double)0,
373 - (actual_memory_usage + 1023)/1024);
374
425
375 return ifsuccess;
426 return ifsuccess;
376 }
427 }
@@ -11,6 +11,7
11 #define EXE_RESULT_OK 0
11 #define EXE_RESULT_OK 0
12 #define EXE_RESULT_TIMEOUT 1
12 #define EXE_RESULT_TIMEOUT 1
13 #define EXE_RESULT_MEMORY 2
13 #define EXE_RESULT_MEMORY 2
14 + #define EXE_RESULT_ERROR 3
14
15
15 #ifdef __cplusplus
16 #ifdef __cplusplus
16 extern "C" {
17 extern "C" {
@@ -9,7 +9,7
9
9
10 r = scanf("%d %d",&a,&b);
10 r = scanf("%d %d",&a,&b);
11
11
12 - huge_array = (char *)malloc(5000000);
12 + huge_array = (char *)malloc(5*1024*1024);
13 if(huge_array==NULL)
13 if(huge_array==NULL)
14 printf("NO!");
14 printf("NO!");
15 else
15 else
@@ -1,11 +1,34
1 #include <stdio.h>
1 #include <stdio.h>
2 #include <stdlib.h>
2 #include <stdlib.h>
3 #include <unistd.h>
3 #include <unistd.h>
4 - #include <sys/time.h>
5 #include <time.h>
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 int main()
33 int main()
11 {
34 {
@@ -17,8 +40,6
17 r = scanf("%d %d",&a,&b);
40 r = scanf("%d %d",&a,&b);
18 printf("%d\n",a+b);
41 printf("%d\n",a+b);
19
42
20 - struct rusage ru;
21 -
22 while(1) {
43 while(1) {
23 c++;
44 c++;
24 b+=c;
45 b+=c;
@@ -26,11 +47,7
26 c++;
47 c++;
27 b+=c;
48 b+=c;
28 }
49 }
29 - getrusage(RUSAGE_SELF,&ru);
50 + if(get_running_time() > 0.5)
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)
34 break;
51 break;
35 }
52 }
36 printf("%d\n",b);
53 printf("%d\n",b);
You need to be logged in to leave comments. Login now