Changes made for the value of observed cost
[dyninst.git] / paradyn / src / PCthread / PCsearch.h
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  * PCsearch.h
44  *
45  * State information required throughout a search.
46  *
47  * $Log: PCsearch.h,v $
48  * Revision 1.15  1997/03/16 23:17:08  lzheng
49  * Changes made for the value of observed cost
50  *
51  * Revision 1.14  1996/08/16 21:03:43  tamches
52  * updated copyright for release 1.1
53  *
54  * Revision 1.13  1996/07/26 18:02:39  karavan
55  * added display of status if search throttled back.
56  *
57  * Revision 1.12  1996/07/24 20:10:38  karavan
58  * Fixed error in numActiveExperiments calculation; numActiveCurrentExperiments
59  * now zero'd at phase boundary.
60  *
61  * Revision 1.11  1996/07/22 18:55:45  karavan
62  * part one of two-part commit for new PC functionality of restarting searches.
63  *
64  * Revision 1.10  1996/05/15 04:35:19  karavan
65  * bug fixes: changed pendingCost pendingSearches and numexperiments to
66  * break down by phase type, so starting a new current phase updates these
67  * totals correctly; fixed error in estimated cost propagation.
68  *
69  * Revision 1.9  1996/05/11 01:58:04  karavan
70  * fixed bug in PendingCost calculation.
71  *
72  * Revision 1.8  1996/05/08 07:35:27  karavan
73  * Changed enable data calls to be fully asynchronous within the performance consultant.
74  *
75  * some changes to cost handling, with additional limit on number of outstanding enable requests.
76  *
77  * Revision 1.7  1996/04/30 06:26:44  karavan
78  * change PC pause function so cost-related metric instances aren't disabled
79  * if another phase is running.
80  *
81  * fixed bug in search node activation code.
82  *
83  * added change to treat activeProcesses metric differently in all PCmetrics
84  * in which it is used; checks for refinement along process hierarchy and
85  * if there is one, uses value "1" instead of enabling activeProcesses metric.
86  *
87  * changed costTracker:  we now use min of active Processes and number of
88  * cpus, instead of just number of cpus; also now we average only across
89  * time intervals rather than cumulative average.
90  *
91  */
92
93 #ifndef pc_search_h
94 #define pc_search_h
95
96 #include "PCmetricInst.h"
97 #include "PCshg.h"
98
99 typedef enum schState {schNeverRun, schPaused, schRunning, schEnded};
100 typedef unsigned SearchQKey;
101
102 class costModule;
103
104 class PCsearch {
105   friend class performanceConsultant;
106 public:
107   PCsearch(unsigned phase, phaseType phase_type);
108   ~PCsearch();
109   void pause(); 
110   void resume();
111   void terminate(timeStamp searchEndTime);
112   void printResults();
113   unsigned getPhase() { return phaseToken; }
114   bool paused() {return (searchStatus == schPaused);}
115   bool newbie() {return (searchStatus == schNeverRun);}
116   PCmetricInstServer *getDatabase() {return database;}
117   void startSearching();
118   bool getNodeInfo(int nodeID, shg_node_info *theInfo);
119   void updateDisplayedStatus (string *msg) {
120     shg->updateDisplayedStatus (msg);
121   }
122   void decrNumActiveExperiments() {
123     if (isGlobal())
124       PCsearch::numActiveGlobalExperiments -= 1;
125     else
126       PCsearch::numActiveCurrentExperiments -= 1;
127   }
128
129   static void updateCurrentPhase (unsigned phaseID, timeStamp endTime);
130   static PCsearch *findSearch (phaseType pt);
131   static bool addSearch (unsigned phaseID);
132   static void expandSearch (sampleValue observedRecentCost);
133   static void addToQueue(int key, searchHistoryNode *node, unsigned pid) {
134     if (pid == GlobalPhaseID)
135       PCsearch::GlobalSearchQueue.add(key, node);
136     else
137       PCsearch::CurrentSearchQueue.add(key, node);
138   }
139   static void printQueue(unsigned pid) {
140     if (pid == GlobalPhaseID) {
141       cout << "     ++ Global Search Queue ++" << endl;
142       cout << GlobalSearchQueue << endl;
143     } else {
144       cout << "     ++ Current Search Queue ++" << endl;
145       cout << CurrentSearchQueue << endl;
146     }
147   }
148   static int getNumActiveExperiments() {
149     return PCsearch::numActiveGlobalExperiments + 
150       PCsearch::numActiveCurrentExperiments;
151   }
152   static int getNumPendingSearches() {
153     return PendingCurrentSearches + PendingGlobalSearches;
154   }
155   static float getPendingCost() {
156     return (PendingCurrentCost + PendingGlobalCost); }
157   static void addGlobalActiveExperiment() {
158     PCsearch::numActiveGlobalExperiments += 1;}
159   static void addCurrentActiveExperiment() {
160     PCsearch::numActiveCurrentExperiments += 1;}
161   static void decrNumPendingGlobalSearches() 
162     {PCsearch::PendingGlobalSearches -= 1;}
163   static void decrNumPendingCurrentSearches() 
164     {PCsearch::PendingCurrentSearches -= 1;}
165   static void initCostTracker();
166   static void clearPendingCurrentCost(float val) 
167     { PCsearch::PendingCurrentCost -= val; }
168   static void clearPendingGlobalCost(float val) 
169     { PCsearch::PendingGlobalCost -= val; }
170 private:
171   schState searchStatus;  // schNeverRun/schPaused/schRunning/schEnded
172   unsigned phaseToken;          // identifier for phase of this search
173   phaseType phType;     // global or current; need for DM interface
174   PCmetricInstServer *database;
175   searchHistoryGraph *shg;
176   bool isGlobal() {return (phType == GlobalPhase);}
177   static dictionary_hash<unsigned, PCsearch*>AllPCSearches;
178   static unsigned PCactiveCurrentPhase;
179   static costModule *costTracker;
180   static float PendingGlobalCost;
181   static float PendingCurrentCost;
182   static int PendingCurrentSearches;
183   static int PendingGlobalSearches;
184   static int numActiveGlobalExperiments;
185   static int numActiveCurrentExperiments;
186   static PriorityQueue<SearchQKey, searchHistoryNode*> GlobalSearchQueue;
187   static PriorityQueue<SearchQKey, searchHistoryNode*> CurrentSearchQueue;
188   static bool CurrentSearchPaused;
189   static bool GlobalSearchPaused;
190   static searchHistoryNode *SearchThrottleNode;
191   static bool SearchThrottledBack;
192   static PriorityQueue<SearchQKey, searchHistoryNode*> *q;
193 };
194
195 class costModule : public dataSubscriber 
196 {
197  public:
198   void newData (PCmetDataID, sampleValue newVal, timeStamp, timeStamp, 
199            sampleValue)
200     {
201         newVal = (newVal - 1)/newVal;
202         if (newVal < performanceConsultant::predictedCostLimit)
203             // check search queue and expand search if possible
204               PCsearch::expandSearch(newVal);
205     }
206   void updateEstimatedCost(float) {;}
207   void enableReply(unsigned, unsigned, unsigned, bool) {;}
208   PCmetInstHandle costFilter;
209 };
210
211
212 #endif
213