Description:
fix java compiler and runner box does not stop on time because we let box run the script, not the java itself
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r158:19e4c7e30be4 - - 2 files changed: 12 inserted, 4 deleted

@@ -71,93 +71,95
71 FileUtils.rm(params[:output_file])
71 FileUtils.rm(params[:output_file])
72 end
72 end
73 if FileTest.exists? params[:message_file]
73 if FileTest.exists? params[:message_file]
74 FileUtils.rm(params[:message_file])
74 FileUtils.rm(params[:message_file])
75 end
75 end
76
76
77 # Check if the source file exists before attempt compiling.
77 # Check if the source file exists before attempt compiling.
78 if !FileTest.exists? params[:source_file]
78 if !FileTest.exists? params[:source_file]
79 talk("ERROR: The source file does not exist!")
79 talk("ERROR: The source file does not exist!")
80 open(params[:message_file],"w") do |f|
80 open(params[:message_file],"w") do |f|
81 f.puts "ERROR: The source file did not exist."
81 f.puts "ERROR: The source file did not exist."
82 end
82 end
83 exit(127)
83 exit(127)
84 end
84 end
85
85
86 if params[:prog_lang]=='cpp'
86 if params[:prog_lang]=='cpp'
87 params[:prog_lang] = 'c++'
87 params[:prog_lang] = 'c++'
88 end
88 end
89
89
90 # Compile.
90 # Compile.
91 case params[:prog_lang]
91 case params[:prog_lang]
92
92
93 when "c"
93 when "c"
94 command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
94 command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
95 system(command)
95 system(command)
96
96
97 when "c++"
97 when "c++"
98 command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
98 command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
99 system(command)
99 system(command)
100
100
101 when "pas"
101 when "pas"
102 command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
102 command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
103 system(command)
103 system(command)
104 FileUtils.mv("output", params[:output_file])
104 FileUtils.mv("output", params[:output_file])
105
105
106 when "java"
106 when "java"
107 #rename the file to the public class name
107 #rename the file to the public class name
108
108
109 #get the class name
109 #get the class name
110 classname = 'DUMMY'
110 classname = 'DUMMY'
111 File.foreach(params[:source_file]) do |line|
111 File.foreach(params[:source_file]) do |line|
112 md = /\s*public\s*class\s*(\w*)/.match(line)
112 md = /\s*public\s*class\s*(\w*)/.match(line)
113 classname=md[1] if md
113 classname=md[1] if md
114 end
114 end
115 system("cp #{params[:source_file]} #{classname}.java")
115 system("cp #{params[:source_file]} #{classname}.java")
116 command = "#{JAVA_COMPILER} #{classname}.java 2> #{params[:message_file]}"
116 command = "#{JAVA_COMPILER} #{classname}.java 2> #{params[:message_file]}"
117 system(command)
117 system(command)
118 if File.exists?(classname + ".class")
118 if File.exists?(classname + ".class")
119 - File.open(params[:output_file],"w") {|file| file.write("#!/bin/sh\n/usr/bin/java #{classname}\n")}
119 + File.open(params[:output_file],"w") {|file| file.write("#{classname}")}
120 - File.chmod(0755, params[:output_file])
120 + end
121 + if classname == 'DUMMY'
122 + File.open(params[:message_file],"w") {|file| file.write("Cannot find any public class in the source code\n")}
121 end
123 end
122
124
123 when "ruby"
125 when "ruby"
124 command = "#{RUBY_INTERPRETER} -c #{params[:source_file]} 2> #{params[:message_file]}"
126 command = "#{RUBY_INTERPRETER} -c #{params[:source_file]} 2> #{params[:message_file]}"
125 if system(command)
127 if system(command)
126 File.open(params[:output_file],"w") do |out_file|
128 File.open(params[:output_file],"w") do |out_file|
127 out_file.puts "#!#{RUBY_INTERPRETER}"
129 out_file.puts "#!#{RUBY_INTERPRETER}"
128 File.open(params[:source_file],"r").each do |line|
130 File.open(params[:source_file],"r").each do |line|
129 out_file.print line
131 out_file.print line
130 end
132 end
131 end
133 end
132 File.chmod(0755, params[:output_file])
134 File.chmod(0755, params[:output_file])
133 end
135 end
134
136
135 when "python"
137 when "python"
136 command = "#{PYTHON_CHECKER} #{params[:source_file]} > #{params[:message_file]}"
138 command = "#{PYTHON_CHECKER} #{params[:source_file]} > #{params[:message_file]}"
137 if system(command)
139 if system(command)
138 #compile to python bytecode
140 #compile to python bytecode
139 command = "#{PYTHON_INTERPRETER} -m py_compile #{params[:source_file]}"
141 command = "#{PYTHON_INTERPRETER} -m py_compile #{params[:source_file]}"
140 puts "compile: #{command}"
142 puts "compile: #{command}"
141 system(command)
143 system(command)
142 puts "pwd: " + Dir.pwd
144 puts "pwd: " + Dir.pwd
143 Dir.new('.').each {|file| puts file}
145 Dir.new('.').each {|file| puts file}
144 File.open(params[:output_file],"w") do |out_file|
146 File.open(params[:output_file],"w") do |out_file|
145 out_file.puts "#!#{PYTHON_INTERPRETER} #{params[:source_file]}c"
147 out_file.puts "#!#{PYTHON_INTERPRETER} #{params[:source_file]}c"
146 end
148 end
147 File.chmod(0755, params[:output_file])
149 File.chmod(0755, params[:output_file])
148 end
150 end
149
151
150 else
152 else
151 talk("ERROR: Invalid language specified!")
153 talk("ERROR: Invalid language specified!")
152 open(params[:message_file],"w") do |f|
154 open(params[:message_file],"w") do |f|
153 f.puts "ERROR: Invalid language specified!"
155 f.puts "ERROR: Invalid language specified!"
154 end
156 end
155 exit(127)
157 exit(127)
156 end
158 end
157
159
158 # Report success or failure.
160 # Report success or failure.
159 if FileTest.exists? params[:output_file]
161 if FileTest.exists? params[:output_file]
160 talk "Compilation was successful!"
162 talk "Compilation was successful!"
161 else
163 else
162 talk "ERROR: Something was wrong during the compilation!"
164 talk "ERROR: Something was wrong during the compilation!"
163 end
165 end
@@ -46,98 +46,104
46 require "#{problem_home}/script/test_dsl.rb"
46 require "#{problem_home}/script/test_dsl.rb"
47 load "#{problem_home}/test_cases/all_tests.cfg"
47 load "#{problem_home}/test_cases/all_tests.cfg"
48 problem = Problem.get_instance
48 problem = Problem.get_instance
49
49
50 if problem.well_formed? == false
50 if problem.well_formed? == false
51 log "The problem specification is not well formed."
51 log "The problem specification is not well formed."
52 exit(127)
52 exit(127)
53 end
53 end
54
54
55 # Check if the test number is okay.
55 # Check if the test number is okay.
56 if test_num <= 0 || test_num > problem.num_tests
56 if test_num <= 0 || test_num > problem.num_tests
57 log "You have specified a wrong test number."
57 log "You have specified a wrong test number."
58 exit(127)
58 exit(127)
59 end
59 end
60
60
61 #####################################
61 #####################################
62 # Set the relavant file names here. #
62 # Set the relavant file names here. #
63 #####################################
63 #####################################
64
64
65 input_file_name = "#{problem_home}/test_cases/#{test_num}/input-#{test_num}.txt"
65 input_file_name = "#{problem_home}/test_cases/#{test_num}/input-#{test_num}.txt"
66
66
67 #####################################
67 #####################################
68
68
69 time_limit = problem.get_time_limit test_num
69 time_limit = problem.get_time_limit test_num
70 mem_limit = problem.get_mem_limit(test_num) * 1024
70 mem_limit = problem.get_mem_limit(test_num) * 1024
71
71
72 # Copy the input file.
72 # Copy the input file.
73 #`cp #{problem_home}/test_cases/#{test_num}/#{input_file_name} .`
73 #`cp #{problem_home}/test_cases/#{test_num}/#{input_file_name} .`
74
74
75 # check if box is there, if not, compile it!
75 # check if box is there, if not, compile it!
76 if !File.exists?("#{problem_home}/script/box")
76 if !File.exists?("#{problem_home}/script/box")
77 log "WARNING: Compiling box: to increase efficiency, it should be compile manually"
77 log "WARNING: Compiling box: to increase efficiency, it should be compile manually"
78 compile_box("#{problem_home}/script/box.cc",
78 compile_box("#{problem_home}/script/box.cc",
79 "#{problem_home}/script/box")
79 "#{problem_home}/script/box")
80 end
80 end
81
81
82 # Hide PROBLEM_HOME
82 # Hide PROBLEM_HOME
83 ENV['PROBLEM_HOME'] = nil
83 ENV['PROBLEM_HOME'] = nil
84
84
85 # Run the program.
85 # Run the program.
86 #run_command = "/usr/bin/time -f \"#{time_output_format}\" 2>run_result #{problem_home}/script/box_new -a 2 -f -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name}"
86 #run_command = "/usr/bin/time -f \"#{time_output_format}\" 2>run_result #{problem_home}/script/box_new -a 2 -f -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name}"
87 #
87 #
88
88
89
89
90
90
91
91
92 case language
92 case language
93 when "java"
93 when "java"
94 - # for java, we have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
94 +
95 - run_command = "#{problem_home}/script/box -T -t #{time_limit} -s getppid -s clone -s wait4 -p /usr/bin/ -p ./ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
95 + # for java, extract the classname
96 + # wne have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
97 + classname = 'DUMMY'
98 + File.open(program_name,"r").each do |line|
99 + classname = line
100 + end
101 + run_command = "#{problem_home}/script/box -T -t #{time_limit} -s getppid -s clone -s wait4 -p /usr/bin/ -p ./ -i #{input_file_name} -o output.txt /usr/bin/java #{classname} 2>run_result"
96 when "ruby"
102 when "ruby"
97 run_command = "#{problem_home}/script/box -T -t #{time_limit} -s getppid -s wait4 -s clone -s set_robust_list -s futex -s sigaltstack -p /dev/urandom -p ./ -p /home/dae/.rvm/rubies/ruby-1.9.2-p320/ -p #{problem_home}/ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
103 run_command = "#{problem_home}/script/box -T -t #{time_limit} -s getppid -s wait4 -s clone -s set_robust_list -s futex -s sigaltstack -p /dev/urandom -p ./ -p /home/dae/.rvm/rubies/ruby-1.9.2-p320/ -p #{problem_home}/ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
98 when "python"
104 when "python"
99 #this code just run without any checking
105 #this code just run without any checking
100 run_command = "#{problem_home}/script/box -T -t #{time_limit} -p #{problem_home}/ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
106 run_command = "#{problem_home}/script/box -T -t #{time_limit} -p #{problem_home}/ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
101 else # for c++, pascal, we do the normal checking
107 else # for c++, pascal, we do the normal checking
102 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
108 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
103 end
109 end
104
110
105
111
106 log "Running test #{test_num}..."
112 log "Running test #{test_num}..."
107 log run_command
113 log run_command
108 log
114 log
109 system(run_command)
115 system(run_command)
110
116
111 # Restore PROBLEM_HOME
117 # Restore PROBLEM_HOME
112 ENV['PROBLEM_HOME'] = problem_home
118 ENV['PROBLEM_HOME'] = problem_home
113
119
114 # Create the result file.
120 # Create the result file.
115 result_file = File.new("result", "w")
121 result_file = File.new("result", "w")
116 comment_file = File.new("comment", "w")
122 comment_file = File.new("comment", "w")
117
123
118 # Check if the program actually produced any output.
124 # Check if the program actually produced any output.
119 run_result_file = File.new("run_result", "r")
125 run_result_file = File.new("run_result", "r")
120 run_result = run_result_file.readlines
126 run_result = run_result_file.readlines
121 run_result_file.close
127 run_result_file.close
122
128
123 run_stat = run_result[run_result.length-1]
129 run_stat = run_result[run_result.length-1]
124 running_time = extract_time(run_stat)
130 running_time = extract_time(run_stat)
125
131
126 report = lambda{ |status, points, comment|
132 report = lambda{ |status, points, comment|
127 result_file.write status.strip
133 result_file.write status.strip
128 result_file.write "\n"
134 result_file.write "\n"
129 result_file.write points.to_s.strip
135 result_file.write points.to_s.strip
130 result_file.write "\n"
136 result_file.write "\n"
131 result_file.write run_stat.strip
137 result_file.write run_stat.strip
132 result_file.write "\n"
138 result_file.write "\n"
133 result_file.close
139 result_file.close
134 FileUtils.rm "run_result"
140 FileUtils.rm "run_result"
135 # `rm output.txt` --- keep the output
141 # `rm output.txt` --- keep the output
136
142
137 comment_file.write comment
143 comment_file.write comment
138
144
139 # added for debuggin --- jittat
145 # added for debuggin --- jittat
140 comment_file.write "--run-result--\n"
146 comment_file.write "--run-result--\n"
141 run_result.each do |l|
147 run_result.each do |l|
142 comment_file.write l
148 comment_file.write l
143 end
149 end
You need to be logged in to leave comments. Login now