our (%result);
our ($action);
-parse_cmd_line ();
-
-# Default set of tests.
-@TESTS = ("alarm-single", "alarm-multiple", "alarm-zero", "alarm-negative",
- "join-simple",
- "join-quick", "join-multiple", "join-nested",
- "join-dummy", "join-invalid", "join-no",
- "priority-preempt", "priority-fifo", "priority-donate-one",
- "priority-donate-multiple", "priority-donate-nest",
- "mlfqs-on", "mlfqs-off")
- unless @TESTS > 0;
+parse_cmd_line qw (alarm-single alarm-multiple alarm-zero alarm-negative
+ join-simple
+ join-quick join-multiple join-nested
+ join-dummy join-invalid join-no
+ priority-preempt priority-fifo priority-donate-one
+ priority-donate-multiple priority-donate-nest
+ mlfqs-on mlfqs-off);
clean_dir (), exit if $action eq 'clean';
build ();
exit if $action eq 'build';
-run_and_grade_tests ();
-grade_mlfqs_speedup ();
-grade_mlfqs_priority ();
+run_and_grade_tests ();
+if (defined ($result{'mlfqs-on'}) && defined ($result{'mlfqs-off'})) {
+ grade_mlfqs_speedup ();
+ grade_mlfqs_priority ();
+}
write_grades ();
write_details ();
-exit if $action eq 'test';
+exit success () if $action eq 'test';
assemble_final_grade ();
-exit if $action eq 'assemble';
+exit success () if $action eq 'assemble';
die "Don't know how to '$action'";
sub run_test {
# Change constants.h if necessary.
my ($defines) = $test ne 'mlfqs-on' ? "" : "#define MLFQS 1\n";
+ $defines .= "#define THREAD_JOIN_IMPLEMENTED 1\n";
if ($defines ne snarf ("pintos/src/constants.h")) {
open (CONSTANTS, ">pintos/src/constants.h");
print CONSTANTS $defines;
# Changes devices/timer.c if necessary.
my ($new_time_slice) = $test eq 'priority-fifo' ? 100 : 1;
- my (@timer) = snarf ("pintos/src/devices/timer.c");
- if (!grep (/^\#define TIME_SLICE $new_time_slice$/, @timer)) {
- @timer = grep (!/^\#define TIME_SLICE/, @timer);
- unshift (@timer, "#define TIME_SLICE $new_time_slice");
- open (TIMER, ">pintos/src/devices/timer.c");
- print TIMER map ("$_\n", @timer);
- close (TIMER);
+ my (@timer_c) = snarf ("pintos/src/devices/timer.c");
+ if (!grep (/^\#define TIME_SLICE $new_time_slice$/, @timer_c)) {
+ @timer_c = grep (!/^\#define TIME_SLICE/, @timer_c);
+ unshift (@timer_c, "#define TIME_SLICE $new_time_slice");
+ open (TIMER_C, ">pintos/src/devices/timer.c");
+ print TIMER_C map ("$_\n", @timer_c);
+ close (TIMER_C);
+ }
+
+ # Changes devices/timer.h if necessary.
+ my ($new_timer_freq) = $test eq 'priority-fifo' ? 19 : 100;
+ my (@timer_h) = snarf ("pintos/src/devices/timer.h");
+ if (!grep (/^\#define TIMER_FREQ $new_time_slice$/, @timer_h)) {
+ @timer_h = grep (!/^\#define TIMER_FREQ/, @timer_h);
+ unshift (@timer_h, "#define TIMER_FREQ $new_timer_freq");
+ open (TIMER_H, ">pintos/src/devices/timer.h");
+ print TIMER_H map ("$_\n", @timer_h);
+ close (TIMER_H);
}
# Copy in the new test.c and delete enough files to ensure a full rebuild.
xsystem ("cp pintos/src/threads/build/os.dsk output/$test");
# Run.
- my ($timeout) = $test !~ /^mlfqs/ ? 10 : 600;
- return run_pintos ("cd pintos/src/threads/build && pintos -v run -q",
+ my ($timeout) = $test !~ /^mlfqs/ ? 15 : 600;
+ return run_pintos (["-v", "run", "-q"],
+ CHDIR => "pintos/src/threads/build",
LOG => "$test/run",
TIMEOUT => $timeout);
}
local ($_);
foreach (@output) {
- die $_ if /Out of order/;
+ die $_ if /out of order/i;
my ($p) = /product=(\d+)$/;
next if !defined $p;