Description:
[grader] box.cc now reports running status when die
git-svn-id: http://theory.cpe.ku.ac.th/grader/judge/trunk/scripts@172 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
r46:31f3935d33aa - - 2 files changed: 45 inserted, 31 deleted
@@ -51,35 +51,63 | |||
|
51 | 51 | #else |
|
52 | 52 | /* Touching clandestine places in glibc */ |
|
53 | 53 | extern loff_t llseek(int fd, loff_t pos, int whence); |
|
54 | 54 | #define long_seek(f,o,w) llseek(f,o,w) |
|
55 | 55 | #endif |
|
56 | 56 | |
|
57 | + int max_mem_used = 0; | |
|
58 | + | |
|
59 | + void print_running_stat(double wall_time, | |
|
60 | + double user_time, | |
|
61 | + double system_time, | |
|
62 | + int mem_usage) | |
|
63 | + { | |
|
64 | + fprintf(stderr,"%.4lfr%.4lfu%.4lfs%dm\n", | |
|
65 | + wall_time, user_time, system_time, mem_usage); | |
|
66 | + } | |
|
67 | + | |
|
57 | 68 | static void NONRET |
|
58 | 69 | box_exit(void) |
|
59 | 70 | { |
|
60 | - if (box_pid > 0) | |
|
61 | - { | |
|
71 | + if (box_pid > 0) { | |
|
62 | 72 |
|
|
63 | 73 |
|
|
64 | 74 |
|
|
65 | 75 |
|
|
66 | 76 |
|
|
67 | - exit(1); | |
|
68 | - } | |
|
77 | + | |
|
78 | + struct timeval total; | |
|
79 | + int wall; | |
|
80 | + struct rusage rus; | |
|
81 | + int stat; | |
|
82 | + pid_t p; | |
|
69 | 83 | |
|
70 | - static void | |
|
71 | - box_kill(void) | |
|
72 | - { | |
|
73 | - if (box_pid > 0) | |
|
74 | - { | |
|
75 | - if (is_ptraced) | |
|
76 | - ptrace(PTRACE_KILL, box_pid); | |
|
77 | - kill(-box_pid, SIGKILL); | |
|
78 | - kill(box_pid, SIGKILL); | |
|
84 | + // wait so that we can get information | |
|
85 | + p = wait4(box_pid, &stat, WUNTRACED, &rus); | |
|
86 | + if (p < 0) { | |
|
87 | + fprintf(stderr,"wait4: error\n"); | |
|
88 | + print_running_stat(0,0,0,max_mem_used); | |
|
89 | + } else if (p != box_pid) { | |
|
90 | + fprintf(stderr,"wait4: unknown pid %d exited!\n", p); | |
|
91 | + print_running_stat(0,0,0,max_mem_used); | |
|
92 | + } else { | |
|
93 | + if (!WIFEXITED(stat)) | |
|
94 | + fprintf(stderr,"wait4: unknown status\n"); | |
|
95 | + struct timeval total; | |
|
96 | + int wall; | |
|
97 | + wall = time(NULL) - start_time; | |
|
98 | + timeradd(&rus.ru_utime, &rus.ru_stime, &total); | |
|
99 | + | |
|
100 | + print_running_stat((double)wall, | |
|
101 | + (double) rus.ru_utime.tv_sec + | |
|
102 | + ((double) rus.ru_utime.tv_usec/1000000.0), | |
|
103 | + (double) rus.ru_stime.tv_sec + | |
|
104 | + ((double) rus.ru_stime.tv_usec/1000000.0), | |
|
105 | + max_mem_used); | |
|
79 | 106 |
|
|
107 | + exit(1); | |
|
80 | 108 | } |
|
81 | 109 | |
|
82 | 110 | static void NONRET __attribute__((format(printf,1,2))) |
|
83 | 111 | die(char *msg, ...) |
|
84 | 112 | { |
|
85 | 113 | va_list args; |
@@ -87,22 +115,12 | |||
|
87 | 115 | vfprintf(stderr, msg, args); |
|
88 | 116 | fputc('\n', stderr); |
|
89 | 117 | box_exit(); |
|
90 | 118 | } |
|
91 | 119 | |
|
92 | 120 |
static void |
|
93 | - die_report(char *msg, ...) | |
|
94 | - { | |
|
95 | - va_list args; | |
|
96 | - va_start(args, msg); | |
|
97 | - vfprintf(stderr, msg, args); | |
|
98 | - fputc('\n', stderr); | |
|
99 | - box_kill(); | |
|
100 | - } | |
|
101 | - | |
|
102 | - static void __attribute__((format(printf,1,2))) | |
|
103 | 121 | log(char *msg, ...) |
|
104 | 122 | { |
|
105 | 123 | va_list args; |
|
106 | 124 | va_start(args, msg); |
|
107 | 125 | if (verbose) |
|
108 | 126 | { |
@@ -346,18 +364,16 | |||
|
346 | 364 | //printf("%s - %d\n",x,ticks_per_sec); |
|
347 | 365 | sec = (utime + stime + ticks_per_sec-1)/ticks_per_sec; |
|
348 | 366 | } |
|
349 | 367 | if (verbose > 1) |
|
350 | 368 | fprintf(stderr, "[timecheck: %d seconds]\n", sec); |
|
351 | 369 | if (sec > timeout) { |
|
352 |
- die |
|
|
370 | + die("Time limit exceeded."); | |
|
353 | 371 | } |
|
354 | 372 | } |
|
355 | 373 | |
|
356 | - int max_mem_used = 0; | |
|
357 | - | |
|
358 | 374 | static void |
|
359 | 375 | check_memory_usage() |
|
360 | 376 | { |
|
361 | 377 | char proc_fname[100]; |
|
362 | 378 | sprintf(proc_fname,"/proc/%d/statm",box_pid); |
|
363 | 379 | //printf("proc fname: %s\n",proc_fname); |
@@ -449,14 +465,13 | |||
|
449 | 465 | else if ((use_wall_clock ? wall : total.tv_sec) > timeout) |
|
450 | 466 | fprintf(stderr,"Time limit exceeded.\n"); |
|
451 | 467 | else |
|
452 | 468 | // report OK and statistics |
|
453 | 469 | fprintf(stderr,"OK\n"); |
|
454 | 470 | |
|
455 | - fprintf(stderr,"%dr%.4lfu%.4lfs%dm\n", | |
|
456 | - wall, | |
|
471 | + print_running_stat((double) wall, | |
|
457 | 472 | (double) rus.ru_utime.tv_sec + |
|
458 | 473 | ((double) rus.ru_utime.tv_usec/1000000.0), |
|
459 | 474 | (double) rus.ru_stime.tv_sec + |
|
460 | 475 | ((double) rus.ru_stime.tv_usec/1000000.0), |
|
461 | 476 | max_mem_used); |
|
462 | 477 | /* |
@@ -475,14 +490,13 | |||
|
475 | 490 | fprintf(stderr,"Caught fatal signal %d.\n", WTERMSIG(stat)); |
|
476 | 491 | |
|
477 | 492 | struct timeval total; |
|
478 | 493 | int wall; |
|
479 | 494 | wall = time(NULL) - start_time; |
|
480 | 495 | timeradd(&rus.ru_utime, &rus.ru_stime, &total); |
|
481 | - fprintf(stderr,"%dr%.4lfu%.4lfs%dm\n", | |
|
482 | - wall, | |
|
496 | + print_running_stat((double) wall, | |
|
483 | 497 | (double) rus.ru_utime.tv_sec + |
|
484 | 498 | ((double) rus.ru_utime.tv_usec/1000000.0), |
|
485 | 499 | (double) rus.ru_stime.tv_sec + |
|
486 | 500 | ((double) rus.ru_stime.tv_usec/1000000.0), |
|
487 | 501 | max_mem_used); |
|
488 | 502 | exit(0); |
@@ -238,13 +238,13 | |||
|
238 | 238 | :on => problem, |
|
239 | 239 | :with => 'in1.txt', |
|
240 | 240 | :and_report => { |
|
241 | 241 | :graded_at= => nil, |
|
242 | 242 | :compiler_message= => '', |
|
243 | 243 | :grader_comment= => '', |
|
244 | - :running_stat= => /[Ee]xit.*status.*10.*0\.0 sec/m, | |
|
244 | + :running_stat= => /[Ee]xit.*status.*10.*0\.0\d* sec/m, | |
|
245 | 245 | :output_file_name= => lambda { |fname| |
|
246 | 246 | File.exists?(fname).should be_true |
|
247 | 247 | }, |
|
248 | 248 | :running_time= => nil, |
|
249 | 249 | :exit_status= => /10/, |
|
250 | 250 | :memory_usage= => nil, |
You need to be logged in to leave comments.
Login now