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.
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.
22 extern void histDataCallBack(sampleValue*, timeStamp, int, int, void*);
23 extern void histFoldCallBack(timeStamp, void*, timeStamp);
25 metric::metric(T_dyninstRPC::metricInfo i){
27 if(allMetrics.defines(i.name)) return;
31 info.aggregate = i.aggregate;
32 info.handle = metrics.size();
34 allMetrics[i.name] = met;
38 const T_dyninstRPC::metricInfo *metric::getInfo(metricHandle handle) {
40 if(handle < metrics.size()){
41 metric *met = metrics[handle];
42 return(met->getInfo());
49 const char *metric::getName(metricHandle handle){
50 if(handle < metrics.size()){
51 metric *met = metrics[handle];
52 return(met->info.name.string_of());
59 const metricHandle *metric::find(const string iName){
60 if(allMetrics.defines(iName)){
61 return(&(allMetrics[iName])->info.handle);
68 metric *metric::getMetric(metricHandle handle){
69 if(handle < metrics.size()){
70 return(metrics[handle]);
77 vector<string> *metric::allMetricNames(){
79 vector<string> *temp = new vector<string>;
81 for(unsigned i=0; i < metrics.size(); i++){
82 metric *met = metrics[i];
83 string name = met->getName();
91 vector<met_name_id> *metric::allMetricNamesIds(){
93 vector<met_name_id> *temp = new vector<met_name_id>;
95 for(unsigned i=0; i < metrics.size(); i++){
96 metric *met = metrics[i];
97 next.name = met->getName();
98 next.id = met->getHandle();
105 metricInstance::metricInstance(resourceListHandle rl,
111 metric *mp = metric::getMetric(m);
112 sample.aggOp = mp->getAggregate();
116 persistent_collection = 0;
118 metricInstance::curr_phase_id = ph;
120 // find an Id for this metricInstance
121 for(unsigned i=0; i < nextId.size(); i++){
125 allMetricInstances[id] = this;
128 // if not found, add a new element to the id array
131 assert(id < nextId.size());
132 allMetricInstances[id] = this;
135 metricInstance::~metricInstance() {
136 for(unsigned i=0; i < components.size(); i++){
137 delete (components[i]);
139 for(unsigned j=0; j < parts.size(); j++){
142 for(unsigned k=0; k < old_data.size(); k++){
143 delete (old_data[k]);
145 if (data) delete(data);
146 if (global_data) delete(global_data);
148 // remove metricInstace from list of allMetricsInstances
149 allMetricInstances.undef(id);
152 int metricInstance::getArchiveValues(sampleValue *buckets,int numOfBuckets,
153 int first,phaseHandle phase_id){
155 // find histogram associated with phase_id
156 for(unsigned i = 0; i < old_data.size(); i++){
157 if((old_data[i])->phaseId == phase_id){
158 if((old_data[i])->data)
159 return((old_data[i])->data->getBuckets(buckets,
160 numOfBuckets,first));
166 int metricInstance::getSampleValues(sampleValue *buckets,int numOfBuckets,
167 int first,phaseType phase){
169 if(phase == CurrentPhase){
170 if (!data) return (-1);
171 return(data->getBuckets(buckets, numOfBuckets, first));
174 if (!global_data) return (-1);
175 return(global_data->getBuckets(buckets, numOfBuckets, first));
180 metricInstance *metricInstance::getMI(metricInstanceHandle mh){
182 if(allMetricInstances.defines(mh)){
183 return(allMetricInstances[mh]);
188 // TODO: remove asserts
189 void metricInstance::dataDisable(){
191 assert(!users.size());
192 assert(!global_users.size());
193 for(unsigned i=0; i < components.size(); i++){
194 delete (components[i]); // this disables data collection
196 components.resize(0);
197 // deleteing components deletes parts as well
198 // for(unsigned j=0; j < parts.size(); j++){
199 // delete (parts[j]);
203 // if data is persistent this must be cleared
204 sample.firstSampleReceived = false;
205 assert(!components.size());
206 assert(!parts.size());
209 void metricInstance::removeCurrUser(perfStreamHandle ps){
211 // remove ps from vector of users
212 unsigned size = users.size();
213 for(unsigned i=0; i < size; i++){
215 users[i] = users[size-1];
216 users.resize(size-1);
217 assert(users.size() < size);
222 void metricInstance::removeGlobalUser(perfStreamHandle ps){
224 // remove ps from vector of users
225 unsigned size = global_users.size();
226 for(unsigned i=0; i < size; i++){
227 if(global_users[i] == ps){
228 global_users[i] = global_users[size-1];
229 global_users.resize(size-1);
230 assert(global_users.size() < size);
235 // returns true if histogram really was deleted
236 bool metricInstance::deleteCurrHistogram(){
238 // if curr histogram exists and ther are no users delete
239 if(!(users.size()) && data) {
247 metricInstance *metricInstance::find(metricHandle mh, resourceListHandle rh){
250 dictionary_hash_iter<metricInstanceHandle,metricInstance *>
251 allMI(allMetricInstances);
252 metricInstanceHandle handle;
254 while(allMI.next(handle,mi)){
255 if((mi->getMetricHandle() == mh) && (mi->getFocusHandle() == rh)){
262 bool metricInstance::addComponent(component *new_comp){
264 paradynDaemon *new_daemon = new_comp->getDaemon();
265 for (unsigned i=0; i < components.size(); i++){
266 if((components[i])->getDaemon() == new_daemon) return false;
268 components += new_comp;
272 bool metricInstance::addPart(sampleInfo *new_part){
278 // stops currentPhase data collection for all metricInstances
279 void metricInstance::stopAllCurrentDataCollection(phaseHandle last_phase_id) {
281 dictionary_hash_iter<metricInstanceHandle,metricInstance *>
282 allMI(allMetricInstances);
283 metricInstanceHandle handle;
286 vector<metricInstance *> remove_list;
288 while(allMI.next(handle,mi)){
292 assert(remove_list.size() == allMetricInstances.size());
293 for(unsigned i=0; i < remove_list.size(); i++){
295 // remove all users from user list
297 assert(!(mi->users.size()));
299 bool was_deleted = false;
300 // if persistent data archive curr histogram
301 if(mi->isDataPersistent()){
303 if(mi->data->isActive()) was_deleted = true;
304 mi->data->clearActive();
305 mi->data->clearFoldOnInactive();
306 ArchiveType *temp = new ArchiveType;
307 temp->data = mi->data;
308 temp->phaseId = last_phase_id;
309 mi->old_data += temp;
314 else { // else delete curr histogram
315 was_deleted = mi->deleteCurrHistogram();
319 // if not persistent collection
320 if (!(mi->isCollectionPersistent())){
321 // really disable data collection
322 if((mi->isEnabled()) && (!mi->globalUsersCount())) {
323 // disable MI data collection
325 if(!(mi->isDataPersistent())){
328 metricInstance::decrNumGlobalHists();
331 metricInstance::decrNumCurrHists();
333 else { // else, create new curr histogram with empty curr users list
334 metric *m = metric::getMetric(mi->met);
335 mi->newCurrDataCollection(m->getStyle(),
343 void metricInstance::addCurrentUser(perfStreamHandle p) {
345 for(unsigned i=0; i < users.size(); i++){
346 if(users[i] == p) return;
349 assert(users.size());
352 void metricInstance::addGlobalUser(perfStreamHandle p) {
354 for(unsigned i=0; i < global_users.size(); i++){
355 if(global_users[i] == p) return;
358 assert(global_users.size());
361 void metricInstance::newGlobalDataCollection(metricStyle style,
365 // histogram has already been created
367 global_data->setActive();
368 global_data->clearFoldOnInactive();
371 // call constructor for start time 0.0
372 global_data = new Histogram(style, dcb, fcb, this);
375 void metricInstance::newCurrDataCollection(metricStyle style,
379 // histogram has already been created
382 data->clearFoldOnInactive();
385 // create new histogram
386 timeStamp start_time = phaseInfo::GetLastPhaseStart();
387 if(start_time == 0.0) {
388 data = new Histogram(style, dcb, fcb, this);
392 data = new Histogram(start_time, style, dcb, fcb, this);