changed all floats to double
[dyninst.git] / visi / src / visualization.C
1 /* $Log: visualization.C,v $
2 /* Revision 1.4  1994/03/26 04:19:49  newhall
3 /* changed all floats to double
4 /* fix problem with null string returned for first resource name
5 /*
6  * Revision 1.3  1994/03/17  05:23:09  newhall
7  * changed eventCallbacks type, and the constraints on triggering the
8  * callback routine associated with the DATAVALUES event
9  *
10  * Revision 1.2  1994/03/14  20:28:55  newhall
11  * changed visi subdirectory structure
12  *  */ 
13 #include "visi/h/visualization.h"
14 /* #define DEBUG */
15
16 visi_DataGrid  dataGrid;
17 visi_MRList    metricList;
18 visi_MRList    resourceList;
19 int            LastBucketSent = -1;
20 int fileDesc[FILETABLESIZE];
21 int (*fileDescCallbacks[FILETABLESIZE])();
22 int (*eventCallbacks[EVENTSIZE])(int);
23 int initDone = 0;
24
25 visualization *vp;
26 int visi_callback(){
27   return(vp->mainLoop());
28 }
29
30 // paradyn initialization routine connects to parent socket,
31 // and registers the visualization::mainLoop routine as callback
32 // on events on fileDesc[0], argv contains initial parameters to 
33 // visualization: metriclist, resourcelist 
34 int VisiInit(){
35
36 int i;
37
38   for(i=0;i<FILETABLESIZE;i++){
39     fileDescCallbacks[i] = NULL;
40     fileDesc[i] = -1;
41   }
42   for(i=0;i<EVENTSIZE;i++){
43     eventCallbacks[i] = NULL;
44   }
45
46   vp = new visualization(0, NULL, NULL);
47   fileDesc[0] = 0;
48   fileDescCallbacks[0] = visi_callback;
49   initDone = 1;
50
51   return(fileDesc[0]);
52 }
53
54 int StartVisi(int argc,char *argv[]){
55
56   if(!initDone)
57     VisiInit();
58
59   // call GetMetricResources with initial metric resource lists
60   if(argc >= 3)
61    vp->GetMetricResource(argv[1],argv[2],0);
62   else
63    vp->GetMetricResource(" "," ",0);
64   return(OK);
65
66 }
67
68
69 // registration callback routine for paradyn events
70 // sets eventCallbacks[event] to callback routine provided by user
71 int RegistrationCallback(msgTag event,int (*callBack)(int)){
72   if((event >= 0) && (event < EVENTSIZE)){
73     eventCallbacks[event] = callBack;
74     return(OK);
75   }
76   else{
77     visi_ErrorHandler(ERROR_SUBSCRIPT,"error in RegistrationCallback");
78     return(ERROR_SUBSCRIPT);
79   }
80 }
81
82 // fd registration and callback routine registration for user
83 // to register callback routines when they use the provided main routine
84 int RegFileDescriptors(int *fd, int (*callBack)()){
85   return(OK);
86 }
87
88
89
90 void visualization::Data(dataValue_Array data){
91
92 int *metricIds, *resourceIds;
93 int noMetrics, noResources;
94 int i,j,metric,ok;
95 int temp,min,max;
96
97
98   if(!initDone)
99     VisiInit();
100   noMetrics = dataGrid.NumMetrics();
101   noResources = dataGrid.NumResources();
102   if((metricIds = (int *)malloc(sizeof(int)*noMetrics)) == NULL){
103       visi_ErrorHandler(ERROR_MALLOC,"error in malloc in visi::Data()");
104   }
105   if((resourceIds = (int *)malloc(sizeof(int)*noResources)) == NULL){
106     visi_ErrorHandler(ERROR_MALLOC,"error in malloc in visi::Data()");
107   }
108
109   for(i=0; i < noMetrics; i++){
110      metricIds[i] = dataGrid.MetricId(i);
111   }
112
113   for(i=0; i < noResources; i++){
114     resourceIds[i] = dataGrid.ResourceId(i);
115   }
116
117   for(i=0; i < data.count; i++){
118
119    // find metric and resource index into dataGrid and add value if found
120    for(j=0;(j<noMetrics)&&(data.data[i].metricId!=metricIds[j]);j++) ;
121    metric = j;
122    for(j=0;(j<noResources)&&(data.data[i].resourceId!=resourceIds[j]);j++) ;
123    if((j<noResources) && (metric < noMetrics)){
124      dataGrid.AddValue(metric,j,data.data[i].bucketNum,data.data[i].data);
125    }
126
127   } 
128   min = max = dataGrid.NumBins()+1;
129   for(i=0; i < noMetrics; i++){
130     for(j=0; j < noResources; j++){
131       if(dataGrid.Valid(i,j)){
132         temp = dataGrid.LastBucketFilled(i,j);  
133         if((temp >= -1) && (temp < min))
134           min = temp; 
135 #ifdef DEBUG
136   fprintf(stderr,"@@@ in visualization::datagrid(%d,%d).LastBucketFilled =  %d\n",i,j,temp);
137 #endif
138       }
139     }
140   }
141
142 #ifdef DEBUG
143   fprintf(stderr,"@@@ in visualization::Data min = %d LastBucketSent = %d\n",min,LastBucketSent);
144 #endif
145
146   free(metricIds);
147   free(resourceIds);
148
149   //call user registered callback routine assoc. w/event DATAVALUES
150   if((min > LastBucketSent) && (min != max)&& (eventCallbacks[DATAVALUES] !=  NULL)){
151 #ifdef DEBUG
152   fprintf(stderr,"@@@ before callback on event DATAVALUES in visualization::Data\n");
153 #endif
154      LastBucketSent = min; 
155      ok = eventCallbacks[DATAVALUES](LastBucketSent);
156   }
157 }
158
159
160 void visualization::Fold(double newBucketWidth){
161   
162   int ok;
163
164 #ifdef DEBUG
165   fprintf(stderr,"@@@ visualization::Fold LastBucketSent=%d\n",LastBucketSent);
166 #endif
167
168   if(!initDone)
169     VisiInit();
170   dataGrid.Fold(newBucketWidth);
171   // assume a fold can only occur when datagrid histogram buckets are full
172   LastBucketSent = (dataGrid.NumBins()/2) - 1;
173
174 #ifdef DEBUG
175   fprintf(stderr,"@@@ visualization::Fold LastBucketSent=%d\n",LastBucketSent);
176 #endif
177
178   //call user registered callback routine assoc. w/event FOLD
179   if(eventCallbacks[FOLD] !=  NULL){
180      ok = eventCallbacks[FOLD](0);
181   }
182 }
183
184 void visualization::InvalidMR(int m,int r){
185
186 int i,j;
187 int ok;
188
189   if(!initDone)
190     VisiInit();
191 for(i=0;(i<dataGrid.NumMetrics())&&(m!=dataGrid.MetricId(i));i++) ;
192 for(j=0;(j<dataGrid.NumResources())&&(r!=dataGrid.ResourceId(j));j++);
193 ok = dataGrid.Invalidate(i,j);
194
195 //call callback routine assoc. w/event INVALIDMETRICSRESOURCES 
196 if(eventCallbacks[INVALIDMETRICSRESOURCES] !=  NULL){
197    ok = eventCallbacks[INVALIDMETRICSRESOURCES](0);
198 }
199 }
200
201 void visualization::AddMetricsResources(metricType_Array metrics,resourceType_Array resources,double bucketWidth,int nobuckets){
202   int ok;
203 #ifdef DEBUG
204   int i;
205 #endif
206
207   if(!initDone)
208     VisiInit();
209
210   // construct new dataGrid
211   if(!dataGrid.NumMetrics()){
212     //construct metric, resource lists
213     metricList.visi_MRList(metrics.count,metrics.data);
214     resourceList.visi_MRList(resources.count,resources.data);
215
216     // construct new dataGrid 
217     dataGrid.visi_DataGrid(metrics.count,resources.count,metrics.data,resources.data,nobuckets,bucketWidth);
218   }
219   else{
220     // add elements to existing data grid
221     // not supported yet
222 #ifdef DEBUG
223     fprintf(stderr,"@@@AddMetricsResources to existing datagrid is not supported");
224 #endif
225   }
226   //call callback routine assoc. w/event ADDMETRICSRESOURCES 
227   if(eventCallbacks[ADDMETRICSRESOURCES] !=  NULL){
228      ok = eventCallbacks[ADDMETRICSRESOURCES](0);
229   }
230 }
231
232 void visualization::NewMetricsResources(metricType_Array metrics,resourceType_Array resources){
233 int ok; 
234
235
236   if(!initDone)
237     VisiInit();
238   //call callback routine assoc. w/event NEWMETRICSRESOURCES
239   if(eventCallbacks[NEWMETRICSRESOURCES] !=  NULL){
240      ok = eventCallbacks[NEWMETRICSRESOURCES](0);
241   }
242 }
243
244 void visualization::Phase(double begin,double end,String name){
245
246 int size,ok;
247
248   if(!initDone)
249     VisiInit();
250    size = strlen(name);
251    
252   //call callback routine assoc. w/event PHASENAME
253   if(eventCallbacks[PHASENAME] !=  NULL){
254      ok = eventCallbacks[PHASENAME](0);
255   }
256 }
257