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