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