support for adding metrics and resources to existing visualization
[dyninst.git] / visi / src / datagrid.C
1 /*
2  * Copyright (c) 1993, 1994 Barton P. Miller, Jeff Hollingsworth,
3  *     Bruce Irvin, Jon Cargille, Krishna Kunchithapadam, Karen
4  *     Karavanic, Tia Newhall, Mark Callaghan.  All rights reserved.
5  * 
6  * This software is furnished under the condition that it may not be
7  * provided or otherwise made available to, or used by, any other
8  * person, except as provided for by the terms of applicable license
9  * agreements.  No title to or ownership of the software is hereby
10  * transferred.  The name of the principals may not be used in any
11  * advertising or publicity related to this software without specific,
12  * written prior authorization.  Any use of this software must include
13  * the above copyright notice.
14  *
15  */
16 /* $Log: datagrid.C,v $
17 /* Revision 1.7  1994/06/07 17:48:46  newhall
18 /* support for adding metrics and resources to existing visualization
19 /*
20  * Revision 1.6  1994/05/23  20:56:46  newhall
21  * To visi_GridCellHisto class: added deleted flag, SumValue
22  * method function, and fixed AggregateValue method function
23  *
24  * Revision 1.5  1994/05/11  17:12:44  newhall
25  * changed data values type from double to float
26  * fixed fold method function to support a folding
27  * at any point in the histogram, rather than only
28  * when the histogram is full
29  *
30  * Revision 1.4  1994/03/26  04:19:46  newhall
31  * changed all floats to double
32  * fix problem with null string returned for first resource name
33  *
34  * Revision 1.3  1994/03/17  05:19:59  newhall
35  * changed bucket width and time value's type to double
36  *
37  * Revision 1.2  1994/03/14  20:28:44  newhall
38  * changed visi subdirectory structure
39  *  */ 
40 ///////////////////////////////////////////////
41 // Member functions for the following classes:
42 //  Metric, Resource, visi_GridCellHisto,
43 //  visi_GridHistoArray, visi_DataGrid
44 ///////////////////////////////////////////////
45 #include "visi/h/datagrid.h" 
46
47 Metric::Metric(char *metricUnits,
48                char *metricName,
49                int id,
50                int foldMethod){
51
52   int len;
53
54   if(metricUnits != NULL){
55     len = strlen(metricUnits);
56     units = new char[len + 1];
57     strcpy(units,metricUnits);
58     units[len] = '\0';
59   }
60   else{
61    units = NULL;
62   }
63     if(metricName != NULL){
64     len = strlen(metricName);
65     name  = new char[len + 1];
66     strcpy(name,metricName);
67     name[len] = '\0';
68   }
69   else{
70     name = NULL;
71   }
72   Id    = id;
73   if(foldMethod == AVE)
74     aggregate = foldMethod;
75   else
76     aggregate = SUM;
77 }
78
79 ///////////////////////////////////////////
80 //
81 //  Resource constructor
82 //
83 Resource::Resource(char *resourceName,
84                    int id){
85   int len;
86
87   if(resourceName != NULL){
88     len = strlen(resourceName);
89     name = new char[len+1];
90     strcpy(name,resourceName);
91     name[len] = '\0';
92     Id = id;
93   }
94   else {
95     name = new char[1];
96     name[0] = '\0';
97     Id = -1;
98   }
99 }
100
101
102 ///////////////////////////////////////////
103 //
104 //  visi_GridCellHisto constructor
105 //
106 visi_GridCellHisto::visi_GridCellHisto(int numElements){
107
108  int i;
109     
110  if(numElements > 0){  
111    value = new sampleType[numElements];
112    for(i = 0; i < numElements; i++)
113      value[i] = ERROR;
114    valid      = 1;
115  }
116  deleted = 0;
117  size       = numElements;
118  lastBucketFilled = -1;
119 }
120
121 ///////////////////////////////////////////
122 //
123 // constructor for class GridHistoArray
124 //
125 visi_GridHistoArray::visi_GridHistoArray(int numElements){
126
127  if(numElements > 0){  
128    values = new visi_GridCellHisto[numElements];
129  }
130  size = numElements;
131
132 }
133
134
135 //
136 // destructor for class GridHistoArray
137 //
138 visi_GridHistoArray::~visi_GridHistoArray(){
139
140   delete[] values;
141 }
142
143 //
144 // evaluates to true if the grid cell indexed by i (foucus index)
145 // contains a histogram (is a valid metric/focus pair)
146 //
147 int visi_GridHistoArray::Valid(int i){
148
149   if ((i< 0) || (i>= size)){
150     visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_GridHistoArray::Valid");
151     return(ERROR_SUBSCRIPT);  
152   }
153   return(values[i].Valid());
154
155 }
156
157
158 //
159 // invalidates the grid cell indexed by i 
160 //
161 int visi_GridHistoArray::Invalidate(int i){
162
163   if ((i< 0) || (i>= size)){
164     visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_GridHistoArray::Invalidate");
165     return(ERROR_SUBSCRIPT);  
166   }
167   values[i].Invalidate();
168   return(OK);
169 }
170
171
172 //
173 // add new elements to the values array
174 //
175 int visi_GridHistoArray::AddNewResources(int howmany){
176
177 visi_GridCellHisto *temp;
178
179   if(howmany > 0){
180     temp = values;
181     values = new visi_GridCellHisto[howmany + size];
182     for(int i = 0; i < size; i++){
183        if(values[i].AddNewValues(temp[i].Value(),
184                                   temp[i].Size(),
185                                   temp[i].LastBucketFilled(),
186                                   temp[i].userdata) != OK){
187          return(ERROR_CREATEGRID);
188        }
189        temp[i].userdata = NULL;
190     }
191     size += howmany;
192     
193   }
194   return(OK);
195
196 }
197
198
199 //
200 //  add new elements to the values array
201 //
202 int visi_GridHistoArray::AddNewValues(visi_GridCellHisto *rarray,int howmany){
203
204   values = rarray;
205   size   = howmany;
206   rarray = NULL;
207   return(OK);
208
209 }
210
211 ///////////////////////////////////////////
212 //
213 // DataGrid constructor: creates metric and 
214 // resource lists and empty datagrid
215 //
216 visi_DataGrid::visi_DataGrid(int noMetrics,
217                              int noResources,
218                              Metric *metricList,
219                              Resource *resourceList,
220                              int noBins,
221                              timeType width){
222 int i;
223
224   numMetrics   = noMetrics;
225   numResources = noResources;
226   metrics      = new Metric[noMetrics];
227   resources    = new Resource[noResources];
228
229   for(i = 0; i < noMetrics; i++){
230     metrics[i].Metric(metricList[i].Units(),metricList[i].Name(),
231                       metricList[i].Identifier(),metricList[i].Aggregate());
232   }
233   for(i = 0; i < noResources; i++){
234     resources[i].Resource(resourceList[i].Name(),resourceList[i].Identifier());
235   }
236
237   data_values = new visi_GridHistoArray[noMetrics];
238   for (i = 0; i < noMetrics; i++)
239     data_values[i].visi_GridHistoArray(noResources);
240   numBins  = noBins;
241   binWidth = width;
242
243 }
244
245
246 //
247 // DataGrid constructor: creates metric and 
248 // resource lists and empty datagrid
249 //
250 visi_DataGrid::visi_DataGrid(int noMetrics,
251                              int noResources,
252                              visi_metricType *metricList,
253                              visi_resourceType *resourceList,
254                              int noBins,
255                              timeType width){
256 int i;
257
258   numMetrics   = noMetrics;
259   numResources = noResources;
260   metrics      = new Metric[noMetrics];
261   resources    = new Resource[noResources];
262
263   for(i = 0; i < noMetrics; i++){
264     metrics[i].Metric(metricList[i].units,metricList[i].name,
265                       metricList[i].Id,metricList[i].aggregate);
266   }
267   for(i = 0; i < noResources; i++){
268     resources[i].Resource(resourceList[i].name,resourceList[i].Id);
269   }
270   data_values = new visi_GridHistoArray[noMetrics];
271   for (i = 0; i < noMetrics; i++)
272     data_values[i].visi_GridHistoArray(noResources);
273   numBins  = noBins;
274   binWidth = width;
275
276 }
277
278
279
280 //
281 //  DataGrid destructor 
282 //
283 visi_DataGrid::~visi_DataGrid(){
284
285   delete[] resources;
286   delete[] metrics;
287   delete[] data_values;
288 }
289
290 // 
291 // returns metric name for metric number i 
292 //
293 char   *visi_DataGrid::MetricName(int i){
294   if((i < numMetrics) && (i>=0))
295     return(metrics[i].Name());
296   return(NULL);
297 }
298
299 // 
300 // returns metric units for metric number i 
301 //
302 char *visi_DataGrid::MetricUnits(int i){
303
304   if((i < numMetrics) && (i>=0))
305     return(metrics[i].Units());
306   return(NULL);
307 }
308
309
310 // 
311 // returns resource name for resource number j 
312 //
313 char     *visi_DataGrid::ResourceName(int j){
314
315   if((j < numResources) && (j>=0))
316     return(resources[j].Name());
317   return(NULL);
318 }
319
320
321 // 
322 //  returns fold method for metric i 
323 //
324 int  visi_DataGrid::FoldMethod(int i){
325
326   if((i < numMetrics) && (i >= 0))
327     return(metrics[i].Aggregate());
328   visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_DataGrid::FoldMethod");
329   return(ERROR_SUBSCRIPT);
330
331 }
332
333 // 
334 // returns metric identifier associated with metric number i 
335 //
336 int  visi_DataGrid::MetricId(int i){
337
338   if((i < numMetrics) && (i >= 0))
339     return(metrics[i].Identifier());
340   visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_DataGrid::MetricId");
341   return(ERROR_SUBSCRIPT);
342 }
343
344 // 
345 // returns resource identifier associated with resource number j 
346 //
347 int  visi_DataGrid::ResourceId(int j){
348
349   if((j < numResources) && (j >= 0))
350     return(resources[j].Identifier());
351   visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_DataGrid::ResourceId");
352   return(ERROR_SUBSCRIPT);
353 }
354
355 //
356 // returns 1 if datagrid element indicated by metric#, resource#
357 // contains histogram values, otherwise returns false
358 //
359 int visi_DataGrid::Valid(int metric, 
360                          int resource){
361
362   if((metric < 0) || (metric >= numMetrics)){
363     visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_HistoDataGrid::Valid");
364     return(ERROR_SUBSCRIPT);
365   }
366   return(data_values[metric].Valid(resource));
367
368 }
369
370 //
371 // invalidates data_grid element indicated by metric#, resource#
372 // sets valid to 0 and frees histogram space 
373 //
374 int visi_DataGrid::Invalidate(int metric,
375                               int resource){
376
377   if((metric < 0) || (metric >= numMetrics)){
378     visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_HistoDataGrid::Invalidate");
379     return(ERROR_SUBSCRIPT);
380   }
381   return(data_values[metric].Invalidate(resource));
382
383 }
384
385
386 //
387 // adds a new set of resources to the data grid
388 //
389 int visi_DataGrid::AddNewResource(int howmany,visi_resourceType *rlist){
390
391 Resource *temp;
392 int i,ok;
393
394   // add new values to resource list
395   temp = resources;
396   resources = new Resource[numResources + howmany];
397
398   for(i = 0; i < numResources; i++){
399     resources[i].Resource(temp[i].Name(),temp[i].Identifier());
400   }
401   for(i = numResources; i < (numResources + howmany); i++){
402     resources[i].Resource(rlist[i-numResources].name,
403                           rlist[i-numResources].Id);
404   }
405
406   numResources += howmany;
407
408   // add space to data grid for new resources
409   for(i = 0; i < numMetrics; i++){
410      if((ok = data_values[i].AddNewResources(howmany)) != OK)
411        return(ok); 
412   }
413   return(OK);
414 }
415
416
417 //
418 //  adds a new set of resources to the data grid
419 //
420 int visi_DataGrid::AddNewMetrics(int howmany,visi_metricType *mlist){
421
422 visi_GridHistoArray *tempdata;
423 Metric *temp;
424 int i,ok;
425
426   // add new values to metric list
427   temp = metrics;
428   metrics = new Metric[numMetrics + howmany];
429
430   for(i = 0; i < numMetrics; i++){
431     metrics[i].Metric(temp[i].Units(),temp[i].Name(),
432                       temp[i].Identifier(),temp[i].Aggregate());
433   }
434   for(i = numMetrics; i < (numMetrics + howmany); i++){
435     metrics[i].Metric(mlist[i-numMetrics].units, mlist[i-numMetrics].name,
436                        mlist[i-numMetrics].Id, mlist[i-numMetrics].aggregate);
437   }
438
439
440   // add space to data grid for new metrics
441
442   tempdata = data_values;
443   data_values = new visi_GridHistoArray[numMetrics + howmany];
444
445   for(i=0; i < numMetrics; i++){
446     if(data_values[i].AddNewValues(tempdata[i].Value(),tempdata[i].Size())
447        != OK){
448        return(ERROR_CREATEGRID); 
449     }
450   }
451
452   for(i=numMetrics; i < (numMetrics + howmany); i++){
453     data_values[i].visi_GridHistoArray(numResources);
454   }
455
456   numMetrics += howmany;
457   tempdata = NULL;
458   return(OK);
459
460 }
461
462
463 //
464 //  returns 1 if metric with Id equal to test_id is in the data grid
465 //
466 int visi_DataGrid::MetricInGrid(int test_id){
467
468   for(int i = 0; i < numMetrics; i++){
469     if (test_id == metrics[i].Identifier()){
470       return(1);
471     }
472   }
473   return(0);
474 }
475
476
477 //
478 //  returns 1 if resource with Id equal to test_id is in the data grid
479 //
480 int visi_DataGrid::ResourceInGrid(int test_id){
481
482   for(int i = 0; i < numResources; i++){
483     if (test_id == resources[i].Identifier()){
484       return(1);
485     }
486   }
487   return(0);
488 }