summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.printf/stap_merge.tcl
diff options
context:
space:
mode:
authorhunt <hunt>2008-02-01 19:06:02 +0000
committerhunt <hunt>2008-02-01 19:06:02 +0000
commit2129d358c4aba84430a18f86309f2aa70a8fd123 (patch)
tree92297211dbb994cda146dd3e249805fa6293bc55 /testsuite/systemtap.printf/stap_merge.tcl
parent90a9d9a51bbed3b989f1c16384ae3bc271eb48ca (diff)
downloadsystemtap-steved-2129d358c4aba84430a18f86309f2aa70a8fd123.tar.gz
systemtap-steved-2129d358c4aba84430a18f86309f2aa70a8fd123.tar.xz
systemtap-steved-2129d358c4aba84430a18f86309f2aa70a8fd123.zip
2008-02-01 Martin Hunt <hunt@redhat.com>
PR4736 * systemtap.printf/stap_merge.tcl: Copied here so it will always be available.
Diffstat (limited to 'testsuite/systemtap.printf/stap_merge.tcl')
-rwxr-xr-xtestsuite/systemtap.printf/stap_merge.tcl102
1 files changed, 102 insertions, 0 deletions
diff --git a/testsuite/systemtap.printf/stap_merge.tcl b/testsuite/systemtap.printf/stap_merge.tcl
new file mode 100755
index 00000000..47d419ce
--- /dev/null
+++ b/testsuite/systemtap.printf/stap_merge.tcl
@@ -0,0 +1,102 @@
+#!/usr/bin/env tclsh
+#
+# stap_merge.tcl - systemtap merge program
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright (C) Red Hat Inc, 2007
+#
+#
+
+proc usage {} {
+ puts stderr "$::argv0 \[-v\] \[-o output_filename\] input_files ...\n"
+ exit 1
+}
+
+set outfile "stdout"
+set verbose 0
+set index 0
+while {[string match -* [lindex $argv $index]]} {
+ switch -glob -- [lindex $argv $index] {
+ -v {set verbose 1}
+ -o {incr index; set outfile [lindex $argv $index]}
+ default {usage}
+ }
+ incr index
+}
+
+if {$tcl_platform(byteOrder) == "littleEndian"} {
+ set int_format i
+} else {
+ set int_format I
+}
+
+set files [lrange $argv $index end]
+
+set n 0
+foreach file $files {
+ if {[catch {open $file} fd($n)]} {
+ puts stderr $fd($n)
+ exit 1
+ }
+ fconfigure $fd($n) -translation binary
+ if {![binary scan [read $fd($n) 4] $int_format timestamp($n)]} {
+ continue
+ }
+ set timestamp($n) [expr $timestamp($n) & 0xFFFFFFFF]
+ incr n
+}
+set ncpus $n
+
+if {$outfile != "stdout"} {
+ if {[catch {open $outfile w} outfile]} {
+ puts stderr $outfile
+ exit 1
+ }
+}
+fconfigure $outfile -translation binary
+
+while {1} {
+ set mincpu -1
+ for {set n 0} {$n < $ncpus} {incr n} {
+ if {[info exists fd($n)] && (![info exists min] || $timestamp($n) <= $min)} {
+ set min $timestamp($n)
+ set mincpu $n
+ }
+ }
+
+ if {![info exists min]} {break}
+
+ if {![binary scan [read $fd($mincpu) 4] $int_format len]} {
+ puts stderr "Error reading length from channel $mincpu"
+ exit 1
+ }
+
+ if {$verbose == 1} {
+ puts stderr "\[CPU:$mincpu, seq=$min, length=$len\]"
+ }
+
+ set data [read $fd($mincpu) $len]
+ puts -nonewline $outfile $data
+
+ set data [read $fd($mincpu) 4]
+ if {$data == ""} {
+ unset fd($mincpu)
+ } else {
+ binary scan $data $int_format timestamp($mincpu)
+ set timestamp($mincpu) [expr $timestamp($mincpu) & 0xFFFFFFFF]
+ }
+ unset min
+}