Introduce time_offset() helper and replace open-coded versions in timer.c
This function takes a struct timeval and offsets it by a (potentially fractional) number of seconds, given as a 'double'.
This commit is contained in:
@@ -74,6 +74,7 @@ double BX_time_diff (struct timeval, struct timeval);
|
||||
double time_since(const struct timeval *tv_from);
|
||||
double time_until(const struct timeval *tv_to);
|
||||
int time_cmp(const struct timeval *a, const struct timeval *b);
|
||||
struct timeval *time_offset(struct timeval *tv, double offset);
|
||||
char * BX_plural (int);
|
||||
int BX_time_to_next_minute (void);
|
||||
char * BX_remove_trailing_spaces (char *);
|
||||
|
||||
@@ -1747,6 +1747,26 @@ int time_cmp(const struct timeval *a, const struct timeval *b)
|
||||
return (a->tv_sec > b->tv_sec) - (a->tv_sec < b->tv_sec);
|
||||
}
|
||||
|
||||
/* Add an offset, in seconds, to a timeval */
|
||||
struct timeval *time_offset(struct timeval *tv, double offset)
|
||||
{
|
||||
time_t seconds = offset; /* Discards fractional part */
|
||||
|
||||
offset -= seconds;
|
||||
if (offset < 0.0)
|
||||
{
|
||||
/* This ensures we never make tv_usec go negative, since it might be unsigned. */
|
||||
offset += 1.0;
|
||||
seconds -= 1;
|
||||
}
|
||||
tv->tv_usec += offset * 1000000.0;
|
||||
seconds += tv->tv_usec / 1000000;
|
||||
tv->tv_usec %= 1000000;
|
||||
tv->tv_sec += seconds;
|
||||
|
||||
return tv;
|
||||
}
|
||||
|
||||
int BX_time_to_next_minute (void)
|
||||
{
|
||||
time_t now = time(NULL);
|
||||
|
||||
@@ -231,18 +231,7 @@ extern void ExecuteTimers (void)
|
||||
current->events--;
|
||||
case -1:
|
||||
{
|
||||
#if 1
|
||||
double milli, seconds;
|
||||
milli = current->interval * 1000 * 1000 + current->time.tv_usec;
|
||||
seconds = current->time.tv_sec + (milli / 1000000);
|
||||
milli = ((unsigned long)current) % 1000000;
|
||||
current->time.tv_sec = seconds;
|
||||
current->time.tv_usec = milli;
|
||||
#else
|
||||
current->time.tv_usec += (current->interval * 1000);
|
||||
current->time.tv_sec += (current->time.tv_usec / 1000000);
|
||||
current->time.tv_usec %= 1000000;
|
||||
#endif
|
||||
time_offset(¤t->time, current->interval);
|
||||
schedule_timer(current);
|
||||
break;
|
||||
}
|
||||
@@ -464,24 +453,11 @@ char *BX_add_timer(int update, char *refnum_want, double when, long events, int
|
||||
{
|
||||
TimerList *ntimer, *otimer = NULL;
|
||||
char refnum_got[REFNUM_MAX+1] = "";
|
||||
double seconds = 0.0, milli = 0.0;
|
||||
extern double fmod(double, double);
|
||||
|
||||
ntimer = (TimerList *) new_malloc(sizeof(TimerList));
|
||||
|
||||
get_time(&ntimer->time);
|
||||
#if 1
|
||||
milli = when * 1000 + ntimer->time.tv_usec;
|
||||
seconds = ntimer->time.tv_sec + (milli / 1000000);
|
||||
|
||||
milli = ((unsigned long)milli) % 1000000;
|
||||
ntimer->time.tv_sec = seconds;
|
||||
ntimer->time.tv_usec = milli;
|
||||
#else
|
||||
ntimer->time.tv_usec += (unsigned long)when;
|
||||
ntimer->time.tv_sec += ((when + ntimer->time.tv_usec) / 1000);
|
||||
ntimer->time.tv_usec %= 1000;
|
||||
#endif
|
||||
time_offset(&ntimer->time, when / 1000.0);
|
||||
|
||||
ntimer->interval = when / 1000;
|
||||
ntimer->events = events;
|
||||
|
||||
Reference in New Issue
Block a user