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

@@ -262,12 +262,43
262 CloseHandle(hProcess);
262 CloseHandle(hProcess);
263 if(actual_usage != NULL)
263 if(actual_usage != NULL)
264 (*actual_usage) = max_mem_usage;
264 (*actual_usage) = max_mem_usage;
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;
271 PROCESS_INFORMATION pi;
302 PROCESS_INFORMATION pi;
272 int ifsuccess = EXE_RESULT_OK;
303 int ifsuccess = EXE_RESULT_OK;
273
304
@@ -286,19 +317,25
286 NULL, // Use parent's environment block.
317 NULL, // Use parent's environment block.
287 NULL, // Use parent's starting directory.
318 NULL, // Use parent's starting directory.
288 &si, // Pointer to STARTUPINFO structure.
319 &si, // Pointer to STARTUPINFO structure.
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);
302 if(!check_memory_usage(pi.dwProcessId,max_mem,&actual_memory_usage)) {
339 if(!check_memory_usage(pi.dwProcessId,max_mem,&actual_memory_usage)) {
303 // using too much memory
340 // using too much memory
304 fprintf(stderr,"Memory limit exceeded.\n");
341 fprintf(stderr,"Memory limit exceeded.\n");
@@ -307,13 +344,13
307 }
344 }
308
345
309 if((ifsuccess == EXE_RESULT_MEMORY) ||
346 if((ifsuccess == EXE_RESULT_MEMORY) ||
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)
317 fprintf(stderr,"Time limit exceeded.\n");
354 fprintf(stderr,"Time limit exceeded.\n");
318 if(hProcess != NULL) {
355 if(hProcess != NULL) {
319 fprintf(stderr,"killing pid: %ld\n",pi.dwProcessId);
356 fprintf(stderr,"killing pid: %ld\n",pi.dwProcessId);
@@ -340,38 +377,52
340 wait_dialog();
377 wait_dialog();
341 }
378 }
342 }
379 }
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)
355 CloseHandle(si.hStdOutput);
406 CloseHandle(si.hStdOutput);
356
407
357 if(ifsuccess==EXE_RESULT_OK)
408 if(ifsuccess==EXE_RESULT_OK)
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 }
377
428
@@ -8,12 +8,13
8 #ifndef EXECUTE_H_INCLUDED
8 #ifndef EXECUTE_H_INCLUDED
9 #define EXECUTE_H_INCLUDED
9 #define EXECUTE_H_INCLUDED
10
10
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" {
17 #endif
18 #endif
18
19
19 int execute(char *exname, char *inname, char *outname, double t, int max_mem=0);
20 int execute(char *exname, char *inname, char *outname, double t, int max_mem=0);
@@ -6,13 +6,13
6 int a,b;
6 int a,b;
7 int r;
7 int r;
8 char *huge_array;
8 char *huge_array;
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
16 printf("%d\n",a+b);
16 printf("%d\n",a+b);
17
17
18 return 0;
18 return 0;
@@ -1,39 +1,56
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 {
12 int a,b;
35 int a,b;
13
36
14 int c=0;
37 int c=0;
15 int r;
38 int r;
16
39
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;
25 while(c<100000) {
46 while(c<100000) {
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);
37 exit(0);
54 exit(0);
38 }
55 }
39
56
You need to be logged in to leave comments. Login now