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