changes to support phase interface
[dyninst.git] / paradyn / src / VISIthread / VISIthreadpublic.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: VISIthreadpublic.C,v $
17 /* Revision 1.11  1995/08/01 02:18:44  newhall
18 /* changes to support phase interface
19 /*
20  * Revision 1.10  1995/06/02  20:54:36  newhall
21  * made code compatable with new DM interface
22  * replaced List templates  with STL templates
23  *
24  * Revision 1.9  1995/02/26  02:08:37  newhall
25  * added some of the support for the phase interface
26  * fix so that the vector of data values are being
27  * correctly filled before call to BulkDataTransfer
28  *
29  * Revision 1.8  1995/02/16  19:10:59  markc
30  * Removed start slash from comments
31  * Removed start slash from comments
32  *
33  * Revision 1.7  1995/02/16  08:22:32  markc
34  * Changed Boolean to bool
35  * Changed wait loop code for igen messages - check for buffered messages
36  * Changed char igen-array code to use strings/vectors for igen functions
37  *
38  * Revision 1.6  1995/01/26  17:59:14  jcargill
39  * Changed igen-generated include files to new naming convention; fixed
40  * some bugs compiling with gcc-2.6.3.
41  *
42  * Revision 1.5  1995/01/05  19:23:14  newhall
43  * changed the size of the data buffer to be proportional
44  * to the number of enabled metric/focus pairs.
45  *
46  * Revision 1.4  1994/11/04  06:41:05  newhall
47  * removed printfs
48  *
49  * Revision 1.3  1994/09/25  01:52:10  newhall
50  * updated to support the changes to the  visi, UI and VM interfaces having
51  * to do with a new representation of metric/focus lists as a list of
52  * metric/focus pairs.
53  *
54  * Revision 1.2  1994/09/22  01:20:20  markc
55  * Changed "String" to "char*"
56  *
57  * Revision 1.1  1994/08/13  20:52:40  newhall
58  * changed when a visualization process is started
59  * added new file VISIthreadpublic.C
60  * */
61 /////////////////////////////////////////////////////////////////////
62 // * visualizationUser routines:  GetMetricResource, StartPhase
63 //              StopMetricResource 
64 // * VISIthread server routines:  VISIKillVisi
65 /////////////////////////////////////////////////////////////////////
66 #include <signal.h>
67 #include <math.h>
68 #include "thread/h/thread.h"
69 #include "util/h/list.h"
70 #include "util/h/rpcUtil.h"
71 #include "VM.thread.CLNT.h"
72 #include "UI.thread.CLNT.h"
73 #include "dataManager.thread.CLNT.h"
74 #include "visi.xdr.CLNT.h"
75 #include "VISIthread.thread.SRVR.h"
76 #include "../VMthread/VMtypes.h"
77 #include "VISIthreadTypes.h"
78 #include "../pdMain/paradyn.h"
79 #include "dyninstRPC.xdr.CLNT.h"
80 #include "../DMthread/DMinclude.h"
81 #define  ERROR_MSG(s1, s2) \
82          uiMgr->showError(s1,s2); 
83
84 //////////////////////////////////////////////////
85 // VISIKillVisi:  VISIthread server routine 
86 //
87 //  called from VisiMgr, kills the visualization 
88 //  process and sets thread local variable "quit"
89 //  so that the VISIthread will die 
90 //////////////////////////////////////////////////
91  void VISIthread::VISIKillVisi(){
92
93  VISIthreadGlobals *ptr;
94
95   if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
96     PARADYN_DEBUG(("thr_getspecific in VISIthread::VISIKillVisi"));
97     ERROR_MSG(13,"thr_getspecific in VISIthread::VISIKillVisi");
98     return;
99   }
100
101   ptr->quit = 1;
102
103 }
104
105 void visualizationUser::GetPhaseInfo(){
106
107  VISIthreadGlobals *ptr;
108
109  PARADYN_DEBUG(("in visualizationUser::GetPhaseInfo"));
110  if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
111     PARADYN_DEBUG(("thr_getspecific in visiUser::GetPhaseInfo"));
112     ERROR_MSG(13,"thr_getspecific in VISIthread::GetPhaseInfo");
113     return;
114  }
115
116  vector<T_visi::phase_info> *phases = ptr->dmp->getAllPhaseInfo();
117  if((ptr->currPhaseHandle == -1) && (phases->size() > 0)){
118       ptr->currPhaseHandle = (*phases)[(phases->size() -1)].handle;
119  }
120
121  ptr->visip->PhaseData(*phases);
122  delete phases;
123
124 }
125
126
127
128 //////////////////////////////////////////////////////////////////////
129 //  GetMetricResource: visualizationUser routine (called by visi process)
130 //  input: string of metric names, string of focus names, type of data
131 //         (0: histogram, 1: scalar) currently only 0 supported
132 //
133 // check if metric and resource lists have wild card chars 
134 // if so request metrics and resources form UIM (currently, the
135 // only option), else make enable data collection call to DM for each
136 // metric resource pair
137 //////////////////////////////////////////////////////////////////////
138 void visualizationUser::GetMetricResource(string mets_res,
139                                           int numElements,
140                                           int type){
141  VISIthreadGlobals *ptr;
142
143 PARADYN_DEBUG(("in visualizationUser::GetMetricResource"));
144  if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
145     PARADYN_DEBUG(("thr_getspecific in visiUser::GetMetricResource"));
146     ERROR_MSG(13,"thr_getspecific in VISIthread::GetMetricResource");
147     return;
148  }
149  // TODO: parse the mets_res list
150  // if not empty and no wild cards convert mets_res to list of 
151  // metrespairs representation and call VISIthreadchooseMetRes routine
152
153  // otherwise initiate menuing request
154  ptr->ump->chooseMetricsandResources((chooseMandRCBFunc)VISIthreadchooseMetRes,
155                                      NULL);
156 }
157
158
159 //////////////////////////////////////////////////////////////////////
160 //  StopMetricResource: visualizationUser routine (called by visi process)
161 //  input: metric and resource Ids 
162 //
163 //  if metricId and resourceId are valid, make disable data collection
164 //  call to dataManager for the pair, and remove the associated metric
165 //  instance from the threads local mrlist
166 //////////////////////////////////////////////////////////////////////
167 void visualizationUser::StopMetricResource(u_int metricId,
168                                            u_int resourceId){
169
170   VISIthreadGlobals *ptr;
171   if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
172     PARADYN_DEBUG(("thr_getspecific in visualizationUser::StopMetricResource"));
173     ERROR_MSG(13,"thr_getspecific in VISIthread::StopMetricResource");
174     return;
175   }
176
177
178   // search metricList for matching metricId and resourceId
179   // if found request DM to disable data collection of metricInstance
180   unsigned size = ptr->mrlist.size();
181   for (unsigned i=0; i < size; i++){
182       if(( ptr->mrlist[i]->m_id == metricId) && 
183           (ptr->mrlist[i]->r_id == resourceId)){
184           PARADYN_DEBUG(("in visualizationUser::StopMetricResource: mi found"));
185           metricInstanceHandle mi_handle = ptr->mrlist[i]->mi_id;
186           // make disable request to DM
187           ptr->dmp->disableDataCollection(ptr->ps_handle,mi_handle,
188                                           ptr->args->phase_type);
189           // remove mi from mrlist
190           ptr->mrlist[i] = ptr->mrlist[size - 1];
191           ptr->mrlist.resize(size - 1);
192           ptr->maxBufferSize--;
193           assert(ptr->maxBufferSize >= 0);
194           return;
195       }
196       PARADYN_DEBUG(("current list element: metId = %d resId = %d",
197                      ptr->mrlist[i]->m_id,ptr->mrlist[i]->r_id));
198   }
199
200 #ifdef DEBUG
201   PARADYN_DEBUG(("visualizationUser::StopMetricResource: mi not found\n"));
202   PARADYN_DEBUG(("metricId = %d resourceId = %d\n",metricId,resourceId));
203 #endif
204 }
205
206
207
208 ///////////////////////////////////////////////////////////////////
209 //  StartPhase: visualizationUser routine (called by visi process)
210 //  input: name of phase, begining and ending timestamp for phase 
211 //
212 //  not currently implemented
213 ///////////////////////////////////////////////////////////////////
214 void visualizationUser::StartPhase(double begin,
215                                    string name){
216
217  VISIthreadGlobals *ptr;
218
219   if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
220     PARADYN_DEBUG(("thr_getspecific in visualizationUser::PhaseName"));
221     ERROR_MSG(13,"thr_getspecific in VISIthread::PhaseName");
222     return;
223   }
224
225   // call datamanager start phase routine
226   ptr->dmp->StartPhase((timeStamp)-1.0, NULL);
227
228 }
229