added visi_PrintDataBuckets, changed the way data grid constructors are called
[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     data_values[i] = visi_GridHistoArray(noResources);
264   numBins  = noBins;
265   binWidth = width;
266   start_time = startTime;
267   phase_handle = phaseHandle;
268
269 }
270
271
272 //
273 // DataGrid constructor: creates metric and 
274 // resource lists and empty datagrid
275 //
276 visi_DataGrid::visi_DataGrid(int noMetrics,
277                              int noResources,
278                              visi_metricType *metricList,
279                              visi_resourceType *resourceList,
280                              int noBins,
281                              visi_timeType width,
282                              visi_timeType startTime,
283                              int phaseHandle){
284 int i;
285
286   numMetrics   = noMetrics;
287   numResources = noResources;
288   metrics      = new Metric[noMetrics];
289   resources    = new Resource[noResources];
290
291   for(i = 0; i < noMetrics; i++){
292     metrics[i] = Metric(metricList[i].units,metricList[i].name,
293                       metricList[i].Id,metricList[i].aggregate,
294                       metricList[i].unitstype);
295   }
296   for(i = 0; i < noResources; i++){
297     resources[i] = Resource(resourceList[i].name,resourceList[i].Id);
298   }
299   data_values = new visi_GridHistoArray[noMetrics];
300   for (i = 0; i < noMetrics; i++)
301     data_values[i] = visi_GridHistoArray(noResources);
302   numBins  = noBins;
303   binWidth = width;
304   start_time = startTime;
305   phase_handle = phaseHandle;
306
307 }
308
309
310
311 //
312 //  DataGrid destructor 
313 //
314 visi_DataGrid::~visi_DataGrid(){
315
316   delete[] resources;
317   delete[] metrics;
318   delete[] data_values;
319 }
320
321 const char *visi_DataGrid::GetMyPhaseName(){
322
323     if (phase_handle == -1) return ("Global");
324     if (phase_handle >= 0){
325         for(unsigned i = 0; i < phases.size(); i++){
326             if(phase_handle == (int)phases[i]->getPhaseHandle()){
327                 return phases[i]->getName();
328     }}}
329     return 0;
330 }
331
332 // 
333 // returns metric name for metric number i 
334 //
335 const char   *visi_DataGrid::MetricName(int i){
336   if((i < numMetrics) && (i>=0))
337     return(metrics[i].Name());
338   return(0);
339 }
340
341 // 
342 // returns metric units for metric number i 
343 //
344 const char *visi_DataGrid::MetricUnits(int i){
345
346   if((i < numMetrics) && (i>=0))
347     return(metrics[i].Units());
348   return(0);
349 }
350
351 // 
352 // returns metric label for data values 
353 //
354 const char *visi_DataGrid::MetricLabel(int i){
355
356   if((i < numMetrics) && (i>=0)){
357     return(metrics[i].Label());
358   }
359   return(0);
360 }
361
362 // 
363 // returns metric label for AVE aggregation over data buckets 
364 //
365 const char *visi_DataGrid::MetricAveLabel(int i){
366
367   if((i < numMetrics) && (i>=0)) {
368     return(metrics[i].AveLabel());
369   }
370   return(0);
371 }
372
373 // 
374 // returns metric label for SUM aggregation over data buckets 
375 //
376 const char *visi_DataGrid::MetricSumLabel(int i){
377
378   if((i < numMetrics) && (i>=0)) {
379     return(metrics[i].SumLabel());
380   }
381   return(0);
382 }
383
384 // 
385 // returns resource name for resource number j 
386 //
387 const char     *visi_DataGrid::ResourceName(int j){
388
389   if((j < numResources) && (j>=0))
390     return(resources[j].Name());
391   return(0);
392 }
393
394
395 // 
396 //  returns fold method for metric i 
397 //
398 int  visi_DataGrid::FoldMethod(int i){
399
400   if((i < numMetrics) && (i >= 0))
401     return(metrics[i].Aggregate());
402   return(ERROR_INT);
403
404 }
405
406 // 
407 // returns metric identifier associated with metric number i 
408 //
409 u_int  visi_DataGrid::MetricId(int i,bool &error){
410
411   error = true;
412   if((i < numMetrics) && (i >= 0)){
413     error = false;
414     return (metrics[i].Identifier());
415   }
416   return(0);
417 }
418
419 // 
420 // returns resource identifier associated with resource number j 
421 //
422 u_int  visi_DataGrid::ResourceId(int j, bool &error){
423
424   error = true;
425   if((j < numResources) && (j >= 0)){
426     error = false;
427     return(resources[j].Identifier());
428   }
429   return(0);
430 }
431
432 //
433 // returns 1 if datagrid element indicated by metric#, resource#
434 // contains histogram values, otherwise returns false
435 //
436 int visi_DataGrid::Valid(int metric, 
437                          int resource){
438
439   if((metric < 0) || (metric >= numMetrics)){
440     return(ERROR_INT);
441   }
442   return(data_values[metric].Valid(resource));
443
444 }
445
446 //
447 // invalidates data_grid element indicated by metric#, resource#
448 // sets valid to 0 and frees histogram space 
449 //
450 int visi_DataGrid::Invalidate(int metric,
451                               int resource){
452
453   if((metric < 0) || (metric >= numMetrics)){
454     return(ERROR_INT);
455   }
456   return(data_values[metric].Invalidate(resource));
457
458 }
459
460
461 //
462 // adds a new set of resources to the data grid
463 //
464 int visi_DataGrid::AddNewResource(int howmany,visi_resourceType *rlist){
465
466 Resource *temp;
467 int i,ok;
468
469   // add new values to resource list
470   temp = resources;
471   resources = new Resource[numResources + howmany];
472
473   for(i = 0; i < numResources; i++){
474       resources[i] = Resource(temp[i].Name(),temp[i].Identifier());
475   }
476   for(i = numResources; i < (numResources + howmany); i++){
477       resources[i] = Resource(rlist[i-numResources].name,
478                           rlist[i-numResources].Id);
479   }
480
481   numResources += howmany;
482
483   // add space to data grid for new resources
484   for(i = 0; i < numMetrics; i++){
485       if((ok = data_values[i].AddNewResources(howmany)) != OK){
486           delete[] temp;
487           temp = 0;
488           return(ok); 
489       }
490   }
491
492   delete[] temp;
493   temp = 0;
494   return(OK);
495 }
496
497
498 //
499 //  adds a new set of resources to the data grid
500 //
501 int visi_DataGrid::AddNewMetrics(int howmany,visi_metricType *mlist){
502
503 visi_GridHistoArray *tempdata;
504 Metric *temp;
505 int i;
506
507   // add new values to metric list
508   temp = metrics;
509   metrics = new Metric[numMetrics + howmany];
510
511   for(i = 0; i < numMetrics; i++){
512     metrics[i] = Metric(temp[i].Units(),temp[i].Name(),
513                       temp[i].Identifier(),temp[i].Aggregate(),
514                       temp[i].UnitsType());
515   }
516   for(i = numMetrics; i < (numMetrics + howmany); i++){
517     metrics[i] = Metric(mlist[i-numMetrics].units, mlist[i-numMetrics].name,
518                        mlist[i-numMetrics].Id, mlist[i-numMetrics].aggregate,
519                        mlist[i-numMetrics].unitstype);
520   }
521
522
523   // add space to data grid for new metrics
524
525   tempdata = data_values;
526   data_values = new visi_GridHistoArray[numMetrics + howmany];
527
528   for(i=0; i < numMetrics; i++){
529     if(data_values[i].AddNewValues(tempdata[i].Value(),tempdata[i].Size())
530        != OK){
531        return(ERROR_INT); 
532     }
533   }
534
535   for(i=numMetrics; i < (numMetrics + howmany); i++){
536     data_values[i] = visi_GridHistoArray(numResources);
537   }
538
539   numMetrics += howmany;
540   tempdata = 0;
541   temp = 0;
542   return(OK);
543
544 }
545
546
547 //
548 //  returns 1 if metric with Id equal to test_id is in the data grid
549 //
550 int visi_DataGrid::MetricInGrid(u_int test_id){
551
552   for(int i = 0; i < numMetrics; i++){
553     if (test_id == metrics[i].Identifier()){
554       return(1);
555     }
556   }
557   return(0);
558 }
559
560
561 //
562 //  returns 1 if resource with Id equal to test_id is in the data grid
563 //
564 int visi_DataGrid::ResourceInGrid(u_int test_id){
565
566   for(int i = 0; i < numResources; i++){
567     if (test_id == resources[i].Identifier()){
568       return(1);
569     }
570   }
571   return(0);
572 }
573
574 int phaseCompare(const void *p1, const void *p2) {
575    const PhaseInfo *ph1 = *((const PhaseInfo **)p1);
576    const PhaseInfo *ph2 = *((const PhaseInfo **)p2);
577    return(ph1->getPhaseHandle() - ph2->getPhaseHandle());
578 }
579
580 void visi_DataGrid::AddNewPhase(int handle, visi_timeType start, visi_timeType end,
581                       visi_timeType width, string name){
582     PhaseInfo *p = new PhaseInfo(handle,start,end,width,name.string_of());
583     phases += p;
584     phases.sort(phaseCompare);
585
586 }
587