changed when a visualization process is started
[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.1  1994/08/13 20:52:40  newhall
18 /* changed when a visualization process is started
19 /* added new file VISIthreadpublic.C
20 /* */
21 /////////////////////////////////////////////////////////////////////
22 // * visualizationUser routines:  GetMetricResource, PhaseName
23 //              StopMetricResource
24 // * VISIthread server routines:  VISIKillVisi
25 /////////////////////////////////////////////////////////////////////
26 #include <signal.h>
27 #include <math.h>
28 #include "thread/h/thread.h"
29 #include "util/h/list.h"
30 #include "util/h/rpcUtil.h"
31 #include "VM.CLNT.h"
32 #include "UI.CLNT.h"
33 #include "dataManager.CLNT.h"
34 #include "visi.CLNT.h"
35 #include "VISIthread.SRVR.h"
36 #include "../VMthread/VMtypes.h"
37 #include "VISIthreadTypes.h"
38 #include "../pdMain/paradyn.h"
39 #include "dyninstRPC.CLNT.h"
40 #include "../DMthread/DMinternals.h"
41 #define  ERROR_MSG(s1, s2) \
42          uiMgr->showError(s1,s2); \
43          printf("error# %d: %s\n",s1,s2); 
44
45 //////////////////////////////////////////////////
46 // VISIKillVisi:  VISIthread server routine 
47 //
48 //  called from VisiMgr, kills the visualization 
49 //  process and sets thread local variable "quit"
50 //  so that the VISIthread will die 
51 //////////////////////////////////////////////////
52  void VISIthread::VISIKillVisi(){
53
54  VISIthreadGlobals *ptr;
55
56   if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
57     PARADYN_DEBUG(("thr_getspecific in VISIthread::VISIKillVisi"));
58     ERROR_MSG(13,"thr_getspecific in VISIthread::VISIKillVisi");
59     return;
60   }
61
62   ptr->quit = 1;
63
64 }
65
66
67 //////////////////////////////////////////////////////////////////////
68 //  GetMetricResource: visualizationUser routine (called by visi process)
69 //  input: string of metric names, string of focus names, type of data
70 //         (0: histogram, 1: scalar) currently only 0 supported
71 //
72 // check if metric and resource lists have wild card chars 
73 // if so request metrics and resources form UIM (currently, the
74 // only option), else make enable data collection call to DM for each
75 // metric resource pair
76 //////////////////////////////////////////////////////////////////////
77 void visualizationUser::GetMetricResource(String metric,
78                                           String resource,
79                                           int type){
80  VISIthreadGlobals *ptr;
81
82 PARADYN_DEBUG(("in visualizationUser::GetMetricResource"));
83  if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
84     PARADYN_DEBUG(("thr_getspecific in visiUser::GetMetricResource"));
85     ERROR_MSG(13,"thr_getspecific in VISIthread::GetMetricResource");
86     return;
87  }
88  ptr->ump->chooseMetricsandResources((chooseMandRCBFunc)VISIthreadchooseMetRes,NULL,0,NULL);
89 }
90
91
92 //////////////////////////////////////////////////////////////////////
93 //  StopMetricResource: visualizationUser routine (called by visi process)
94 //  input: metric and resource Ids 
95 //
96 //  if metricId and resourceId are valid, make disable data collection
97 //  call to dataManager for the pair, and remove the associated metric
98 //  instance from the threads local mrlist
99 //////////////////////////////////////////////////////////////////////
100 void visualizationUser::StopMetricResource(int metricId,
101                                            int resourceId){
102  VISIthreadGlobals *ptr;
103  metricInstance *listItem;
104  int found = 0;
105  List<metricInstance*> walk;
106
107   if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
108     PARADYN_DEBUG(("thr_getspecific in visualizationUser::StopMetricResource"));
109     ERROR_MSG(13,"thr_getspecific in VISIthread::StopMetricResource");
110     return;
111   }
112
113
114   // search metricList for matching metricId and resourceId
115   // if found request DM to disable data collection of metricInstance
116
117   found = 0;
118   for (walk = *ptr->mrlist; listItem=*walk; walk++) {
119     if ((listItem->met == (metric*) metricId) &&
120         (listItem->focus->getCanonicalName() == (char*) resourceId)) {
121       found = 1;
122       break;
123     }
124       PARADYN_DEBUG(("current list element: metId = %d resId = %d",
125                      (int)listItem->met,(int)listItem->focus));
126   }
127
128 #ifdef DEBUG
129     if(found){
130      PARADYN_DEBUG(("in visualizationUser::StopMetricResource: mi found"));
131     }
132     else{
133      PARADYN_DEBUG(("visualizationUser::StopMetricResource: mi not found\n"));
134      PARADYN_DEBUG(("metricId = %d resourceId = %d\n",metricId,resourceId));
135     }
136 #endif
137
138     if(found){
139       //make disable request to DM and remove this metric instance from list
140       ptr->dmp->disableDataCollection(ptr->perStream,listItem);
141       if(!(ptr->mrlist->remove(listItem))){
142         perror("ptr->mrlist->remove"); 
143         ERROR_MSG(16,"remove() in StopMetricResource()");
144         ptr->quit = 1;
145         return;
146       }
147     }
148 }
149
150
151
152 ///////////////////////////////////////////////////////////////////
153 //  PhaseName: visualizationUser routine (called by visi process)
154 //  input: name of phase, begining and ending timestamp for phase 
155 //
156 //  not currently implemented
157 ///////////////////////////////////////////////////////////////////
158 void visualizationUser::PhaseName(double begin,
159                                   double end,
160                                   String name){
161
162  VISIthreadGlobals *ptr;
163
164   if (thr_getspecific(visiThrd_key, (void **) &ptr) != THR_OKAY) {
165     PARADYN_DEBUG(("thr_getspecific in visualizationUser::PhaseName"));
166     ERROR_MSG(13,"thr_getspecific in VISIthread::PhaseName");
167     return;
168   }
169
170 }
171