--- rate_control.c 2010-08-04 15:58:08.000000000 +0800 +++ rate_control.c89 2010-08-04 15:57:59.000000000 +0800 @@ -77,7 +77,7 @@ const bool is_nonblocking ) { - int64_t new_rate_limit; + ssize_t new_rate_limit; /* pre-conditions */ pgm_assert (NULL != bucket); @@ -87,6 +87,7 @@ return TRUE; pgm_spinlock_lock (&bucket->spinlock); + { pgm_time_t now = pgm_time_update_now(); pgm_time_t time_since_last_rate_check = now - bucket->last_rate_check; @@ -95,7 +96,9 @@ if (time_since_last_rate_check > pgm_msecs(1)) new_rate_limit = bucket->rate_per_msec; else { +#pragma warning( disable : 4244 ) new_rate_limit = bucket->rate_limit + ((bucket->rate_per_msec * time_since_last_rate_check) / 1000UL); +#pragma warning( default : 4244 ) if (new_rate_limit > bucket->rate_per_msec) new_rate_limit = bucket->rate_per_msec; } @@ -105,7 +108,9 @@ if (time_since_last_rate_check > pgm_secs(1)) new_rate_limit = bucket->rate_per_sec; else { +#pragma warning( disable : 4244 ) new_rate_limit = bucket->rate_limit + ((bucket->rate_per_sec * time_since_last_rate_check) / 1000000UL); +#pragma warning( default : 4244 ) if (new_rate_limit > bucket->rate_per_sec) new_rate_limit = bucket->rate_per_sec; } @@ -132,6 +137,7 @@ } pgm_spinlock_unlock (&bucket->spinlock); return TRUE; + } } pgm_time_t @@ -147,12 +153,14 @@ return 0; pgm_spinlock_lock (&bucket->spinlock); + { const pgm_time_t now = pgm_time_update_now(); const pgm_time_t time_since_last_rate_check = now - bucket->last_rate_check; const int64_t bucket_bytes = bucket->rate_limit + pgm_to_secs (bucket->rate_per_sec * time_since_last_rate_check) - n; pgm_spinlock_unlock (&bucket->spinlock); return bucket_bytes >= 0 ? 0 : (bucket->rate_per_sec / -bucket_bytes); + } } /* eof */