Updated processing of pd_flag variable so that startup logic is shared
[dyninst.git] / visiClients / tableVisi / src / dg2.C
1 /*
2  * Copyright (c) 1996-1999 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 // dg2.C
43 // implementation of the "Dg" tcl command
44
45 /* $Id: dg2.C,v 1.11 2000/10/17 17:28:57 schendel Exp $ */
46
47 #include <iostream.h>
48
49 #include "common/h/headers.h"
50
51 #include "tcl.h"
52 #include "tk.h"
53
54 #include "pdutilOld/h/pdsocket.h"
55 #include "pdutilOld/h/pddesc.h"
56 #include "common/h/Types.h"
57 #include "visi/h/visualization.h"
58
59 #include "dg2.h"
60
61 #include "tableVisiTcl.h"
62 #include "pdutilOld/h/TclTools.h"
63
64
65
66 #define   AGGREGATE        0
67 #define   BINWIDTH         1
68 #define   FOLDMETHOD       2
69 #define   METRICNAME       3
70 #define   METRICUNITS      4
71 #define   NUMBINS          5
72 #define   NUMMETRICS       6
73 #define   NUMRESOURCES     7
74 #define   RESOURCENAME     8
75 #define   STARTSTREAM      9
76 #define   STOPSTREAM       10
77 #define   DGSUM            11
78 #define   DGVALID          12
79 #define   DGENABLED        13
80 #define   VALUE            14
81 #define   CMDERROR         15
82 #define   LASTBUCKET       16
83 #define   FIRSTBUCKET      17
84 #define   MYPHASENAME      18
85
86 struct cmdTabEntry {
87    const char *cmdname;
88    int index;
89    int numargs;
90 };
91
92 static struct cmdTabEntry Dg_Cmds[] = {
93   {"aggregate",    AGGREGATE,       2},
94   {"binwidth",     BINWIDTH,        0},
95   {"firstbucket",  FIRSTBUCKET,     2},
96   {"foldmethod",   FOLDMETHOD,      2},
97   {"lastbucket",   LASTBUCKET,      2},
98   {"metricname",   METRICNAME,      1},
99   {"metricunits",  METRICUNITS,     1},
100   {"numbins",      NUMBINS,         0},
101   {"nummetrics",   NUMMETRICS,      0},
102   {"numresources", NUMRESOURCES,    0},
103   {"resourcename", RESOURCENAME,    1},
104   {"start",        STARTSTREAM,     2},
105   {"stop",         STOPSTREAM,      2},
106   {"sum",          DGSUM,           2},
107   {"valid",        DGVALID,         2},
108   {"enabled",      DGENABLED,       2},
109   {"value",        VALUE,           3},
110   {"myphasename",  MYPHASENAME,     0},
111   {NULL,           CMDERROR,        0}
112 };
113
114 int findCommand(Tcl_Interp *interp, 
115                        int argc, 
116                        char *argv[]) {
117
118   ostrstream resstr;
119
120   if (argc == 0) {
121      resstr << "USAGE: Dg <option> [args...]\n" << ends;
122      SetInterpResult(interp, resstr);
123      return CMDERROR;
124   }
125
126   for (cmdTabEntry *C = Dg_Cmds; C->cmdname!=NULL; C++) {
127      if (strcmp(argv[0], C->cmdname) == 0) {
128         if (argc-1 == C->numargs) 
129            return C->index; // successful parsing
130
131         resstr << argv[0] << ": wrong number of args ("
132             << argc-1 << "). Should be "
133             << C->numargs << "\n" << ends;
134         SetInterpResult(interp, resstr);
135         return CMDERROR;
136      }
137   }
138
139   resstr << "unknown option (" << argv[0] << ")\n" << ends;
140   SetInterpResult(interp, resstr);
141   return CMDERROR;
142 }
143
144 int Dg_TclCommand(ClientData, Tcl_Interp *interp, 
145                   int argc, char *argv[]) {
146   // entrypoint to the tcl "Dg" command we've installed
147   // all the sprintf()'s are rather slow...
148
149   // parse the arguments, using global vrble Dg_Cmds[] to tell what's what.
150   int cmdDex = findCommand(interp, argc-1, argv+1);
151   if (cmdDex == CMDERROR)
152     return TCL_ERROR;
153
154   int m, r, buck; // metric number, resource number, bucket number
155   ostrstream resstr;
156   int ret = TCL_OK;
157
158
159   switch(cmdDex) {
160   case AGGREGATE:   
161     m = atoi(argv[2]);
162     r = atoi(argv[3]);
163     resstr << visi_AverageValue(m,r) << ends;
164     break;
165
166   case BINWIDTH:     
167     resstr << visi_BucketWidth() << ends;
168     break;
169
170   case FIRSTBUCKET:
171     m = atoi(argv[2]);
172     r = atoi(argv[3]);
173     resstr << visi_FirstValidBucket(m,r) << ends;
174     break;
175
176   case LASTBUCKET:
177     m = atoi(argv[2]);
178     r = atoi(argv[3]);
179     resstr << visi_LastBucketFilled(m,r) << ends;
180     break;
181
182   case METRICNAME:  
183     m = atoi(argv[2]);
184     resstr << visi_MetricName(m) << ends;
185     break;
186
187   case METRICUNITS:  
188     m = atoi(argv[2]);
189     resstr << visi_MetricUnits(m) << ends;
190     break;
191
192   case NUMBINS:     
193     resstr << visi_NumBuckets() << ends;
194     break;
195
196   case NUMMETRICS:  
197     resstr << visi_NumMetrics() << ends;
198     break;
199
200   case NUMRESOURCES:
201     resstr << visi_NumResources() << ends;
202     break;
203
204   case RESOURCENAME:
205     r = atoi(argv[2]);
206     resstr << visi_ResourceName(r) << ends;
207     break;
208
209   case STARTSTREAM:       
210     visi_GetMetsRes(argv[2], atoi(argv[3]));
211     break;
212
213   case STOPSTREAM:
214     m = atoi(argv[2]);
215     r = atoi(argv[3]);
216     visi_StopMetRes(m, r);
217     break;
218
219   case DGSUM:         
220     m = atoi(argv[2]);
221     r = atoi(argv[3]);
222     resstr << visi_SumValue(m,r) << ends;
223     break;
224
225   case DGVALID:
226     m = atoi(argv[2]);
227     r = atoi(argv[3]);
228     resstr << visi_Valid(m,r) << ends;
229     break;
230
231   case DGENABLED:
232     m = atoi(argv[2]);
233     r = atoi(argv[3]);
234     resstr << visi_Enabled(m,r) << ends;
235     break;
236
237   case VALUE:       
238     m = atoi(argv[2]);
239     r = atoi(argv[3]);
240     buck = atoi(argv[4]);
241     resstr << visi_DataValue(m,r,buck) << ends;
242     break;
243
244   case MYPHASENAME:
245     resstr << visi_GetMyPhaseName() << ends;
246     break;
247
248   default:
249     resstr << "Internal error (func findCommand)\n" << ends;
250     ret = TCL_ERROR;
251     break;
252   }
253
254   SetInterpResult(interp, resstr);
255
256   return ret;
257 }
258
259 int Dg2_Init(Tcl_Interp *interp) {
260    Tcl_CreateCommand(interp, "Dg", Dg_TclCommand, 
261                     (ClientData *) NULL,(Tcl_CmdDeleteProc *) NULL);
262  
263    return TCL_OK;
264 }