added phase_persistent_data flag to MI, changed enable calls to daemons
[dyninst.git] / paradyn / src / DMthread / DMperfstream.h
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 #ifndef dmperfstream_H
17 #define dmperfstream_H
18 #include "util/h/sys.h"
19 #include "dataManager.thread.h"
20 #include "dataManager.thread.SRVR.h"
21 #include "util/h/aggregateSample.h"
22 #include <string.h>
23 #include "paradyn/src/UIthread/Status.h"
24 #include <stdlib.h>
25 #include "util/h/Vector.h"
26 #include "util/h/Dictionary.h"
27 #include "paradyn/src/DMthread/BufferPool.h"
28 #include "DMphase.h"
29 #include "DMinclude.h"
30 #include "paradyn/src/DMthread/DVbufferpool.h"
31
32
33 class metricInstance;
34 class metric;
35 class resourceList;
36 class DM_enableType; 
37
38 struct pred_Cost_Type {
39     metricHandle m_handle;
40     resourceListHandle rl_handle;
41     float max;
42     int howmany;
43     u_int requestId;
44 };
45
46 typedef struct pred_Cost_Type predCostType;
47
48 //
49 // A consumer of performance data.
50 //
51 class performanceStream {
52       friend class paradynDaemon;
53       friend void phaseInfo::startPhase(timeStamp, const string&,bool,bool);
54       friend void addMetric(T_dyninstRPC::metricInfo &info);
55       friend resourceHandle createResource(vector<string>&, string&, unsigned);
56       friend class dynRPCUser;
57       friend void DMenableResponse(DM_enableType&,vector<bool>&);
58       friend void dataManager::enableDataRequest(perfStreamHandle,
59             vector<metric_focus_pair>*,u_int,phaseType,phaseHandle,
60             u_int,u_int,u_int);
61       friend void dataManager::enableDataRequest2(perfStreamHandle,
62             vector<metricRLType>*,u_int,phaseType,phaseHandle,
63             u_int,u_int,u_int);
64     public:
65         performanceStream(dataType t, dataCallback dc,
66                           controlCallback cc, int tid); 
67         ~performanceStream();
68         void callSampleFunc(metricInstanceHandle,
69                             sampleValue*, int, int, phaseType);
70         void callResourceFunc(resourceHandle parent, resourceHandle child, 
71                               const char *name, const char *abstr);
72         void callResourceBatchFunc(batchMode mode);
73         void callFoldFunc(timeStamp width,phaseType phase_type);
74         void callStateFunc(appState state);
75         void callPhaseFunc(phaseInfo& phase,bool with_new_pc,bool with_visis);
76         void callPredictedCostFuc(metricHandle,resourceListHandle,float,u_int);
77         void callDataEnableFunc(vector<metricInstInfo> *response,
78                                 u_int request_Id);
79         perfStreamHandle Handle(){return(handle);}
80         void flushBuffer();   // send data to client thread
81         void predictedDataCostCallback(u_int,float,u_int);
82         static void notifyAllChange(appState state);
83         static void ResourceBatchMode(batchMode mode);
84         static void foldAll(timeStamp width, phaseType phase_type); 
85         static performanceStream *find(perfStreamHandle psh);
86
87         // these routines change the size of my_buffer 
88         static void addCurrentUser(perfStreamHandle psh);
89         static void addGlobalUser(perfStreamHandle psh);
90         static void removeCurrentUser(perfStreamHandle psh);
91         static void removeGlobalUser(perfStreamHandle psh);
92         static void removeAllCurrUsers();
93         static bool addPredCostRequest(perfStreamHandle,u_int&,
94                                        metricHandle,resourceListHandle,u_int);
95
96         // send data to client thread
97         // static flushBuffer(perfStreamHandle psh);
98
99         static unsigned pshash(const perfStreamHandle &val) {
100                     return((unsigned)val);
101         }
102     private:
103         dataType                type;   // Trace or Sample
104         dataCallback            dataFunc;
105         controlCallback         controlFunc;
106         int                     threadId;
107         perfStreamHandle        handle;
108         u_int                   num_global_mis;  // num MI's for global phase
109         u_int                   num_curr_mis;    // num MI's for curr phase
110         u_int                   my_buffer_size;  // total number of MI's enabled
111         u_int                   next_buffer_loc;  // next buffer loc. to fill
112         u_int                   nextpredCostReqestId;    
113         vector<dataValueType>   *my_buffer;     // buffer of dataValues
114         vector<predCostType*>   pred_Cost_buff; // outstanding predCost events
115         static u_int            next_id;
116         // dictionary rather than vector since perfStreams can be destroyed
117         static dictionary_hash<perfStreamHandle,performanceStream*> allStreams;
118         bool                    reallocBuffer();
119 };
120 #endif