bug fix to VISIthreadchooseMetRes to check for 'Cancel' case. removed warnings
[dyninst.git] / paradyn / src / VISIthread / VISIthreadpublic.C
1 /*
2  * Copyright (c) 1996 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 /////////////////////////////////////////////////////////////////////
43 // * visualizationUser routines:  GetMetricResource, StartPhase
44 //              StopMetricResource 
45 // * VISIthread server routines:  VISIKillVisi
46 /////////////////////////////////////////////////////////////////////
47 #include <signal.h>
48 #include <math.h>
49 #include "thread/h/thread.h"
50 #include "util/h/list.h"
51 #include "util/h/rpcUtil.h"
52 #include "VM.thread.CLNT.h"
53 #include "UI.thread.CLNT.h"
54 #include "dataManager.thread.CLNT.h"
55 #include "visi.xdr.CLNT.h"
56 #include "VISIthread.thread.SRVR.h"
57 #include "../VMthread/VMtypes.h"
58 #include "VISIthreadTypes.h"
59 #include "../pdMain/paradyn.h"
60 #include "dyninstRPC.xdr.CLNT.h"
61 #include "../DMthread/DMinclude.h"
62 #define  ERROR_MSG(s1, s2) \
63          uiMgr->showError(s1,s2); 
64
65 //////////////////////////////////////////////////
66 // VISIKillVisi:  VISIthread server routine 
67 //
68 //  called from VisiMgr, kills the visualization 
69 //  process and sets thread local variable "quit"
70 //  so that the VISIthread will die 
71 //////////////////////////////////////////////////
72  void VISIthread::VISIKillVisi(){
73
74  VISIthreadGlobals *ptr;
75
76   if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
77     PARADYN_DEBUG(("thr_getspecific in VISIthread::VISIKillVisi"));
78     ERROR_MSG(13,"thr_getspecific in VISIthread::VISIKillVisi");
79     return;
80   }
81
82   ptr->quit = 1;
83
84 }
85
86 void visualizationUser::GetPhaseInfo(){
87
88  VISIthreadGlobals *ptr;
89
90  PARADYN_DEBUG(("in visualizationUser::GetPhaseInfo"));
91  if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
92     PARADYN_DEBUG(("thr_getspecific in visiUser::GetPhaseInfo"));
93     ERROR_MSG(13,"thr_getspecific in VISIthread::GetPhaseInfo");
94     return;
95  }
96
97  vector<T_visi::phase_info> *phases = ptr->dmp->getAllPhaseInfo();
98  if((ptr->currPhaseHandle == -1) && (phases->size() > 0)){
99       ptr->currPhaseHandle = (*phases)[(phases->size() -1)].handle;
100  }
101
102  ptr->visip->PhaseData(*phases);
103  delete phases;
104
105 }
106
107
108
109 //////////////////////////////////////////////////////////////////////
110 //  GetMetricResource: visualizationUser routine (called by visi process)
111 //  input: string of metric names, string of focus names, type of data
112 //         (0: histogram, 1: scalar) currently only 0 supported
113 //
114 // check if metric and resource lists have wild card chars 
115 // if so request metrics and resources form UIM (currently, the
116 // only option), else make enable data collection call to DM for each
117 // metric resource pair
118 //////////////////////////////////////////////////////////////////////
119 void visualizationUser::GetMetricResource(string,int,int){
120  VISIthreadGlobals *ptr;
121
122 PARADYN_DEBUG(("in visualizationUser::GetMetricResource"));
123  if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
124     PARADYN_DEBUG(("thr_getspecific in visiUser::GetMetricResource"));
125     ERROR_MSG(13,"thr_getspecific in VISIthread::GetMetricResource");
126     return;
127  }
128  // TODO: parse the mets_res list
129  // if not empty and no wild cards convert mets_res to list of 
130  // metrespairs representation and call VISIthreadchooseMetRes routine
131
132  // otherwise initiate menuing request
133  ptr->ump->chooseMetricsandResources((chooseMandRCBFunc)VISIthreadchooseMetRes,
134                                      NULL);
135 }
136
137 extern void flush_buffer_if_nonempty(VISIGlobalsStruct *);
138 //////////////////////////////////////////////////////////////////////
139 //  StopMetricResource: visualizationUser routine (called by visi process)
140 //  input: metric and resource Ids 
141 //
142 //  if metricId and resourceId are valid, make disable data collection
143 //  call to dataManager for the pair, and remove the associated metric
144 //  instance from the threads local mrlist
145 //////////////////////////////////////////////////////////////////////
146 void visualizationUser::StopMetricResource(u_int metricId,
147                                            u_int resourceId){
148
149   VISIthreadGlobals *ptr;
150   if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
151     PARADYN_DEBUG(("thr_getspecific in visualizationUser::StopMetricResource"));
152     ERROR_MSG(13,"thr_getspecific in VISIthread::StopMetricResource");
153     return;
154   }
155
156
157   // search metricList for matching metricId and resourceId
158   // if found request DM to disable data collection of metricInstance
159   unsigned size = ptr->mrlist.size();
160   for (unsigned i=0; i < size; i++){
161       if(( ptr->mrlist[i].m_id == metricId) && 
162           (ptr->mrlist[i].r_id == resourceId)){
163           PARADYN_DEBUG(("in visualizationUser::StopMetricResource: mi found"));
164           metricInstanceHandle mi_handle = ptr->mrlist[i].mi_id;
165           // make disable request to DM
166           ptr->dmp->disableDataCollection(ptr->ps_handle,mi_handle,
167                                           ptr->args->phase_type);
168
169           // new; avoids losing data when we shrink buffer
170           flush_buffer_if_nonempty(ptr);
171           assert(ptr->buffer_next_insert_index == 0);
172
173           // remove mi from mrlist
174           ptr->mrlist[i] = ptr->mrlist[size - 1];
175           ptr->mrlist.resize(size - 1);
176
177           assert(ptr->buffer.size() > 0);
178           if(ptr->mrlist.size() < ptr->buffer.size()){
179               unsigned newMaxBufferSize = ptr->buffer.size() - 1;
180               ptr->buffer.resize(newMaxBufferSize);
181               ptr->traceBuffer.resize(10);
182           }
183           return;
184       }
185       PARADYN_DEBUG(("current list element: metId = %d resId = %d",
186                      ptr->mrlist[i].m_id,ptr->mrlist[i].r_id));
187   }
188   if(!size)
189        ptr->traceBuffer.resize(0);
190
191 #ifdef DEBUG
192   PARADYN_DEBUG(("visualizationUser::StopMetricResource: mi not found\n"));
193   PARADYN_DEBUG(("metricId = %d resourceId = %d\n",metricId,resourceId));
194 #endif
195 }
196
197 //
198 // showError: visualizationUser routine called by a visi process to
199 // display error messages
200 //
201 void visualizationUser::showError(int code, string msg)
202 {
203   uiMgr->showError(code,P_strdup(msg.string_of()));
204 }
205
206 ///////////////////////////////////////////////////////////////////
207 //  StartPhase: visualizationUser routine (called by visi process)
208 //  input: name of phase, begining and ending timestamp for phase 
209 //
210 //  not currently implemented
211 ///////////////////////////////////////////////////////////////////
212 void visualizationUser::StartPhase(double, string,
213                                    bool withPerfConsult,
214                                    bool withVisis) {
215
216  VISIthreadGlobals *ptr;
217
218   if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
219     PARADYN_DEBUG(("thr_getspecific in visualizationUser::PhaseName"));
220     ERROR_MSG(13,"thr_getspecific in VISIthread::PhaseName");
221     return;
222   }
223
224   // call datamanager start phase routine
225   ptr->dmp->StartPhase((timeStamp)-1.0, NULL, withPerfConsult, withVisis);
226 }