From 2d776fcd61be168e1ff0ff2e4a5e71835e7cea19 Mon Sep 17 00:00:00 2001 From: oroborus Date: Sat, 28 Jun 2008 16:38:35 +0000 Subject: - prekopanie adresarovej struktury, prva cast git-svn-id: http://opensvn.csie.org/tuxanci_ng@77 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e --- src/base/myTimer.c | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 src/base/myTimer.c (limited to 'src/base/myTimer.c') diff --git a/src/base/myTimer.c b/src/base/myTimer.c new file mode 100644 index 0000000..7913f8b --- /dev/null +++ b/src/base/myTimer.c @@ -0,0 +1,148 @@ + +#include +#include +#include +#include +#include +#include + +#include "base/main.h" +#include "base/list.h" +#include "base/myTimer.h" + +#ifndef PUBLIC_SERVER +#include "client/interface.h" +#endif + +static struct timeval start = { .tv_sec = 0, .tv_usec = 0 }; + +list_t* newTimer() +{ + return newList(); +} + +void restartTimer() +{ + gettimeofday(&start, NULL); +} + + +my_time_t getMyTime() +{ + struct timeval now; + my_time_t ticks; + + if( start.tv_sec == 0 && start.tv_usec == 0 ) + { + restartTimer(); + } + + gettimeofday(&now, NULL); + + ticks = (now.tv_sec-start.tv_sec)*1000+(now.tv_usec-start.tv_usec)/1000; + + //printf("-> %d\n", ticks); + return ticks; +} + +my_timer_t* newTimerItem(int type, void (*fce)(void *p), void *arg, my_time_t my_time) +{ + static int new_id = 0; + my_timer_t *new; + + assert( fce != NULL ); + + new = malloc( sizeof(my_timer_t) ); + memset(new, 0, sizeof(my_timer_t)); + + new->id = new_id++; + new->type = type; + new->fce = fce; + new->arg = arg; + + new->createTime = getMyTime(); + new->time = my_time; + + return new; +} + +static void destroyTimerItem(my_timer_t *p) +{ + assert( p != NULL ); + free(p); +} + +int addTaskToTimer(list_t *listTimer, int type, void (*fce)(void *p), void *arg, my_time_t my_time) +{ + my_timer_t *new; + + new = newTimerItem(type, fce, arg, my_time); + addList(listTimer, new); + + return new->id; +} + +void eventTimer(list_t *listTimer) +{ + int i; + my_timer_t *thisTimer; + my_time_t currentTime; + + currentTime = getMyTime(); + + for( i = 0 ; i < listTimer->count ; i++ ) + { + thisTimer = (my_timer_t *)listTimer->list[i]; + assert( thisTimer != NULL ); + + switch( thisTimer->type ) + { + case TIMER_ONE: + if( currentTime >= thisTimer->createTime + thisTimer->time ) + { + thisTimer->fce(thisTimer->arg); + + delListItem(listTimer, i, free); + i--; + } + break; + case TIMER_PERIODIC: + if( currentTime >= thisTimer->createTime + thisTimer->time ) + { + thisTimer->fce(thisTimer->arg); + thisTimer->createTime = getMyTime(); + } + break; + default : + assert( ! "bad timer type !" ); + break; + } + + } +} + +void delTimer(list_t *listTimer, int id) +{ + int i; + my_timer_t *thisTimer; + + for( i = 0 ; i < listTimer->count ; i++ ) + { + thisTimer = (my_timer_t *)listTimer->list[i]; + assert( thisTimer != NULL ); + + if( thisTimer->id == id ) + { + delListItem(listTimer, i, free); + return; + } + } + + assert( ! "Uloha s id nenajdena !" ); +} + + +void destroyTimer(list_t *listTimer) +{ + destroyListItem(listTimer, destroyTimerItem); +} -- cgit v1.2.3