Il 08/08/2013 23:42, Alex Bligh ha scritto: > Add scripts/switch-timer-api to programatically rewrite source > files to use the new timer system. > > Signed-off-by: Alex Bligh <a...@alex.org.uk> > --- > scripts/switch-timer-api | 178 > ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 178 insertions(+) > > diff --git a/scripts/switch-timer-api b/scripts/switch-timer-api > new file mode 100755 > index 0000000..5a06069 > --- /dev/null > +++ b/scripts/switch-timer-api > @@ -0,0 +1,178 @@ > +#!/usr/bin/perl > + > +use strict; > +use warnings; > +use Getopt::Long; > +use FindBin; > + > +my @legacy = qw(qemu_clock_ptr qemu_get_clock_ns qemu_get_clock_ms > qemu_register_clock_reset_notifier qemu_unregister_clock_reset_notifier > qemu_new_timer qemu_free_timer qemu_del_timer qemu_mod_timer_ns > qemu_mod_timer qemu_run_timers qemu_new_timer_ns qemu_new_timer_us > qemu_new_timer_ms); > +my $legacyre = '\b('.join('|', @legacy).')\b'; > +my $option_git; > +my $option_dryrun; > +my $option_quiet; > +my $option_rtc; > +my $suffix=".tmp.$$"; > +my @files; > +my $getfiles = 'git grep -l -E > \'\b((host|rt|vm|rtc)_clock\b|qemu_\w*timer)\' | egrep \'\.[ch]$\' | egrep -v > \'qemu-timer\.c$|include/qemu/timer\.h$\''; > + > +sub Syntax > +{ > + print STDERR <<STOP; > +Usage: $FindBin::Script [options] FILE ... > + > +Translate each FILE to the new Qemu timer API. If no files > +are passed, a reasonable guess is taken. > + > +Options: > + -q, --quiet Do not show warnings etc > + -d, --dry-run Do a dry run > + -g, --git Generate a git commit for each change > + -r, --rtc Only fix up rtc usage
What is this option useful for? Paolo > + -h, --help Print this message > + > +STOP > +return; > +} > + > +sub ParseOptions > +{ > + if (!GetOptions ( > + "dry-run|d" => \$option_dryrun, > + "git|g" => \$option_git, > + "quiet|q" => \$option_quiet, > + "rtc|r" => \$option_rtc, > + "help|h" => sub { Syntax(); exit(0); } > + )) > + { > + Syntax(); > + die "Bad options"; > + } > + > + if ($#ARGV >=0) > + { > + @files = @ARGV; > + } > + else > + { > + @files = split(/\s+/, `$getfiles`); > + } > + > + foreach my $file (@files) > + { > + die "Cannot find $file" unless (-f $file && -r $file); > + } > +} > + > +sub DoWarn > +{ > + my $text = shift @_; > + my $line = shift @_; > + return if ($option_quiet); > + chomp ($line); > + print STDERR "$text\n"; > + print STDERR "$line\n\n"; > +} > + > +sub Process > +{ > + my $ifn = shift @_; > + my $ofn = $ifn.$suffix; > + > + my $intext; > + my $outtext; > + my $linenum = 0; > + > + open my $input, "<", $ifn || die "Cannot open $ifn for read: $!"; > + > + while (<$input>) > + { > + my $line = $_; > + $intext .= $line; > + $linenum++; > + > + # fix the specific uses > + unless ($option_rtc) > + { > + $line =~ > s/\bqemu_new_timer(_[num]s)\s*\((vm_|rt_|host_)clock\b/qemu_timer_new$1(XXX_$2clock/g; > + $line =~ > s/\bqemu_new_timer\s*\((vm_|rt_|host_)clock\b/qemu_timer_new(XXX_$1clock/g; > + $line =~ > s/\bqemu_get_clock(_[num]s)\s*\((vm_|rt_|host_)clock\b/qemu_clock_get$1(XXX_$2clock/g; > + } > + > + # rtc is different > + $line =~ > s/\bqemu_new_timer(_[num]s)\s*\(rtc_clock\b/qemu_timer_new$1(rtc_clock/g; > + $line =~ s/\bqemu_new_timer\s*\(rtc_clock\b/qemu_timer_new(rtc_clock/g; > + $line =~ > s/\bqemu_get_clock(_[num]s)\s*\(rtc_clock\b/qemu_clock_get$1(rtc_clock/g; > + $line =~ > s/\bqemu_register_clock_reset_notifier\s*\(rtc_clock\b/qemu_register_clock_reset_notifier(qemu_clock_ptr(rtc_clock)/g; > + > + unless ($option_rtc) > + { > + # fix up comments > + $line =~ s/\b(vm_|rt_|host_)clock\b/XXX_$1clock/g if ($line =~ > m,^[/ ]+\*,); > + > + # spurious fprintf error reporting > + $line =~ s/: qemu_new_timer_ns failed/: qemu_timer_new_ns failed/g; > + > + # these have just changed name > + $line =~ s/\bqemu_mod_timer\b/qemu_timer_mod/g; > + $line =~ s/\bqemu_mod_timer_(ns|us|ms)\b/qemu_timer_mod_$1/g; > + $line =~ s/\bqemu_free_timer\b/qemu_timer_free/g; > + $line =~ s/\bqemu_del_timer\b/qemu_timer_del/g; > + } > + > + # fix up rtc_clock > + $line =~ s/QEMUClock \*rtc_clock;/QEMUClockType rtc_clock;/g; > + $line =~ s/\brtc_clock = (vm_|rt_|host_)clock\b/rtc_clock = > XXX_$1clock/g; > + > + unless ($option_rtc) > + { > + # replace any more general uses > + $line =~ s/\b(vm_|rt_|host_)clock\b/qemu_clock_ptr(XXX_$1clock)/g; > + } > + > + # fix up the place holders > + $line =~ s/\bXXX_vm_clock\b/QEMU_CLOCK_VIRTUAL/g; > + $line =~ s/\bXXX_rt_clock\b/QEMU_CLOCK_REALTIME/g; > + $line =~ s/\bXXX_host_clock\b/QEMU_CLOCK_HOST/g; > + > + unless ($option_rtc) > + { > + DoWarn("$ifn:$linenum WARNING: timer $1 not fixed up", $line) if > ($line =~ /\b((vm_|rt_|host_)clock)\b/); > + DoWarn("$ifn:$linenum WARNING: function $1 not fixed up", $line) if > ($line =~ /\b(qemu_new_timer\w+)\b/); > + DoWarn("$ifn:$linenum WARNING: legacy function $1 remains", $line) > if ($line =~ /$legacyre/o); > + } > + > + $outtext .= $line; > + } > + > + close $input; > + > + if ($intext ne $outtext) > + { > + print STDERR "Patching $ifn\n" unless ($option_quiet); > + unless ($option_dryrun) > + { > + open my $output, ">", $ofn || die "Cannot open $ofn for write: $!"; > + print $output $outtext; > + close $output; > + rename ($ofn, $ifn) || die "Cannot rename temp file to $ifn: $!"; > + return 1; > + } > + } > + return 0; > +} > + > +sub DoCommit > +{ > + my $file = shift @_; > + open (my $git, "| git commit -F - $file") || die "Cannot run git commit > on $file: $!"; > + print $git "timers api: use new timer api in $file\n\nConvert $file to > use new timer API.\nThis is an automated commit made by > scripts/switch-timer-api\n"; > + close ($git); > +} > + > +ParseOptions; > + > +foreach my $file (@files) > +{ > + my $changed = Process ($file); > + DoCommit($file) if ($changed && $option_git); > +} >