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