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