aboutsummaryrefslogtreecommitdiffstats
path: root/sched.c
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-07-15 23:00:47 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-07-15 23:00:47 +0000
commitff15e0fa53156b9994da3f726bfe91232de6195a (patch)
tree896015cada90b49858e1bf6503d9583704a56179 /sched.c
parentc05cf07847cb384ba66aa29d5eda580eda413ffb (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-xsched.c103
1 files changed, 32 insertions, 71 deletions
diff --git a/sched.c b/sched.c
index 160637e88..84406f607 100755
--- a/sched.c
+++ b/sched.c
@@ -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;