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