Added code to change sampling rate as bucket width changes (this is not
[dyninst.git] / paradyn / src / DMthread / DMphase.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 #include "DMphase.h"
17 #include "DMperfstream.h"
18 #include "DMmetric.h"
19 #include "util/h/hist.h"
20
21 phaseInfo::phaseInfo(timeStamp s, timeStamp e, timeStamp b, const string &n){
22
23     startTime = s;
24     endTime = e;
25     bucketWidth = b;
26     handle = dm_phases.size();
27     if(!n.string_of()){
28         char temp[20];
29         sprintf(temp,"%s%d","phase_",handle);
30         name = string(temp);
31     }
32     else
33         name = n;
34     phaseInfo *p = this;
35     dm_phases += p;
36     p = 0;
37 }
38
39 phaseInfo::~phaseInfo(){
40 }
41
42
43 void phaseInfo::setLastEndTime(timeStamp stop_time){
44    unsigned size = dm_phases.size();
45    if(size > 0){
46        (dm_phases[size-1])->SetEndTime(stop_time);
47    }
48 }
49
50 void phaseInfo::startPhase(timeStamp start_Time, const string &name){
51
52     // TODO: change sampling rate (???)  if this is changed on fold
53     // events (it is not currently) it should be changed here as well 
54
55     phaseHandle lastId =  phaseInfo::CurrentPhaseHandle();
56     // create a new phaseInfo object 
57     timeStamp bin_width = (Histogram::getMinBucketWidth());
58     timeStamp start_time = Histogram::currentTime();
59
60     // set the end time for the curr. phase
61     phaseInfo::setLastEndTime(start_time);
62     phaseInfo *p = new phaseInfo(start_time, (timeStamp)-1.0, bin_width, name);
63     assert(p);
64     
65     // update MI's current phase info 
66     metricInstance::setPhaseId(p->GetPhaseHandle());
67     metricInstance::SetCurrWidth(bin_width);
68
69     // disable all currPhase data collection if persistent_collection flag
70     // clear, and remove all currPhase data if persistent_data flag clear
71     metricInstance::stopAllCurrentDataCollection(lastId);
72
73     // invoke newPhaseCallback for all perf. streams
74     dictionary_hash_iter<perfStreamHandle,performanceStream*>
75                         allS(performanceStream::allStreams);
76      perfStreamHandle h;
77      performanceStream *ps;
78      while(allS.next(h,ps)){
79          ps->callPhaseFunc(*p);
80      }
81      p = 0;
82 }       
83
84 // caller is responsible for freeing space assoc. with return list
85 vector<T_visi::phase_info> *phaseInfo::GetAllPhaseInfo(){
86
87     vector<T_visi::phase_info> *phase_list = new vector<T_visi::phase_info>;
88     T_visi::phase_info newValue;
89
90     for(unsigned i=0; i < dm_phases.size(); i++){
91         phaseInfo *next_phase = dm_phases[i];
92         newValue.start = next_phase->GetStartTime();
93         newValue.end = next_phase->GetEndTime();
94         newValue.bucketWidth = next_phase->GetBucketWidth();
95         newValue.handle = next_phase->GetPhaseHandle();
96         newValue.name = next_phase->PhaseName();
97         *phase_list += newValue;
98     }
99     assert(phase_list->size() == dm_phases.size());
100     return(phase_list);
101 }
102
103 // returns the start time of the last defined phase
104 timeStamp phaseInfo::GetLastPhaseStart(){
105
106   unsigned size = dm_phases.size(); 
107   if (size == 0) return -1;
108   return(dm_phases[size-1]->GetStartTime());
109
110 }
111
112 // returns handle of the last defined phase
113 phaseHandle phaseInfo::CurrentPhaseHandle(){
114
115   unsigned size = dm_phases.size(); 
116   if (size == 0) return 0;
117   return(dm_phases[size-1]->GetPhaseHandle());
118 }
119
120 timeStamp phaseInfo::GetLastBucketWidth(){
121
122   unsigned size = dm_phases.size(); 
123   if (size == 0) return -1;
124   return(dm_phases[size-1]->GetBucketWidth());
125
126 }
127
128 void phaseInfo::setCurrentBucketWidth(timeStamp new_width){
129
130   unsigned size = dm_phases.size(); 
131   if (size == 0) return;
132   dm_phases[size-1]->ChangeBucketWidth(new_width);
133
134 }