stats.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:16k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (C) 1998 by USC/ISI
  3. # All rights reserved.                                            
  4. #                                                                
  5. # Redistribution and use in source and binary forms are permitted
  6. # provided that the above copyright notice and this paragraph are
  7. # duplicated in all such forms and that any documentation, advertising
  8. # materials, and other materials related to such distribution and use
  9. # acknowledge that the software was developed by the University of
  10. # Southern California, Information Sciences Institute.  The name of the
  11. # University may not be used to endorse or promote products derived from
  12. # this software without specific prior written permission.
  13. # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  14. # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  15. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16. # $Header: /cvsroot/nsnam/nam-1/tcl/stats.tcl,v 1.16 2002/05/17 20:55:37 buchheim Exp $
  17. Animator instproc tracehooktcl { e } {
  18.  
  19.     # notify observers
  20.     $self notifyObservers $e
  21. }
  22. Animator instproc update_statsview { s event } {
  23.     $self instvar colorset highest_seq timeslider maxtime colorname subView 
  24. subViewRange plotdatax plotdatay plotmark
  25.     set s_len [string length $s]
  26.     set session_id [string index $s [expr $s_len-1]]
  27.     # Only process THIS window
  28.     set sid [get_trace_item "-S" $event]
  29.     if {$sid != $session_id} {return}
  30.     # main view
  31.     set extinfo [get_trace_item "-x" $event]
  32.     set time [get_trace_item "-t" $event]
  33.     set seqno [lindex $extinfo 2]
  34.     set colorid [get_trace_item "-a" $event]
  35.     set mid [get_trace_item "-m" $event]
  36.     if { $mid == "" } {return}
  37.     set cnt 0
  38.     while {[info exists plotdatax($sid.$cnt)]} {
  39. $self plot_xy $s.main.c $time $seqno 0 $maxtime 0 $highest_seq($sid) 
  40. $colorid $plotmark($sid.$mid) 0
  41.         incr cnt
  42.     }
  43.     # subview
  44.     foreach subviews $subView(#$session_id) {
  45.    if {![winfo exists $subviews]} {continue}
  46.     
  47. set minx [lindex $subViewRange($subviews) 0]
  48. set maxx [lindex $subViewRange($subviews) 1]
  49. set miny [lindex $subViewRange($subviews) 2]
  50. set maxy [lindex $subViewRange($subviews) 3]
  51. $self plot_xy $subviews.main.c $time $seqno $minx $maxx 
  52.  $miny $maxy $colorid $plotmark($sid.$mid) 1
  53.     }
  54. }
  55. #change nam window status 
  56. Animator instproc new_waitingtext { msg } {
  57.     $self instvar windows 
  58.     $windows(title) configure -text "Please wait - $msg"
  59.     update
  60. }
  61. # restore nam window status
  62. Animator instproc restore_waitingtext {} {
  63.     $self instvar windows nam_name
  64.     $windows(title) configure -text $nam_name
  65. }
  66. Animator instproc active_sessions {} {
  67.     $self instvar analysis_ready colorset colorindex session_id colorname 
  68.     netModel analysis_flag windows nam_name tlw_ cache_ready
  69.     #processing tracefile if necessary
  70.     
  71.     if {[string compare $analysis_flag "0"] == 0} {
  72. set analysis_flag 1
  73.     }
  74.     set w $tlw_.activesessions
  75.     if {[winfo exists $w]} {
  76.      raise $w
  77.         return
  78.     } 
  79.     $windows(title) configure -text "Please wait ... "
  80.     update
  81.     # good timing
  82.     # check if analysis ready
  83.     if { $analysis_ready == 1 && $cache_ready == 0 } {
  84.         $self cache_plot
  85. set cache_ready 1
  86.     }
  87.     $windows(title) configure -text $nam_name
  88.     #processing tracefiel if necessary
  89.     toplevel $w
  90.     wm title $w "Current Active Sessions"
  91.     bind $w <Control-w> "destroy $w"
  92.     bind $w <Control-W> "destroy $w"
  93.     bind $w <Control-q> "[AnimControl instance] done"
  94.     bind $w <Control-Q> "[AnimControl instance] done"
  95.     frame $w.f 
  96.     pack $w.f -side top
  97.     label $w.f.label_left -text "LEGEND"
  98.     label $w.f.label_right -text "SESSIONS"
  99.     for {set i 0} { $i < $colorindex } { incr i} {
  100.     
  101. label $w.f.label_left$i -text "    " -bg $colorname($i);
  102. set stats_title $session_id($i)
  103. button $w.f.button$i -text $session_id($i) 
  104. -command "$self make_mainwin "$i""
  105.     }
  106.     grid config $w.f.label_left -column 0 -row 0 -sticky "n"
  107.     grid config $w.f.label_right -column 1 -row 0 -sticky "n"
  108.     for {set i 0} { $i < $colorindex } { incr i} {
  109. grid config $w.f.label_left$i -column 0 -row [expr $i+1] 
  110. -sticky "snew"
  111. grid config $w.f.button$i -column 1 -row [expr $i+1] 
  112. -sticky "snew"
  113.     }
  114. }
  115. Animator instproc auto_legend {} {
  116.     $self instvar Mcnt plotmarks colorname filter_id filtercolor_id colorindex tlw_ 
  117.     set w $tlw_.autolegend
  118.  
  119.     if {[winfo exists $w]} {
  120.      raise $w
  121.         return
  122.     }
  123.     toplevel $w
  124.     wm title $w "Current Filter Legend"
  125.     bind $w <Control-w> "destroy $w"
  126.     bind $w <Control-W> "destroy $w"
  127.     bind $w <Control-q> "[AnimControl instance] done"
  128.     bind $w <Control-Q> "[AnimControl instance] done"
  129.  
  130.     frame $w.f
  131.     pack $w.f -side top
  132.  
  133.     label $w.f.label_left -text "LEGEND"
  134.     label $w.f.label_right -text "EXPLANATION"
  135.  
  136.     for {set i 0} { $i < $Mcnt } { incr i} {
  137. #    if { $i == 2 } { 
  138. #     set i [expr $i+$colorindex-2]
  139. #        }
  140. # if { $i > 1 } {
  141. #            label $w.f.label_left$i -bitmap $plotmarks($i) -fg $colorname($i)
  142. # } else {
  143. #     label $w.f.label_left$i -bitmap $plotmarks($i) -fg $colorname(0)
  144. # }
  145. label $w.f.label_left$i -bitmap $plotmarks($i) -fg $colorname($filtercolor_id($i))
  146.         label $w.f.button$i -text $filter_id($i)
  147.  
  148.     }
  149.  
  150.     grid config $w.f.label_left -column 0 -row 0 -sticky "n"
  151.     grid config $w.f.label_right -column 1 -row 0 -sticky "n"
  152.  
  153.     for {set i 0} { $i < $Mcnt } { incr i} {
  154. #        if { $i == 2 } { 
  155. #            set i [expr $i+$colorindex-2]
  156. #        }
  157.         grid config $w.f.label_left$i -column 0 -row [expr $i+1] 
  158.                 -sticky "snew"
  159.         grid config $w.f.button$i -column 1 -row [expr $i+1] 
  160.                 -sticky "snew"
  161.     }
  162. }
  163. Animator instproc ScrolledCanvas { c width height region } {
  164.         frame $c
  165.         canvas $c.canvas -width $width -height $height 
  166.                 -scrollregion $region 
  167.                 -xscrollcommand [list $c.xscroll set] 
  168.                 -yscrollcommand [list $c.yscroll set]
  169.         scrollbar $c.xscroll -orient horizontal 
  170.                 -command [list $c.canvas xview]
  171.         scrollbar $c.yscroll -orient vertical 
  172.                 -command [list $c.canvas yview]
  173.         pack $c.xscroll -side bottom -fill x
  174.         pack $c.yscroll -side right -fill y
  175.         pack $c.canvas -side left -fill both -expand true
  176.         pack $c -side top -fill both -expand true
  177.         return $c.canvas
  178. }
  179. Animator instproc build.m0 { w } {
  180.     bind $w <Configure> "$self xtimeticks $w"
  181. }
  182. Animator instproc xtimeticks { w } {
  183.     $self instvar timeslider mintime range timeslider_width
  184.     set width [winfo width $w]
  185.     set height [winfo height $w]
  186.     $w delete ticks
  187.     
  188.     set x [expr $timeslider(swidth)/2]
  189.     set intertick [expr ($width-$timeslider(swidth))/(10 * $range)]
  190.     for {set t $mintime} {$t < ($range+$mintime)} {set t [expr $t+0.1]} {
  191.         set intx [expr int($x)]
  192.         $w addtag ticks withtag 
  193.                 [$w create line 
  194.                 $intx [expr $timeslider(height)/2 + $height*9/10] $intx [expr $timeslider(height) + $height*9/10]]
  195.         set x [expr $x+$intertick]
  196.     }
  197.     
  198.     set orx [expr $timeslider(swidth)/2]
  199.     $w addtag ticks withtag 
  200.         [$w create line $orx [expr $timeslider(height)+$height*9/10] $x [expr $timeslider(height)+$height*9/10]]
  201.     $w addtag ticks withtag 
  202.    [$w create line $orx [expr $timeslider(height)+$height*9/10] $orx 0]]
  203.     set x [expr $timeslider(swidth)/2]
  204.     set intertick [expr ($width-$timeslider(swidth))/($range)]
  205.     for {set t $mintime} {$t < ($range+$mintime)} {set t [expr $t+1]} {
  206.         set intx [expr int($x)]
  207.         $w addtag ticks withtag 
  208.                 [$w create line 
  209.                 $intx [expr $timeslider(height) + $height*9/10] $intx [expr $height*9/10]]
  210.         set x [expr $x+$intertick]
  211.     }
  212. }
  213. Animator instproc make_mainwin { sid } {
  214.     $self tkvar model_ 
  215.     $self instvar session_id
  216.     $model_($sid) startview $session_id($sid)
  217. }
  218. # namgraph
  219. # pre-process for nam analysis
  220. Animator instproc nam_analysis { tracefile } {
  221.     $self instvar analysis_OK analysis_ready trace cache_ready count
  222.     set stream [new NamStream $tracefile]
  223.     set line [$stream gets]
  224.     set time [get_trace_item "-t" $line]
  225.     set count 0
  226.     #Handle nam version, *SHOULD NOT* assume the first line is V line
  227.     # skip all beginning non "*" events
  228.     while {([$stream eof]==0)&&([string compare $time "*"]!=0)} {
  229.         set line [$stream gets]
  230.         set time [get_trace_item "-t" $line] 
  231.     }
  232.     while {([$stream eof]==0)&&([string compare $time "*"]==0) } {
  233.         set cmd [lindex $line 0]
  234.             # Skip comment lines
  235.             if [regexp {^#} $cmd] {
  236.                     continue
  237.             }
  238.         switch "$cmd" {
  239.             "V" {
  240.                  $self handle_version $line
  241.              }
  242.     "N" {
  243.  $self handle_analysis $line
  244.      }
  245.       "c" {
  246.  $self handle_colorname $line
  247.      }
  248.         }
  249.         set count [expr $count + 1]
  250.         set line [$stream gets]
  251.         set time [get_trace_item "-t" $line]
  252.     }
  253.     $stream close
  254.     if { $count==0 } {
  255.          puts "*** !!! ***"
  256.          puts "nam cannot recognize the trace file $tracefile"
  257.          puts "Please make sure that the file is not empty and it is a nam trace"
  258.          puts "***********"
  259.          exit
  260.     }
  261.     # old nam, skip it
  262.     if { $analysis_OK == 0 } { 
  263.          puts "You are using the tracefile format older than 1.0a5"
  264.  puts "which will not allow you to run namgraph"
  265.          return
  266.     }
  267.     set cache_ready 0
  268. }
  269. Animator instproc cache_plot { } {
  270.     $self instvar tracefile plotdatax plotdatay plotmark plotmarks plotcolor
  271.     if ![info exists plotmarks] {
  272.     # Initialize - loop assign ?
  273.     set plotmarks(0) mark1
  274.     set plotmarks(1) mark2
  275.     set plotmarks(2) mark3
  276.     set plotmarks(3) mark4
  277.     set plotmarks(4) mark5
  278.     set plotmarks(5) mark6
  279.     set plotmarks(6) mark7
  280.     set plotmarks(7) mark8
  281.             set plotmarks(8) mark1
  282.             set plotmarks(9) mark2
  283.             set plotmarks(10) mark3
  284.             set plotmarks(11) mark4
  285.             set plotmarks(12) mark5
  286.             set plotmarks(13) mark6
  287.             set plotmarks(14) mark7
  288.             set plotmarks(15) mark8
  289.     }
  290.     set file [new NamStream $tracefile]
  291. #    set file [open $tracefile "r"]
  292.     $self tkvar model_
  293.     while {[$file eof]==0} {
  294. set line [$file gets]
  295. set time [get_trace_item "-t" $line]
  296.         if {[string compare $time "*"]==0 } {continue}
  297. set Sid [get_trace_item "-S" $line]
  298. set mid [get_trace_item "-m" $line]
  299. set pid [get_trace_item "-p" $line]
  300. set fid [get_trace_item "-f" $line]
  301. set yvalset [get_trace_item "-y" $line]
  302. set yval [lindex $yvalset 0]
  303. set ymark [lindex $yvalset 1]
  304. if { $mid == "" } {continue}
  305. set plotmark($Sid.$mid) $plotmarks($mid)
  306. set plotcolor($Sid.$mid) $fid
  307.         #NEW MCV stuff. It will replace the above code finally
  308. if ![info exists model_($Sid)] {
  309.     #create a new namgraph model
  310.     set model_($Sid) [new NamgraphModel $Sid $self]
  311.     # Attach this model to Animator
  312.     $self addObserver $model_($Sid)
  313. }
  314. set current_model $model_($Sid)
  315. $current_model adddata $self $mid $time $yval $ymark
  316.     }
  317.     $file close
  318. }
  319. Animator instproc handle_analysis { line } {
  320.     $self instvar session_id filter_id colorname highest_seq filtercolor_id 
  321.   ymark
  322.     set index [get_trace_item "-S" $line]
  323.     set findex [get_trace_item "-F" $line]
  324.     set title [get_trace_item "-n" $line]
  325.     set hseq [get_trace_item "-h" $line]
  326.     set mindex [get_trace_item "-M" $line]
  327.     set groupm [get_trace_item "-m" $line]
  328.     set proto [get_trace_item "-p" $line]
  329.     #session info
  330.     if { $index != "" && $title != "" } {
  331.         set session_id($index) $title
  332. set proto_id($index) $proto
  333.     }
  334.     if { $index != "" && $hseq != "" } {
  335. set highest_seq($index) $hseq
  336.     }
  337.     #filter info
  338.     if { $findex != "" } {
  339.         set filter_id($mindex) $title
  340. set filtercolor_id($mindex) $findex
  341.     }
  342.     
  343. }
  344. Animator instproc handle_colorname { line } {
  345.     $self instvar colorname
  346.     set index [get_trace_item "-i" $line] 
  347.     set colorn [get_trace_item "-n" $line]
  348.     set colorname($index) $colorn
  349. }
  350. Animator instproc handle_version { line } {
  351.     $self instvar analysis_OK nam_version analysis_ready colorindex 
  352. highest_seq Mcnt
  353.     set nam_version [get_trace_item "-v" $line]
  354.     if { $nam_version >= "1.0a5" } {
  355. set analysis_OK 1
  356.     }
  357.     set analysis_ready [get_trace_item "-a" $line]
  358.     set colorindex [get_trace_item "-c" $line]
  359.     #set highest_seq [get_trace_item "-h" $line]
  360.     #set Fcnt [get_trace_item "-F" $line]
  361.     #set Fcnt [expr $Fcnt+2]
  362.     set Mcnt [get_trace_item "-M" $line]
  363. }
  364. Animator instproc viewgraph { object graphtype tracefile } {
  365.     $self instvar netView now vslider windows nam_name graphs tlw_ 
  366.     if {$object==""} {return}
  367.     set graphtrace [new Trace $tracefile $self]
  368.     set netgraph ""
  369.     switch [lindex $object 0] {
  370. l {
  371.     set netgraph [new LinkNetworkGraph]
  372.     switch $graphtype {
  373. "bw" {
  374.     $netgraph bw [lindex $object 1] [lindex $object 2]
  375. }
  376. "loss" {
  377.     $netgraph loss [lindex $object 1] [lindex $object 2]
  378. }
  379.     }
  380. }
  381. f {
  382. set netgraph [new FeatureNetworkGraph]
  383. $netgraph feature [lindex $object 1] [lindex $object 2] [lindex $object 3]
  384.         }
  385.     }
  386.     if {$netgraph==""} {
  387. return
  388.     }
  389.     set name [lindex $object 0]_[lindex $object 1]_[lindex $object 2]_$graphtype
  390.     if {[winfo exists $tlw_.graph.f$name]==1} {
  391. return
  392.     }
  393.     $windows(title) configure -text "Please wait - reading tracefile..."
  394.     update
  395.     set maxtime [$graphtrace maxtime]
  396.     set mintime [$graphtrace mintime]
  397.     $graphtrace connect $netgraph
  398.     $netgraph timerange $mintime $maxtime
  399.     #force the entire tracefile to be read
  400.     $graphtrace settime $maxtime 1
  401.     set w $tlw_.graph
  402.     if {[winfo exists $w]==0} {
  403. frame $w 
  404. pack $w -side top -fill x -expand true -after [$vslider frame]
  405.     }
  406.     lappend graphs $netgraph
  407.     frame $w.f$name -borderwidth 2 -relief groove
  408.     pack $w.f$name -side top -expand true -fill both
  409.     label $w.f$name.pr -bitmap pullright -borderwidth 1 -relief raised
  410.     bind $w.f$name.pr <Enter> 
  411.   "$self viewgraph_label "[$self viewgraph_name $object $graphtype]" 
  412.   $w.f$name $w.f$name.pr $netgraph"
  413.     pack $w.f$name.pr -side left
  414.     $netgraph view $w.f$name.view
  415.     #set the current time in the graph
  416.     $netgraph settime $now
  417.     pack $w.f$name.view -side left -expand true 
  418.     -fill both
  419.     frame $w.f$name.l2 -width [expr [$vslider swidth]/2] -height 30
  420.     pack $w.f$name.l2 -side left
  421.     $windows(title) configure -text $nam_name
  422. }
  423. Animator instproc viewgraph_label {info win where netgraph} {
  424.     $self instvar tlw_
  425.     if {[winfo exists $win.lbl]==0} {
  426. frame $win.lbl -borderwidth 2 -relief groove
  427. button $win.lbl.hide -text "Hide" -relief raised -borderwidth 1 
  428. -highlightthickness 0 
  429. -command "destroy $win;
  430. $self rm_list_entry graphs $netgraph;
  431. if {[winfo children $tlw_.graph]=={}} {destroy $tlw_.graph}"
  432. pack $win.lbl.hide -side left
  433. label $win.lbl.l -text $info -font [smallfont]
  434. pack $win.lbl.l -side left
  435.     }
  436.     catch {
  437. pack $win.lbl -side left -after $where -fill y
  438. pack forget $where
  439. bind $win.lbl <Leave> 
  440.     "pack $where -side left -before $win.lbl;pack forget $win.lbl"
  441.     }
  442. }
  443. Animator instproc rm_list_entry {var value} {
  444.     $self instvar $var
  445.     set res ""
  446.     set lst [set [set var]]
  447.     foreach el $lst {
  448. if {[string compare $el $value]!=0} {
  449.     lappend res $el
  450. }
  451.     }
  452.     set [set var] $res
  453. }
  454. Animator instproc viewgraph_name {name graphtype} {
  455.     set type [lindex $name 0]
  456.     switch $type {
  457. "l" {
  458.     switch $graphtype {
  459. "bw" {
  460.     return "Bandwidth used on link [lindex $name 1]->[lindex $name 2]"
  461. }
  462. "loss" {
  463.     return "Packets dropped on link [lindex $name 1]->[lindex $name 2]"
  464. }
  465.     }
  466. }
  467. "f" {
  468.     return "[lindex $name 2] [lindex $name 3]"
  469. }
  470.     }
  471.     return unknown
  472. }