This is model.c in view mode; [Download] [Up]
#if (!defined(lint) && !defined(SABER))
static char *rcsid = "$Header: /ufs/comp/mei/PROJ_PCN/onprofile/IFModel/Model/RCS/model.c,v 1.11 1992/04/17 21:10:58 mei Exp $";
#endif
/*AERO_MESG*/
/********************************************************/
/* File : model.c */
/* Content : contains routines that is call upon to */
/* distribute profile data to every procedures */
/* Date : OLD routines (updated for version 005) */
/********************************************************/
#include <stdio.h>
#ifdef HISTOGRAM
#include <Xsw/Xsw.h>
#include <Gauge/Gauge.h>
#endif
#ifndef _MODEL_H
#include "model.h"
#endif
/********************************************************/
/* Name : assign_counter_values */
/* Content : used during reading in the profile filer, */
/* 1) read in the values and distributed to different */
/* procedure and clause's snapshot data structure */
/* according to the offset retrieved from part from */
/* .mod */
/* 2) some partial accumulation of "total" counts is */
/* done as each set of counters is handled */
/* Date : updated (12/91) */
/********************************************************/
/*ARGSUSED*/
char *assign_counter_values(proc_name,proc,args)
char *proc_name;
Procedure *proc;
AssignArg *args;
{
int node_no = args->node_no;
int snap_no = args->snap_no;
Histo *hPtr = args->hPtr;
long *counters = (long *) args->buff;
char *snapname = (char *) args->snapname;
int last_uses;
Clause *clauses;
ProcedureProfileData *sPtr, /* ptr to a snapshot's profile data */
*tPtr; /* temporary ptr */
Node *nPtr; /* temporary ptr */
ClauseProfileData *cPtr, *clauPtr;
int i;
sPtr = insert_procsnapprof(proc,snap_no,node_no);
if (proc->type != FOREIGN_PROCEDURE) {
/* hui 12/30 find the position and allocate data space , always
need to do this because assign_timer_values will use it */
clauPtr = insert_clausnapprof(proc,proc->size,snap_no,node_no);
/* Distribute counter values */
sPtr->counts.copy = counters[proc->offsets.copy];
sPtr->counts.suspend =
(proc->type == PCN_PARALLEL) ? 0 : counters[proc->offsets.suspend];
/** insert clause data to every clause segment **/
for(i=0;i< proc->size;i++) {
clauses=proc->clauses+i;
cPtr=clauPtr+i;
cPtr->counts.commit= counters[clauses->commit_offset];
}/*for*/
/** Note that the index is from the last and the content
for last cPtr->counts.failure is sPtr's suspend and
all later .failure is adding .failure of its next
clause and its commits
**/
last_uses = sPtr->counts.suspend;
for(i=proc->size-1;i>=0;i--) {
clauses=proc->clauses+i;
cPtr=clauPtr+i;
cPtr->counts.failure = last_uses;
last_uses = cPtr->counts.use =
cPtr->counts.failure+cPtr->counts.commit;
/** Note that sPtr's data are summation of clause's **/
sPtr->counts.commit += cPtr->counts.commit;
sPtr->counts.failure += cPtr->counts.failure;
sPtr->counts.use += cPtr->counts.commit;
}/*for*/
/* do the procedure's total profile accumulation */
tPtr=proc->total+snap_no;
tPtr->counts.use += sPtr->counts.use;
tPtr->counts.commit += sPtr->counts.commit;
tPtr->counts.failure += sPtr->counts.failure;
tPtr->counts.suspend += sPtr->counts.suspend;
if(strcmp(snapname,LASTSNAP)==0) {/* last snapshot */
hPtr->info.reductions +=
tPtr->counts.commit;
hPtr->info.suspensions +=
tPtr->counts.suspend;
}/*if*/
/* do the node's total profile accumulation */
nPtr=hPtr->nodes+node_no;
tPtr=nPtr->total+snap_no;
tPtr->counts.use += sPtr->counts.use;
tPtr->counts.commit += sPtr->counts.commit;
tPtr->counts.failure += sPtr->counts.failure;
}
args->snapPtr=sPtr;
return (char *) args;
}
/********************************************************/
/* Name : assign_timer_values */
/* Content : used during reading in the profile file, */
/* 1) According to the type of procedure calls it is */
/* timer values is distributed among different */
/* procedure's data structure */
/* 2) partial accumulation of cost is done at the same */
/* time */
/* Date : updated (12/91) */
/********************************************************/
/*ARGSUSED*/
char *assign_timer_values(proc_name,proc,args)
char *proc_name;
Procedure *proc;
AssignArg *args;
{
int node_no = args->node_no;
int snap_no = args->snap_no;
Histo *hPtr = args->hPtr;
double *timers = (double *) args->buff;
char *snapname = (char *) args->snapname;
ProcedureProfileData *sPtr,
*tPtr;
/* assuming the space is already allocated by
assign_counter_values procedure -- assuming
a fix order of counter file */
sPtr=lookup_procsnapprof(proc,snap_no,node_no);
if( sPtr == (ProcedureProfileData *) NULL) {
sprintf(TextBuffer,
"can not find procedure snap data block for node[%d] snap[%d]",
node_no,snap_no);
GaugeError("assign_timer_values",TextBuffer);
}/* if */
if (proc->type != FOREIGN_PROCEDURE)
sPtr->cost.idle = timers[proc->offsets.idle];
else {
RGraph *ctemp;
Foreign *fPtr;
Clause *cPtr;
ClauseProfileData *clauPtr;
Node *nPtr;
/**** serious problem here -- what if the caller clause
did not get a snap shot at the same time ?? ****/
for(ctemp = proc->callers; ctemp != (RGraph *) NULL ;
ctemp = ctemp->next) {
cPtr = ctemp->clause_ptr;
/* using the clause the caller is pt to */
clauPtr=lookup_clausnapprof2(cPtr,snap_no,node_no);
if( clauPtr == (ClauseProfileData *) NULL) {
sprintf(TextBuffer,
"can not find the procedure snap data block for node[%d] snap[%d]",
node_no,snap_no);
GaugeError("assign_timer_values",TextBuffer);
}/* if */
for(fPtr = cPtr->foreigns; fPtr->procedure != NULL;
fPtr++) {
if (fPtr->procedure == proc) {
sPtr->cost.success += timers[fPtr->timer];
sPtr->counts.commit +=
clauPtr->counts.commit;
sPtr->counts.use +=
clauPtr->counts.commit;
}/*if*/
}/*for*/
}/*for*/
sPtr->cost.total = sPtr->cost.success;
sPtr->counts.use = sPtr->counts.commit;
/* accumulate the procedure's total profile */
tPtr=proc->total+snap_no;
tPtr->counts.use += sPtr->counts.commit;
tPtr->counts.commit += sPtr->counts.commit;
if(strcmp(snapname,LASTSNAP)==0) {/* last snapshot */
hPtr->info.reductions +=
tPtr->counts.commit;
hPtr->info.suspensions +=
tPtr->counts.suspend;
} /* if */
/* accumulate for the node's total profile */
nPtr=hPtr->nodes+node_no;
tPtr=nPtr->total+snap_no;
tPtr->counts.use += sPtr->counts.commit;
tPtr->counts.commit += sPtr->counts.commit;
}/*if-else*/
return (char *) args;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.