diff options
-rw-r--r-- | src/include/CactusTimers.h | 36 | ||||
-rw-r--r-- | src/main/DefaultTimers.c | 79 | ||||
-rw-r--r-- | src/util/CactusTimers.c | 122 |
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); + } +} + |