From fd84f722129bff1f7bb88008b6477638bbc484e7 Mon Sep 17 00:00:00 2001 From: goodale Date: Tue, 14 Sep 1999 09:26:46 +0000 Subject: Start on the new timer stuff. Tom git-svn-id: http://svn.cactuscode.org/flesh/trunk@906 17b73243-c579-4c4c-a9d2-2d5706c11dac --- src/util/CactusTimers.c | 346 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 344 insertions(+), 2 deletions(-) (limited to 'src/util') diff --git a/src/util/CactusTimers.c b/src/util/CactusTimers.c index c91ca279..c50f7256 100644 --- a/src/util/CactusTimers.c +++ b/src/util/CactusTimers.c @@ -7,13 +7,18 @@ @enddesc @@*/ -#include "CactusTimers.h" -/* Joan */ + #include +#include + +#include "CactusTimers.h" +#include "StoreHandledData.h" static char *rcsid = "$Header$"; + + cTimer *CactusNewTimer(void) { cTimer *timer; @@ -23,6 +28,7 @@ cTimer *CactusNewTimer(void) return timer; } + void CactusStartTimer(cTimer *timer) { @@ -35,3 +41,339 @@ void CactusStopTimer(cTimer *timer) void CactusResetTimer(cTimer *timer) { } + + +typedef struct +{ + void *(*create)(int); + void (*destroy)(int, void *); + void (*start)(int, void *); + void (*stop)(int, void *); + void (*reset)(int, void *); + char *(*get)(int, void *); + void (*set)(int, void *, const char *); +} t_TimerFuncs; + +typedef struct +{ + void **data; +} t_Timer; + + +static int n_timertypes = 0; +static cHandledData *handles = NULL; + +static int n_timers = 0; +static cHandledData *timers = NULL; + + /*@@ + @routine CCTK_TimerRegister + @date Wed Sep 1 10:09:27 1999 + @author Tom Goodale + @desc + Registers a new timer function. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +int CCTK_TimerRegister(const char *name, t_TimerFuncs *functions) +{ + int handle; + t_TimerFuncs *newfuncs; + + newfuncs = (t_TimerFuncs *)malloc(sizeof(t_TimerFuncs)); + + if(newfuncs) + { + newfuncs->create = functions->create; + newfuncs->destroy = functions->destroy; + newfuncs->start = functions->start; + newfuncs->stop = functions->stop; + newfuncs->reset = functions->reset; + newfuncs->get = functions->get; + newfuncs->set = functions->set; + } + + handle = Util_NewHandle(&handles, name, newfuncs); + n_timertypes++; + + return handle; +} + + + /*@@ + @routine CCTK_TimerCreate + @date Wed Sep 1 10:09:57 1999 + @author Tom Goodale + @desc + Creates a new timer + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +int CCTK_TimerCreate(const char *name) +{ + int retval; + t_Timer *timer; + t_TimerFuncs *funcs; + int this_timer; + int handle; + + this_timer = -3; + + if(Util_GetHandle(timers, name, (void **)&timer) > -1) + { + /* Handle already exists */ + retval = -3; + } + else + { + timer = (t_Timer *)malloc(sizeof(t_Timer)); + + if(timer) + { + timer->data = (void **)malloc(n_timertypes*sizeof(void *)); + + if(timer->data) + { + /* Store the data structure for this timer */ + this_timer = Util_NewHandle(&timers, name, timer); + + /* Create the timer info for this timer */ + for(handle = 0; handle < n_timertypes; handle++) + { + funcs = (t_TimerFuncs *)Util_GetHandledData(handles, handle); + + timer->data[handle] = funcs->create(this_timer); + } + retval = this_timer; + } + } + } + + return this_timer; +} + + /*@@ + @routine CCTK_TimerDestroy + @date Wed Sep 1 10:10:20 1999 + @author Tom Goodale + @desc + Destroys an old timer + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +void CCTK_TimerDestroy(const char *name) +{ + t_Timer *timer; + t_TimerFuncs *funcs; + int this_timer; + int handle; + + if(this_timer = Util_GetHandle(timers, name, (void **)&timer)) + { + if(timer) + { + if(timer->data) + { + /* Destroy the timer info for this timer */ + for(handle = 0; handle < n_timertypes; handle++) + { + funcs = (t_TimerFuncs *)Util_GetHandledData(handles, handle); + funcs->destroy(this_timer, timer->data[handle]); + } + free(timer->data); + free(timer); + Util_DeleteHandle(timers, this_timer); + } + } + } +} + + + /*@@ + @routine CCTK_TimerStart + @date Wed Sep 1 10:10:38 1999 + @author Tom Goodale + @desc + Starts a timer counting. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +void CCTK_TimerStart(const char *name) +{ + t_Timer *timer; + t_TimerFuncs *funcs; + int this_timer; + int handle; + + if(this_timer = Util_GetHandle(timers, name, (void **)&timer)) + { + if(timer) + { + if(timer->data) + { + /* Start the timer info for this timer */ + for(handle = 0; handle < n_timertypes; handle++) + { + funcs = (t_TimerFuncs *)Util_GetHandledData(handles, handle); + funcs->start(this_timer, timer->data[handle]); + } + } + } + } +} + + /*@@ + @routine CCTK_TimerStop + @date Wed Sep 1 10:10:38 1999 + @author Tom Goodale + @desc + Stops a timer counting. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +void CCTK_TimerStop(const char *name) +{ + t_Timer *timer; + t_TimerFuncs *funcs; + int this_timer; + int handle; + + if(this_timer = Util_GetHandle(timers, name, (void **)&timer)) + { + if(timer) + { + if(timer->data) + { + /* Stop the timer info for this timer */ + for(handle = 0; handle < n_timertypes; handle++) + { + funcs = (t_TimerFuncs *)Util_GetHandledData(handles, handle); + funcs->stop(this_timer, timer->data[handle]); + } + } + } + } +} + + /*@@ + @routine CCTK_TimerReset + @date Wed Sep 1 10:10:38 1999 + @author Tom Goodale + @desc + Resets a timer. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +void CCTK_TimerReset(const char *name) +{ + t_Timer *timer; + t_TimerFuncs *funcs; + int this_timer; + int handle; + + if(this_timer = Util_GetHandle(timers, name, (void **)&timer)) + { + if(timer) + { + if(timer->data) + { + /* Start the timer info for this timer */ + for(handle = 0; handle < n_timertypes; handle++) + { + funcs = (t_TimerFuncs *)Util_GetHandledData(handles, handle); + funcs->reset(this_timer, timer->data[handle]); + } + } + } + } +} + + /*@@ + @routine CCTK_TimerGet + @date Wed Sep 1 10:10:38 1999 + @author Tom Goodale + @desc + Gets the values of a timer. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +char *CCTK_TimerGet(const char *name) +{ + t_Timer *timer; + t_TimerFuncs *funcs; + int this_timer; + int handle; + char *this_val; + char *retval; + char *temp; + int retlength; + + retval = NULL; + + if(this_timer = Util_GetHandle(timers, name, (void **)&timer)) + { + if(timer) + { + if(timer->data) + { + /* Start the timer info for this timer */ + for(handle = 0; handle < n_timertypes; handle++) + { + funcs = (t_TimerFuncs *)Util_GetHandledData(handles, handle); + this_val = 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); + } + } + } + } + } + + return retval; + +} + + -- cgit v1.2.3