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