Changed addProcess interface to use reference to string vectors.
[dyninst.git] / paradynd / src / dyninstP.h
1 /*
2  *  Copyright 1993 Jeff Hollingsworth.  All rights reserved.
3  *
4  */
5
6 #ifndef _DYNINSTP_H
7 #define _DYNINSTP_H
8
9 /*
10  * private structures used by the implementation of the instrumentation 
11  *   interface.  modules that use the instrumentation interface should not
12  *   include this file.
13  *  
14  * This file will be empty during the restructuring of the paradyn daemon
15  *
16  * $Log: dyninstP.h,v $
17  * Revision 1.8  1995/02/26 22:45:09  markc
18  * Changed addProcess interface to use reference to string vectors.
19  *
20  * Revision 1.7  1995/02/16  08:53:06  markc
21  * Corrected error in comments -- I put a "star slash" in the comment.
22  *
23  * Revision 1.6  1995/02/16  08:33:10  markc
24  * Changed igen interfaces to use strings/vectors rather than char igen-arrays
25  * Changed igen interfaces to use bool, not Boolean.
26  * Cleaned up symbol table parsing - favor properly labeled symbol table objects
27  * Updated binary search for modules
28  * Moved machine dependnent ptrace code to architecture specific files.
29  * Moved machine dependent code out of class process.
30  * Removed almost all compiler warnings.
31  * Use "posix" like library to remove compiler warnings
32  *
33  * Revision 1.5  1994/11/02  11:04:16  markc
34  * Changed casts to remove compiler warnings.
35  *
36  * Revision 1.4  1994/09/22  01:51:40  markc
37  * Added most of dyninst.h, temporary
38  *
39  * Revision 1.3  1994/08/08  20:13:35  hollings
40  * Added suppress instrumentation command.
41  *
42  * Revision 1.2  1994/02/01  18:46:51  hollings
43  * Changes for adding perfConsult thread.
44  *
45  * Revision 1.1  1994/01/27  20:31:18  hollings
46  * Iinital version of paradynd speaking dynRPC igend protocol.
47  *
48  * Revision 1.6  1993/08/23  23:14:58  hollings
49  * removed unused pid field.
50  *
51  * Revision 1.5  1993/07/13  18:27:00  hollings
52  * new include file syntax.
53  *
54  * Revision 1.4  1993/06/22  19:00:01  hollings
55  * global inst state.
56  *
57  * Revision 1.3  1993/06/08  20:14:34  hollings
58  * state prior to bc net ptrace replacement.
59  *
60  * Revision 1.2  1993/04/27  14:39:21  hollings
61  * signal forwarding and args tramp.
62  *
63  * Revision 1.1  1993/03/19  22:51:05  hollings
64  * Initial revision
65  *
66  *
67  */
68
69 #include "dyninst.h"
70 #include "process.h"
71
72 #include <stdio.h>
73
74 class metric;
75 class metricDefinitionNode;
76 class metricListRec;
77
78 typedef enum { selfTermination, controlTermination } executableType;
79
80 bool isApplicationPaused();
81
82 /* descriptive information about a resource */
83 class resourceInfo {
84  public:
85     string name;                        /* name of actual resource */
86     string fullName;            /* full path name of resource */
87     string abstraction;          /* abstraction name */
88     timeStamp creation;         /* when did it get created */
89 };              
90
91 class resourceListRec {
92     public:
93         resourceListRec() {
94           elements = NULL; count=0; maxItems=0;
95         }
96         resource **elements;            /* actual data in list */
97         int count;                      /* number of items in the list */
98         int maxItems;           /* limit of current array */
99 };
100
101 /* something that data can be collected for */
102 class resource {
103     public:
104         string getName() const { return(info.name); }
105         resource(bool suppress=false)
106           : suppressed(suppress), parent(NULL), handle(NULL), children(NULL) {
107             info.creation = 0.0;
108           }
109
110         bool suppressed;                /* don't collect data about this */
111         resource *parent;               /* parent of this resource */
112         void *handle;           /* handle to resource specific data */
113         resourceListRec *children;      /* children of this resource */
114         resourceInfo info;
115 };
116
117 typedef enum { Trace, Sample } dataType;
118
119 /*
120  * error handler call back.
121  *
122  */
123 typedef int (*errorHandler)(int errno, char *message);
124
125 /*
126  * Define a program to run (this is very tentative!)
127  *
128  *   argv - arguments to command
129  *   envp - environment args, for pvm
130  */
131 int addProcess(vector<string> &argv, vector<string> &envp);
132
133 /*
134  * Find out if an application has been.defines yet.
135  *
136  */
137 bool applicationDefined();
138
139 /*
140  * Start an application running (This starts the actual execution).
141  *  app - an application context from createPerformanceConext.
142  */
143 bool startApplication();
144
145 /*
146  *   Stop all processes associted with the application.
147  *      app - an application context from createPerformanceConext.
148  *
149  * Pause an application (I am not sure about this but I think we want it).
150  *      - Does this force buffered data to be delivered?
151  *      - Does a paused application respond to enable/disable commands?
152  */
153 bool pauseAllProcesses();
154
155 /*
156  * Continue a paused application.
157  *    app - an application context from createPerformanceConext.
158  */
159 bool continueAllProcesses();
160
161
162 /*
163  * Disconnect the tool from the process.
164  *    pause - leave the process in a stopped state.
165  *
166  */
167 bool detachProcess(int pid, bool pause);
168
169 /*
170  * Routines to control data collection.
171  *
172  * resourceList         - a list of resources
173  * metric               - what metric to collect data for
174  *
175  */
176 int startCollecting(resourceListRec*, metric*);
177
178
179 /*
180  * Return the expected cost of collecting performance data for a single
181  *    metric at a given focus.  The value returned is the fraction of
182  *    perturbation expected (i.e. 0.10 == 10% slow down expected).
183  */
184 float guessCost(resourceListRec*, metric*);
185
186 /*
187  * Control information arriving about a resource Classes
188  *
189  * resource             - enable notification of children of this resource
190  */
191 bool enableResourceCreationNotification(resource*);
192
193 /*
194  * Resource utility functions.
195  *
196  */
197 resourceListRec *getRootResources();
198
199 extern resource *rootResource;
200
201 string getResourceName(resource*);
202
203 resource *getResourceParent(resource*);
204
205 resourceListRec *getResourceChildren(resource*);
206
207 bool isResourceDescendent(resource *parent, resource *child);
208
209 resource *findChildResource(resource *parent, const string name);
210
211 int getResourceCount(resourceListRec*);
212
213 resource *getNthResource(resourceListRec*, int n);
214
215 resourceInfo *getResourceInfo(resource*);
216
217 resourceListRec *createResourceList();
218
219 bool addResourceList(resourceListRec*, resource*);
220
221 resource *newResource(resource *parent,
222                       void *handle,
223                       const string abstraction,
224                       const string name,
225                       timeStamp creation,
226                       const string unique);
227
228 /*
229  * manipulate user handle (a single void * to permit mapping between low level
230  *   resource's and the resource consumer.
231  *
232  */
233 void *getResourceHandle(resource*);
234
235 void setResourceHandle(resource*, void*);
236
237 resourceListRec *findFocus(const vector<string> &focusString);
238
239 /*
240  * Get the static configuration information.
241  *
242  */
243 metricListRec *getMetricList();
244
245 /*
246  * looks for a specifc metric instance in an application context.
247  *
248  */
249 metric *findMetric(const string name);
250
251 /*
252  * Metric utility functions.
253  *
254  */
255 string getMetricName(metric*);
256
257 /*
258  * Get metric out of a metric instance.
259  *
260  */
261 metric *getMetric(metricDefinitionNode*);
262
263 extern resource *findResource(const string &name);
264
265 const string nullString((char*) NULL);
266
267 #endif
268
269