diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-07-15 23:00:47 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-07-15 23:00:47 +0000 |
commit | ff15e0fa53156b9994da3f726bfe91232de6195a (patch) | |
tree | 896015cada90b49858e1bf6503d9583704a56179 /sched.c | |
parent | c05cf07847cb384ba66aa29d5eda580eda413ffb (diff) |
add a library of timeval manipulation functions, and change a large number of usses to use the new functions (bug #4504)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6146 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'sched.c')
-rwxr-xr-x | sched.c | 103 |
1 files changed, 32 insertions, 71 deletions
@@ -31,6 +31,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/logger.h" #include "asterisk/channel.h" #include "asterisk/lock.h" +#include "asterisk/utils.h" /* Determine if a is sooner than b */ #define SOONER(a,b) (((b).tv_sec > (a).tv_sec) || \ @@ -148,18 +149,13 @@ int ast_sched_wait(struct sched_context *con) * Return the number of milliseconds * until the next scheduled event */ - struct timeval tv; int ms; DEBUG(ast_log(LOG_DEBUG, "ast_sched_wait()\n")); ast_mutex_lock(&con->lock); if (!con->schedq) { ms = -1; - } else if (gettimeofday(&tv, NULL) < 0) { - /* This should never happen */ - ms = 0; } else { - ms = (con->schedq->when.tv_sec - tv.tv_sec) * 1000; - ms += (con->schedq->when.tv_usec - tv.tv_usec) / 1000; + ms = ast_tvdiff_ms(con->schedq->when, ast_tvnow()); if (ms < 0) ms = 0; } @@ -194,41 +190,21 @@ static void schedule(struct sched_context *con, struct sched *s) con->schedcnt++; } -static inline int sched_settime(struct timeval *tv, int when) +/* + * given the last event *tv and the offset in milliseconds 'when', + * computes the next value, + */ +static int sched_settime(struct timeval *tv, int when) { - struct timeval tv_tmp; - long error_sec, error_usec; + struct timeval now = ast_tvnow(); - if (gettimeofday(&tv_tmp, NULL) < 0) { - /* This shouldn't ever happen, but let's be sure */ - ast_log(LOG_NOTICE, "gettimeofday() failed!\n"); - return -1; - } /*ast_log(LOG_DEBUG, "TV -> %lu,%lu\n", tv->tv_sec, tv->tv_usec);*/ - if (((unsigned long)(tv->tv_sec) > 0)||((unsigned long)(tv->tv_usec) > 0)) { - if ((unsigned long)(tv_tmp.tv_usec) < (unsigned long)(tv->tv_usec)) { - tv_tmp.tv_usec += 1000000; - tv_tmp.tv_sec -= 1; - } - error_sec = (unsigned long)(tv_tmp.tv_sec) - (unsigned long)(tv->tv_sec); - error_usec = (unsigned long)(tv_tmp.tv_usec) - (unsigned long)(tv->tv_usec); - } else { - /*ast_log(LOG_DEBUG, "Initializing error\n");*/ - error_sec = 0; - error_usec = 0; - } - /*ast_log(LOG_DEBUG, "ERROR -> %lu,%lu\n", error_sec, error_usec);*/ - if (error_sec * 1000 + error_usec / 1000 < when) { - tv->tv_sec = tv_tmp.tv_sec + (when/1000 - error_sec); - tv->tv_usec = tv_tmp.tv_usec + ((when % 1000) * 1000 - error_usec); - } else { + if (ast_tvzero(*tv)) /* not supplied, default to now */ + *tv = now; + *tv = ast_tvadd(*tv, ast_samp2tv(when, 1000)); + if (ast_tvcmp(*tv, now) < 0) { ast_log(LOG_DEBUG, "Request to schedule in the past?!?!\n"); - tv->tv_sec = tv_tmp.tv_sec; - tv->tv_usec = tv_tmp.tv_usec; - } - if (tv->tv_usec > 1000000) { - tv->tv_sec++; - tv->tv_usec-= 1000000; + *tv = now; } return 0; } @@ -251,8 +227,7 @@ int ast_sched_add(struct sched_context *con, int when, ast_sched_cb callback, vo tmp->callback = callback; tmp->data = data; tmp->resched = when; - tmp->when.tv_sec = 0; - tmp->when.tv_usec = 0; + tmp->when = ast_tv(0, 0); if (sched_settime(&tmp->when, when)) { sched_release(con, tmp); } else { @@ -315,9 +290,7 @@ void ast_sched_dump(const struct sched_context *con) * stderr */ struct sched *q; - struct timeval tv; - time_t s, ms; - gettimeofday(&tv, NULL); + struct timeval tv = ast_tvnow(); #ifdef SCHED_MAX_CACHE ast_log(LOG_DEBUG, "Asterisk Schedule Dump (%d in Q, %d Total, %d Cache)\n", con->schedcnt, con->eventcnt - 1, con->schedccnt); #else @@ -327,21 +300,15 @@ void ast_sched_dump(const struct sched_context *con) ast_log(LOG_DEBUG, "=============================================================\n"); ast_log(LOG_DEBUG, "|ID Callback Data Time (sec:ms) |\n"); ast_log(LOG_DEBUG, "+-----+-----------------+-----------------+-----------------+\n"); - q = con->schedq; - while(q) { - s = q->when.tv_sec - tv.tv_sec; - ms = q->when.tv_usec - tv.tv_usec; - if (ms < 0) { - ms += 1000000; - s--; - } + for (q = con->schedq; q; q = q->next) { + struct timeval delta = ast_tvsub(q->when, tv); + ast_log(LOG_DEBUG, "|%.4d | %-15p | %-15p | %.6ld : %.6ld |\n", - q->id, - q->callback, - q->data, - (long)s, - (long)ms); - q=q->next; + q->id, + q->callback, + q->data, + delta.tv_sec, + delta.tv_usec); } ast_log(LOG_DEBUG, "=============================================================\n"); @@ -362,15 +329,13 @@ int ast_sched_runq(struct sched_context *con) for(;;) { if (!con->schedq) break; - if (gettimeofday(&tv, NULL)) { - /* This should never happen */ - ast_log(LOG_NOTICE, "gettimeofday() failed!\n"); - break; - } - /* We only care about millisecond accuracy anyway, so this will - help us get more than one event at one time if they are very - close together. */ - tv.tv_usec += 1000; + + /* schedule all events which are going to expire within 1ms. + * We only care about millisecond accuracy anyway, so this will + * help us get more than one event at one time if they are very + * close together. + */ + tv = ast_tvadd(ast_tvnow(), ast_tv(0, 1000)); if (SOONER(con->schedq->when, tv)) { current = con->schedq; con->schedq = con->schedq->next; @@ -414,7 +379,6 @@ long ast_sched_when(struct sched_context *con,int id) { struct sched *s; long secs; - struct timeval now; DEBUG(ast_log(LOG_DEBUG, "ast_sched_when()\n")); ast_mutex_lock(&con->lock); @@ -425,11 +389,8 @@ long ast_sched_when(struct sched_context *con,int id) } secs=-1; if (s!=NULL) { - if (gettimeofday(&now, NULL)) { - ast_log(LOG_NOTICE, "gettimeofday() failed!\n"); - } else { - secs=s->when.tv_sec-now.tv_sec; - } + struct timeval now = ast_tvnow(); + secs=s->when.tv_sec-now.tv_sec; } ast_mutex_unlock(&con->lock); return secs; |