summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/CactusTimers.h36
-rw-r--r--src/main/DefaultTimers.c79
-rw-r--r--src/util/CactusTimers.c122
3 files changed, 178 insertions, 59 deletions
diff --git a/src/include/CactusTimers.h b/src/include/CactusTimers.h
index 8d38f920..b817222c 100644
--- a/src/include/CactusTimers.h
+++ b/src/include/CactusTimers.h
@@ -15,18 +15,42 @@
/* Typedefs */
+typedef enum {val_none, val_int, val_long, val_double} t_TimerValType;
+
+typedef struct
+{
+ t_TimerValType type;
+ const char *heading;
+ const char *units;
+ union
+ {
+ int i;
+ long int l;
+ double d;
+ } val;
+} t_TimerVal;
+
+typedef struct
+{
+ int n_vals;
+ t_TimerVal *vals;
+} t_TimerInfo;
+
+
typedef struct
{
+ t_TimerInfo info;
void *(*create)(int);
void (*destroy)(int, void *);
void (*start)(int, void *);
void (*stop)(int, void *);
void (*reset)(int, void *);
- double (*get)(int, void *);
- void (*set)(int, void *, double);
+ void (*get)(int, void *, t_TimerVal *);
+ void (*set)(int, void *, t_TimerVal *);
} t_TimerFuncs;
+
/* Function prototypes */
#ifdef __cplusplus
@@ -35,6 +59,7 @@ extern "C" {
int CCTK_TimerRegister(const char *name, t_TimerFuncs *functions);
int CCTK_TimerCreate(const char *name);
+int CCTK_TimerCreateI(void);
void CCTK_TimerDestroy(const char *name);
void CCTK_TimerDestroyI(int this_timer);
void CCTK_TimerStart(const char *name);
@@ -43,8 +68,11 @@ void CCTK_TimerStop(const char *name);
void CCTK_TimerStopI(int this_timer);
void CCTK_TimerReset(const char *name);
void CCTK_TimerResetI(int this_timer);
-char *CCTK_TimerGet(const char *name);
-char *CCTK_TimerGetI(int this_timer);
+void CCTK_TimerGet(const char *name, t_TimerInfo *info);
+void CCTK_TimerGetI(int this_timer, t_TimerInfo *info);
+
+t_TimerInfo *CCTK_TimerCreateInfo(void);
+void CCTK_TimerDestroyInfo(t_TimerInfo *info);
#ifdef __cplusplus
}
diff --git a/src/main/DefaultTimers.c b/src/main/DefaultTimers.c
index 7dafec57..d1b2754f 100644
--- a/src/main/DefaultTimers.c
+++ b/src/main/DefaultTimers.c
@@ -89,6 +89,9 @@ typedef struct
double last;
} t_GetTimeOfDayTimer;
+static char *GetTimeOfDayHeading = "Data from gettimeofday call";
+static char *GetTimeOfDayUnits = "secs";
+
/*@@
@routine CCTKi_TimerGetTimeOfDayCreate
@date Wed Oct 20 18:28:19 1999
@@ -132,7 +135,7 @@ void *CCTKi_TimerGetTimeOfDayCreate(int timernum)
@endhistory
@@*/
-void CCTKi_TimerGetTimeOfDayDestroy(int timernum, t_GetTimeOfDayTimer *data)
+void CCTKi_TimerGetTimeOfDayDestroy(int timernum, void *data)
{
if(data)
{
@@ -155,11 +158,15 @@ void CCTKi_TimerGetTimeOfDayDestroy(int timernum, t_GetTimeOfDayTimer *data)
@endhistory
@@*/
-void CCTKi_TimerGetTimeOfDayStart(int timernum, t_GetTimeOfDayTimer *data)
+void CCTKi_TimerGetTimeOfDayStart(int timernum, void *idata)
{
+ t_GetTimeOfDayTimer *data;
+
struct timeval tp;
struct timezone tzp;
+ data = (t_GetTimeOfDayTimer *)idata;
+
gettimeofday(&tp, &tzp);
data->last = tp.tv_sec + (double)tp.tv_usec/1000000.0;
@@ -183,11 +190,15 @@ void CCTKi_TimerGetTimeOfDayStart(int timernum, t_GetTimeOfDayTimer *data)
@endhistory
@@*/
-void CCTKi_TimerGetTimeOfDayStop(int timernum, t_GetTimeOfDayTimer *data)
+void CCTKi_TimerGetTimeOfDayStop(int timernum, void *idata)
{
+ t_GetTimeOfDayTimer *data;
+
struct timeval tp;
struct timezone tzp;
+ data = (t_GetTimeOfDayTimer *)idata;
+
gettimeofday(&tp, &tzp);
data->total += (tp.tv_sec + (double)tp.tv_usec/1000000.0 - data->last);
@@ -211,8 +222,11 @@ void CCTKi_TimerGetTimeOfDayStop(int timernum, t_GetTimeOfDayTimer *data)
@endhistory
@@*/
-void CCTKi_TimerGetTimeOfDayReset(int timernum, t_GetTimeOfDayTimer *data)
+void CCTKi_TimerGetTimeOfDayReset(int timernum, void *idata)
{
+ t_GetTimeOfDayTimer *data;
+
+ data = (t_GetTimeOfDayTimer *)idata;
data->last = 0;
data->total = 0;
@@ -233,11 +247,16 @@ void CCTKi_TimerGetTimeOfDayReset(int timernum, t_GetTimeOfDayTimer *data)
@endhistory
@@*/
-double CCTKi_TimerGetTimeOfDayGet(int timernum, t_GetTimeOfDayTimer *data)
+void CCTKi_TimerGetTimeOfDayGet(int timernum, void *idata, t_TimerVal *vals)
{
+ t_GetTimeOfDayTimer *data;
- return data->total;
+ data = (t_GetTimeOfDayTimer *)idata;
+ vals[0].type = val_double;
+ vals[0].heading = GetTimeOfDayHeading;
+ vals[0].units = GetTimeOfDayUnits;
+ vals[0].val.d = data->total;
}
/*@@
@@ -254,9 +273,13 @@ double CCTKi_TimerGetTimeOfDayGet(int timernum, t_GetTimeOfDayTimer *data)
@endhistory
@@*/
-void CCTKi_TimerGetTimeOfDaySet(int timernum, t_GetTimeOfDayTimer *data, double val)
+void CCTKi_TimerGetTimeOfDaySet(int timernum, void *idata, t_TimerVal *vals)
{
- data->total = val;
+ t_GetTimeOfDayTimer *data;
+
+ data = (t_GetTimeOfDayTimer *)idata;
+
+ data->total = vals[0].val.d;
}
/*@@
@@ -306,6 +329,9 @@ typedef struct
double last;
} t_GetrUsageTimer;
+static char *GetrUsageHeading = "Data from getrusage call";
+static char *GetrUsageUnits = "secs";
+
/*@@
@routine CCTKi_TimerGetrUsageCreate
@date Wed Oct 20 18:28:19 1999
@@ -349,7 +375,7 @@ void *CCTKi_TimerGetrUsageCreate(int timernum)
@endhistory
@@*/
-void CCTKi_TimerGetrUsageDestroy(int timernum, t_GetrUsageTimer *data)
+void CCTKi_TimerGetrUsageDestroy(int timernum, void *data)
{
if(data)
{
@@ -372,10 +398,14 @@ void CCTKi_TimerGetrUsageDestroy(int timernum, t_GetrUsageTimer *data)
@endhistory
@@*/
-void CCTKi_TimerGetrUsageStart(int timernum, t_GetrUsageTimer *data)
+void CCTKi_TimerGetrUsageStart(int timernum, void *idata)
{
+ t_GetrUsageTimer *data;
+
struct rusage ru;
+ data = (t_GetrUsageTimer *)idata;
+
getrusage(RUSAGE_SELF, &ru);
data->last = ru.ru_utime.tv_sec + (double)ru.ru_utime.tv_usec/1000000.0;
@@ -399,10 +429,14 @@ void CCTKi_TimerGetrUsageStart(int timernum, t_GetrUsageTimer *data)
@endhistory
@@*/
-void CCTKi_TimerGetrUsageStop(int timernum, t_GetrUsageTimer *data)
+void CCTKi_TimerGetrUsageStop(int timernum, void *idata)
{
+ t_GetrUsageTimer *data;
+
struct rusage ru;
+ data = (t_GetrUsageTimer *)idata;
+
getrusage(RUSAGE_SELF, &ru);
data->total += (ru.ru_utime.tv_sec + (double)ru.ru_utime.tv_usec/1000000.0 - data->last);
@@ -426,8 +460,11 @@ void CCTKi_TimerGetrUsageStop(int timernum, t_GetrUsageTimer *data)
@endhistory
@@*/
-void CCTKi_TimerGetrUsageReset(int timernum, t_GetrUsageTimer *data)
+void CCTKi_TimerGetrUsageReset(int timernum, void *idata)
{
+ t_GetrUsageTimer *data;
+
+ data = (t_GetrUsageTimer *)idata;
data->last = 0;
data->total = 0;
@@ -448,10 +485,16 @@ void CCTKi_TimerGetrUsageReset(int timernum, t_GetrUsageTimer *data)
@endhistory
@@*/
-double CCTKi_TimerGetrUsageGet(int timernum, t_GetrUsageTimer *data)
+void CCTKi_TimerGetrUsageGet(int timernum, void *idata, t_TimerVal *vals)
{
+ t_GetrUsageTimer *data;
+
+ data = (t_GetrUsageTimer *)idata;
- return data->total;
+ vals[0].type = val_double;
+ vals[0].heading = GetrUsageHeading;
+ vals[0].units = GetrUsageUnits;
+ vals[0].val.d = data->total;
}
@@ -469,9 +512,13 @@ double CCTKi_TimerGetrUsageGet(int timernum, t_GetrUsageTimer *data)
@endhistory
@@*/
-void CCTKi_TimerGetrUsageSet(int timernum, t_GetrUsageTimer *data, double val)
+void CCTKi_TimerGetrUsageSet(int timernum, void *idata, t_TimerVal *vals)
{
- data->total = val;
+ t_GetrUsageTimer *data;
+
+ data = (t_GetrUsageTimer *)idata;
+
+ data->total = vals[0].val.d;
}
/*@@
diff --git a/src/util/CactusTimers.c b/src/util/CactusTimers.c
index 308bd355..faf60d3d 100644
--- a/src/util/CactusTimers.c
+++ b/src/util/CactusTimers.c
@@ -26,11 +26,15 @@ static void CCTKi_TimerDestroy(int this_timer, t_Timer *timer);
static void CCTKi_TimerStart(int this_timer, t_Timer *timer);
static void CCTKi_TimerStop(int this_timer, t_Timer *timer);
static void CCTKi_TimerReset(int this_timer, t_Timer *timer);
-static char *CCTKi_TimerGet(int this_timer, t_Timer *timer);
+static void CCTKi_TimerGet(int this_timer, t_Timer *timer, t_TimerInfo *info);
static int n_timertypes = 0;
static cHandledData *handles = NULL;
+/* The total number of timer values. */
+static int n_timer_vals = 0;
+
+
static int n_timers = 0;
static cHandledData *timers = NULL;
@@ -57,6 +61,7 @@ int CCTK_TimerRegister(const char *name, t_TimerFuncs *functions)
if(newfuncs)
{
+ newfuncs->info.n_vals = functions->info.n_vals;
newfuncs->create = functions->create;
newfuncs->destroy = functions->destroy;
newfuncs->start = functions->start;
@@ -68,6 +73,7 @@ int CCTK_TimerRegister(const char *name, t_TimerFuncs *functions)
handle = Util_NewHandle(&handles, name, newfuncs);
n_timertypes++;
+ n_timer_vals += functions->info.n_vals;
return handle;
}
@@ -131,6 +137,32 @@ int CCTK_TimerCreate(const char *name)
}
/*@@
+ @routine CCTK_TimerCreateI
+ @date Fri Oct 22 10:21:14 1999
+ @author Tom Goodale
+ @desc
+ Creates a timer with a unique name.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+int CCTK_TimerCreateI(void)
+{
+ int retval;
+ char name[20];
+
+ sprintf(name, "timer_%d", n_timers);
+
+ retval = CCTK_TimerCreate(name);
+
+ return retval;
+}
+
+ /*@@
@routine CCTK_TimerDestroy
@date Wed Sep 1 10:10:20 1999
@author Tom Goodale
@@ -393,79 +425,91 @@ static void CCTKi_TimerReset(int this_timer, t_Timer *timer)
@endhistory
@@*/
-char *CCTK_TimerGet(const char *name)
+void CCTK_TimerGet(const char *name, t_TimerInfo *info)
{
t_Timer *timer;
int this_timer;
- char *retval;
if(this_timer = Util_GetHandle(timers, name, (void **)&timer))
{
- retval = CCTKi_TimerGet(this_timer, timer);
- }
- else
- {
- retval = NULL;
+ CCTKi_TimerGet(this_timer, timer, info);
}
- return retval;
+ return;
}
-char *CCTK_TimerGetI(int this_timer)
+void CCTK_TimerGetI(int this_timer, t_TimerInfo *info)
{
t_Timer *timer;
- char *retval;
if(timer = Util_GetHandledData(timers, this_timer))
{
- retval = CCTKi_TimerGet(this_timer, timer);
- }
- else
- {
- retval = NULL;
+ CCTKi_TimerGet(this_timer, timer, info);
}
-
- return retval;
+
+ return;
}
-static char *CCTKi_TimerGet(int this_timer, t_Timer *timer)
+
+
+
+static void CCTKi_TimerGet(int this_timer, t_Timer *timer, t_TimerInfo *info)
{
t_TimerFuncs *funcs;
int handle;
- char this_val[100];
- char *retval;
- char *temp;
- int retlength;
-
- retlength = 0;
- retval = NULL;
+ int total_vars;
if(timer)
{
if(timer->data)
{
+ total_vars = 0;
/* Start the timer info for this timer */
for(handle = 0; handle < n_timertypes; handle++)
{
funcs = (t_TimerFuncs *)Util_GetHandledData(handles, handle);
- sprintf(this_val, "%lf", funcs->get(this_timer, timer->data[handle]));
- retlength += 2+strlen(this_val);
- temp = realloc(retval, retlength);
- if(temp)
- {
- retval = temp;
-
- /* If this isn't the first one, add a couple of spaces. */
- if(retlength > 2+strlen(this_val)) strcat(retval, " ");
-
- strcat(retval, this_val);
- }
+ funcs->get(this_timer, timer->data[handle], &(info->vals[total_vars]));
+
+ total_vars += funcs->info.n_vals;
}
}
}
- return retval;
}
+t_TimerInfo *CCTK_TimerCreateInfo(void)
+{
+ t_TimerInfo *retval;
+
+ retval = (t_TimerInfo *)malloc(sizeof(t_TimerInfo));
+ if(retval)
+ {
+ retval->n_vals = n_timer_vals;
+
+ retval->vals = (t_TimerVal *)malloc(n_timer_vals*sizeof(t_TimerVal));
+
+ if(! retval->vals)
+ {
+ free(retval);
+ retval = NULL;
+ }
+ }
+
+ return retval;
+}
+
+void CCTK_TimerDestroyInfo(t_TimerInfo *info)
+{
+ if(info)
+ {
+ if(info->vals)
+ {
+ free(info->vals);
+ info->vals = NULL;
+ }
+ free(info);
+ }
+}
+