⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 checktrace.pl

📁 ICS 课程的Lab7
💻 PL
字号:
#!/usr/bin/perluse Getopt::Std;######################################################################## checktrace - trace file consistency checker and balancer.  ## Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved.# May not be used, modified, or copied without permission.## This script reads a Malloc Lab trace file, checks it for consistency,# and outputs a balanced version by appending any necessary free requests.######################################################################## $| = 1; # autoflush output on every print statement## void usage(void) - print help message and terminate#sub usage {    printf STDERR "$_[0]\n";    printf STDERR "Usage: $0 [-hs]\n";    printf STDERR "Options:\n";    printf STDERR "  -h          Print this message\n";    printf STDERR "  -s          Emit only a brief summary\n";    die "\n" ;}############### Main routine############### # Parse and check the command line arguments#getopts('hs');if ($opt_h) {    usage("");}$summary = $opt_s;# # HASH keeps a running tally of outstanding alloc/realloc # requests. When a free request is encountered, the corresponding # hash entry is deleted. When we are finished reading the trace,# what is left are the unmatched alloc/realloc requests.#%HASH = (); # Read the trace header values$heap_size = <STDIN>;chomp($heap_size);$num_blocks = <STDIN>;chomp($num_blocks);$old_num_ops = <STDIN>;chomp($old_num_ops);$weight = <STDIN>;chomp($weight);# # Find any allocate requests that don't have a matching free requests#$linenum = 4;$requestnum = 0;while ($line = <STDIN>) {    chomp($line);    $linenum++;    ($cmd, $id, $size) = split(" ", $line);    # ignore blank lines    if (!$cmd) {	next;    }    # save the line for output later    $lines[$requestnum++] = $line;    #ignore realloc requests, as long as they are preceeded by an alloc request    if ($cmd eq "r") {	if (!$HASH{$id}) {	    die "$0: ERROR[$linenum]: realloc without previous alloc\n";	}	next;    }    if ($cmd eq "a" and $HASH{$id} eq "a") {	die "$0: ERROR[$linenum]: allocate with no intervening free.\n";    }    if ($cmd eq "a" and $HASH{$id} eq "f") {	die "$0: ERROR[$linenum]: reused ID $id.\n";    }    if ($cmd eq "f" and !exists($HASH{$id})) {	die "$0: ERROR[$linenum]: freeing unallocated block.\n";	next;    }    if ($cmd eq "f" and !$HASH{$id} eq "f") {	die "$0: ERROR[$linenum]: freeing already freed block.\n";	next;    }        if ($cmd eq "f") {	delete $HASH{$id};    }    else {	$HASH{$id} = $cmd;    }}# # If called with -s argument , print a brief balance summary and exit#if ($summary) {    if (!%HASH) {	print "Balanced trace.\n";    }     else {	print "Unbalanced tree.\n";    }    exit;}## Output a balanced version of the trace#$new_ops = keys %HASH;$new_num_ops = $old_num_ops + $new_ops;print "$heap_size\n";print "$num_blocks\n";print "$new_num_ops\n";print "$weight\n";# print the old requestsforeach $item (@lines) {    print "$item\n";}# print a set of free requests that will balance the traceforeach $key (sort keys %HASH) {    if ($HASH{$key} ne "a" and $HASH{$key} ne "r") {	die "$0: ERROR: Invalid free request in residue.\n";    }    print "f $key\n";}exit;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -