diff options
author | vi117747 <none@none> | 2007-01-18 02:23:57 -0800 |
---|---|---|
committer | vi117747 <none@none> | 2007-01-18 02:23:57 -0800 |
commit | 2c2c41837e330b002c4220a39638150db504fe0e (patch) | |
tree | c7b51802e672ee52606064042a36dae866520c0d /usr/src/lib/libsip/common/sip_timeout.c | |
parent | 81eba2fddf0016dd9d1a1a01d7b3e4829fe7b074 (diff) | |
download | illumos-joyent-2c2c41837e330b002c4220a39638150db504fe0e.tar.gz |
6480199 header files in libsip needs clean-up
6481951 SIP timer doesn't schedule timeouts accurately
6484530 Memory leak in deleting partial dialogs
Diffstat (limited to 'usr/src/lib/libsip/common/sip_timeout.c')
-rw-r--r-- | usr/src/lib/libsip/common/sip_timeout.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/usr/src/lib/libsip/common/sip_timeout.c b/usr/src/lib/libsip/common/sip_timeout.c index b60cb0b1de..2fd526e8a8 100644 --- a/usr/src/lib/libsip/common/sip_timeout.c +++ b/usr/src/lib/libsip/common/sip_timeout.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -29,13 +29,9 @@ /* * Simple implementation of timeout functionality. The granuality is a sec */ -#include <stdio.h> #include <pthread.h> -#include <sys/errno.h> #include <stdlib.h> -#include "sip_miscdefs.h" - uint_t sip_timeout(void *arg, void (*callback_func)(void *), struct timeval *timeout_time); boolean_t sip_untimeout(uint_t); @@ -177,7 +173,8 @@ sip_timeout(void *arg, void (*callback_func)(void *), struct timeval *timeout_time) { sip_timeout_t *new_timeout; - sip_timeout_t *current, *last; + sip_timeout_t *current; + sip_timeout_t *last; hrtime_t future_time; uint_t tid; #ifdef __linux__ @@ -310,13 +307,21 @@ sip_timer_thr(void *arg) hrtime_t current_time; hrtime_t next_timeout; hrtime_t delta; + struct timeval tim; #ifdef __linux__ struct timespec tspec; #endif - to.tv_sec = time(NULL) + 5; - to.tv_nsec = 0; + delta = (hrtime_t)5 * NANOSEC; (void) pthread_mutex_lock(&timeout_mutex); for (;;) { + (void) gettimeofday(&tim, NULL); + to.tv_sec = tim.tv_sec + (delta / NANOSEC); + to.tv_nsec = (hrtime_t)(tim.tv_usec * MILLISEC) + + (delta % NANOSEC); + if (to.tv_nsec > NANOSEC) { + to.tv_sec += (to.tv_nsec / NANOSEC); + to.tv_nsec %= NANOSEC; + } (void) pthread_cond_timedwait(&timeout_cond_var, &timeout_mutex, &to); /* @@ -336,8 +341,6 @@ again: delta = next_timeout - current_time; if (delta <= 0) goto again; - to.tv_sec = time(NULL) + (delta / NANOSEC); - to.tv_nsec = delta % NANOSEC; } /* NOTREACHED */ return ((void *)0); |