c version of xtext visi
[dyninst.git] / visi / src / datagrid.C
1 /*
2  * Copyright (c) 1996 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 ///////////////////////////////////////////////
43 // Member functions for the following classes:
44 //  Metric, Resource, visi_GridCellHisto,
45 //  visi_GridHistoArray, visi_DataGrid
46 ///////////////////////////////////////////////
47 #include "visi/src/datagridP.h" 
48
49 Metric::Metric(string metricUnits,
50                string metricName,
51                u_int id,
52                int foldMethod,
53                visi_unitsType units_type){
54
55   units = metricUnits;
56   name = metricName;
57   Id    = id;
58   if(foldMethod == AVE)
59     aggregate = foldMethod;
60   else
61     aggregate = SUM;
62   unitstype = units_type;
63   if(unitstype == Normalized) {
64     label = units;
65     total_label = units;
66     total_label += P_strdup("_seconds");
67   }
68   else if (unitstype == UnNormalized) {
69     label = units;
70     label += P_strdup("/sec");
71     total_label = units; 
72   }
73   else {
74     label = units;
75     total_label = units; 
76   }
77 }
78
79 //
80 //  Metric destructor
81 //
82 Metric::~Metric(){
83   Id = 0;
84 }
85
86 ///////////////////////////////////////////
87 //
88 //  Resource constructor
89 //
90 Resource::Resource(string resourceName,
91                    u_int id){
92
93   if(resourceName.string_of() != 0){
94     name = resourceName; 
95     Id = id;
96   }
97   else {
98     name = 0;
99     Id = 0;
100   }
101 }
102
103 //
104 //  Resource destructor
105 //
106 Resource::~Resource(){
107 }
108
109 ///////////////////////////////////////////
110 //
111 //  visi_GridCellHisto constructor
112 //
113 visi_GridCellHisto::visi_GridCellHisto(int numElements){
114
115  int i;
116     
117  if(numElements > 0){  
118    value = new visi_sampleType[numElements];
119    for(i = 0; i < numElements; i++)
120      value[i] = ERROR;
121    valid      = 1;
122  }
123  enabled = 0;
124  size       = numElements;
125  lastBucketFilled = -1;
126  firstValidBucket = -1;
127 }
128
129 //
130 // destructor for class visi_GridCellHisto
131 //
132 visi_GridCellHisto::~visi_GridCellHisto(){
133
134   if(value) delete[] value;
135   value = 0;
136   valid = 0;
137   enabled = 0;
138   size = 0;
139 }
140
141 ///////////////////////////////////////////
142 //
143 // constructor for class GridHistoArray
144 //
145 visi_GridHistoArray::visi_GridHistoArray(int numElements){
146
147  if(numElements > 0){  
148    values = new visi_GridCellHisto[numElements];
149  }
150  size = numElements;
151
152 }
153
154
155 //
156 // destructor for class GridHistoArray
157 //
158 visi_GridHistoArray::~visi_GridHistoArray(){
159
160   delete[] values;
161 }
162
163 //
164 // evaluates to true if the grid cell indexed by i (foucus index)
165 // contains a histogram (is a valid metric/focus pair)
166 //
167 int visi_GridHistoArray::Valid(int i){
168
169   if ((i< 0) || (i>= size)){
170     return(ERROR_INT);  
171   }
172   return(values[i].Valid());
173
174 }
175
176
177 //
178 // invalidates the grid cell indexed by i 
179 //
180 int visi_GridHistoArray::Invalidate(int i){
181
182   if ((i< 0) || (i>= size)){
183     return(ERROR_INT);  
184   }
185   values[i].Invalidate();
186   return(OK);
187 }
188
189
190 //
191 // add new elements to the values array
192 //
193 int visi_GridHistoArray::AddNewResources(int howmany){
194
195 visi_GridCellHisto *temp = 0;
196
197   if(howmany > 0){
198     temp = values;
199     values = new visi_GridCellHisto[howmany + size];
200     for(int i = 0; i < size; i++){
201        if(values[i].AddNewValues(temp[i].Value(),
202                                   temp[i].Size(),
203                                   temp[i].LastBucketFilled(),
204                                   temp[i].userdata,
205                                   temp[i].Valid(),
206                                   temp[i].Enabled()) != OK){
207          return(ERROR_INT);
208        }
209        temp[i].userdata = 0;
210     }
211     size += howmany;
212     
213   }
214   delete[] temp;
215   return(OK);
216
217 }
218
219
220 //
221 //  add new elements to the values array
222 //
223 int visi_GridHistoArray::AddNewValues(visi_GridCellHisto *rarray,int howmany){
224
225   values = rarray;
226   size   = howmany;
227   rarray = 0;
228   return(OK);
229
230 }
231
232 ///////////////////////////////////////////
233 //
234 // DataGrid constructor: creates metric and 
235 // resource lists and empty datagrid
236 //
237 visi_DataGrid::visi_DataGrid(int noMetrics,
238                              int noResources,
239                              Metric *metricList,
240                              Resource *resourceList,
241                              int noBins,
242                              visi_timeType width,
243                              visi_timeType startTime,
244                              int phaseHandle){
245 int i;
246
247   numMetrics   = noMetrics;
248   numResources = noResources;
249   metrics      = new Metric[noMetrics];
250   resources    = new Resource[noResources];
251
252   for(i = 0; i < noMetrics; i++){
253     metrics[i] = Metric(metricList[i].Units(),metricList[i].Name(),
254                       metricList[i].Identifier(),metricList[i].Aggregate(),
255                       metricList[i].UnitsType());
256   }
257   for(i = 0; i < noResources; i++){
258     resources[i] = Resource(resourceList[i].Name(),resourceList[i].Identifier());
259   }
260
261   data_values = new visi_GridHistoArray[noMetrics];
262   for (i = 0; i < noMetrics; i++){
263       visi_GridHistoArray *temp = new visi_GridHistoArray(noResources);
264       data_values[i] = *temp;
265       delete temp;
266   }
267   numBins  = noBins;
268   binWidth = width;
269   start_time = startTime;
270   phase_handle = phaseHandle;
271
272 }
273
274
275 //
276 // DataGrid constructor: creates metric and 
277 // resource lists and empty datagrid
278 //
279 visi_DataGrid::visi_DataGrid(int noMetrics,
280                              int noResources,
281                              visi_metricType *metricList,
282                              visi_resourceType *resourceList,
283                              int noBins,
284                              visi_timeType width,
285                              visi_timeType startTime,
286                              int phaseHandle){
287 int i;
288
289   numMetrics   = noMetrics;
290   numResources = noResources;
291   metrics      = new Metric[noMetrics];
292   resources    = new Resource[noResources];
293
294   for(i = 0; i < noMetrics; i++){
295     metrics[i] = Metric(metricList[i].units,metricList[i].name,
296                       metricList[i].Id,metricList[i].aggregate,
297                       metricList[i].unitstype);
298   }
299   for(i = 0; i < noResources; i++){
300     resources[i] = Resource(resourceList[i].name,resourceList[i].Id);
301   }
302   data_values = new visi_GridHistoArray[noMetrics];
303   for (i = 0; i < noMetrics; i++){
304       visi_GridHistoArray *temp = new visi_GridHistoArray(noResources);
305       data_values[i] = *temp;
306       delete temp;
307   }
308   numBins  = noBins;
309   binWidth = width;
310   start_time = startTime;
311   phase_handle = phaseHandle;
312
313 }
314
315
316
317 //
318 //  DataGrid destructor 
319 //
320 visi_DataGrid::~visi_DataGrid(){
321
322   delete[] resources;
323   delete[] metrics;
324   delete[] data_values;
325 }
326
327 const char *visi_DataGrid::GetMyPhaseName(){
328
329     if (phase_handle == -1) return ("Global");
330     if (phase_handle >= 0){
331         for(unsigned i = 0; i < phases.size(); i++){
332             if(phase_handle == (int)phases[i]->getPhaseHandle()){
333                 return phases[i]->getName();
334     }}}
335     return 0;
336 }
337
338 // 
339 // returns metric name for metric number i 
340 //
341 const char   *visi_DataGrid::MetricName(int i){
342   if((i < numMetrics) && (i>=0))
343     return(metrics[i].Name());
344   return(0);
345 }
346
347 // 
348 // returns metric units for metric number i 
349 //
350 const char *visi_DataGrid::MetricUnits(int i){
351
352   if((i < numMetrics) && (i>=0))
353     return(metrics[i].Units());
354   return(0);
355 }
356
357 // 
358 // returns metric label for data values 
359 //
360 const char *visi_DataGrid::MetricLabel(int i){
361
362   if((i < numMetrics) && (i>=0)){
363     return(metrics[i].Label());
364   }
365   return(0);
366 }
367
368 // 
369 // returns metric label for AVE aggregation over data buckets 
370 //
371 const char *visi_DataGrid::MetricAveLabel(int i){
372
373   if((i < numMetrics) && (i>=0)) {
374     return(metrics[i].AveLabel());
375   }
376   return(0);
377 }
378
379 // 
380 // returns metric label for SUM aggregation over data buckets 
381 //
382 const char *visi_DataGrid::MetricSumLabel(int i){
383
384   if((i < numMetrics) && (i>=0)) {
385     return(metrics[i].SumLabel());
386   }
387   return(0);
388 }
389
390 // 
391 // returns resource name for resource number j 
392 //
393 const char     *visi_DataGrid::ResourceName(int j){
394
395   if((j < numResources) && (j>=0))
396     return(resources[j].Name());
397   return(0);
398 }
399
400
401 // 
402 //  returns fold method for metric i 
403 //
404 int  visi_DataGrid::FoldMethod(int i){
405
406   if((i < numMetrics) && (i >= 0))
407     return(metrics[i].Aggregate());
408   return(ERROR_INT);
409
410 }
411
412 // 
413 // returns metric identifier associated with metric number i 
414 //
415 u_int  visi_DataGrid::MetricId(int i,bool &error){
416
417   error = true;
418   if((i < numMetrics) && (i >= 0)){
419     error = false;
420     return (metrics[i].Identifier());
421   }
422   return(0);
423 }
424
425 // 
426 // returns resource identifier associated with resource number j 
427 //
428 u_int  visi_DataGrid::ResourceId(int j, bool &error){
429
430   error = true;
431   if((j < numResources) && (j >= 0)){
432     error = false;
433     return(resources[j].Identifier());
434   }
435   return(0);
436 }
437
438 //
439 // returns 1 if datagrid element indicated by metric#, resource#
440 // contains histogram values, otherwise returns false
441 //
442 int visi_DataGrid::Valid(int metric, 
443                          int resource){
444
445   if((metric < 0) || (metric >= numMetrics)){
446     return(ERROR_INT);
447   }
448   return(data_values[metric].Valid(resource));
449
450 }
451
452 //
453 // invalidates data_grid element indicated by metric#, resource#
454 // sets valid to 0 and frees histogram space 
455 //
456 int visi_DataGrid::Invalidate(int metric,
457                               int resource){
458
459   if((metric < 0) || (metric >= numMetrics)){
460     return(ERROR_INT);
461   }
462   return(data_values[metric].Invalidate(resource));
463
464 }
465
466
467 //
468 // adds a new set of resources to the data grid
469 //
470 int visi_DataGrid::AddNewResource(int howmany,visi_resourceType *rlist){
471
472 Resource *temp;
473 int i,ok;
474
475   // add new values to resource list
476   temp = resources;
477   resources = new Resource[numResources + howmany];
478
479   for(i = 0; i < numResources; i++){
480       resources[i] = Resource(temp[i].Name(),temp[i].Identifier());
481   }
482   for(i = numResources; i < (numResources + howmany); i++){
483       resources[i] = Resource(rlist[i-numResources].name,
484                           rlist[i-numResources].Id);
485   }
486
487   numResources += howmany;
488
489   // add space to data grid for new resources
490   for(i = 0; i < numMetrics; i++){
491       if((ok = data_values[i].AddNewResources(howmany)) != OK){
492           delete[] temp;
493           temp = 0;
494           return(ok); 
495       }
496   }
497
498   delete[] temp;
499   temp = 0;
500   return(OK);
501 }
502
503
504 //
505 //  adds a new set of resources to the data grid
506 //
507 int visi_DataGrid::AddNewMetrics(int howmany,visi_metricType *mlist){
508
509 visi_GridHistoArray *tempdata;
510 Metric *temp;
511 int i;
512
513   // add new values to metric list
514   temp = metrics;
515   metrics = new Metric[numMetrics + howmany];
516
517   for(i = 0; i < numMetrics; i++){
518     metrics[i] = Metric(temp[i].Units(),temp[i].Name(),
519                       temp[i].Identifier(),temp[i].Aggregate(),
520                       temp[i].UnitsType());
521   }
522   for(i = numMetrics; i < (numMetrics + howmany); i++){
523     metrics[i] = Metric(mlist[i-numMetrics].units, mlist[i-numMetrics].name,
524                        mlist[i-numMetrics].Id, mlist[i-numMetrics].aggregate,
525                        mlist[i-numMetrics].unitstype);
526   }
527
528
529   // add space to data grid for new metrics
530
531   tempdata = data_values;
532   data_values = new visi_GridHistoArray[numMetrics + howmany];
533
534   for(i=0; i < numMetrics; i++){
535     if(data_values[i].AddNewValues(tempdata[i].Value(),tempdata[i].Size())
536        != OK){
537        return(ERROR_INT); 
538     }
539   }
540
541   for(i=numMetrics; i < (numMetrics + howmany); i++){
542       visi_GridHistoArray *temp = new visi_GridHistoArray(numResources);
543       data_values[i] = *temp;
544       delete temp;
545   }
546
547   numMetrics += howmany;
548   tempdata = 0;
549   temp = 0;
550   return(OK);
551
552 }
553
554
555 //
556 //  returns 1 if metric with Id equal to test_id is in the data grid
557 //
558 int visi_DataGrid::MetricInGrid(u_int test_id){
559
560   for(int i = 0; i < numMetrics; i++){
561     if (test_id == metrics[i].Identifier()){
562       return(1);
563     }
564   }
565   return(0);
566 }
567
568
569 //
570 //  returns 1 if resource with Id equal to test_id is in the data grid
571 //
572 int visi_DataGrid::ResourceInGrid(u_int test_id){
573
574   for(int i = 0; i < numResources; i++){
575     if (test_id == resources[i].Identifier()){
576       return(1);
577     }
578   }
579   return(0);
580 }
581
582 int phaseCompare(const void *p1, const void *p2) {
583    const PhaseInfo *ph1 = *((const PhaseInfo **)p1);
584    const PhaseInfo *ph2 = *((const PhaseInfo **)p2);
585    return(ph1->getPhaseHandle() - ph2->getPhaseHandle());
586 }
587
588 void visi_DataGrid::AddNewPhase(int handle, visi_timeType start, visi_timeType end,
589                       visi_timeType width, string name){
590     PhaseInfo *p = new PhaseInfo(handle,start,end,width,name.string_of());
591     phases += p;
592     phases.sort(phaseCompare);
593
594 }
595