- delta_time = now.value - av->last_update__.value;
- delta_avail = (delta_time * ((unsigned long long) av->available_bytes_per_s__)) / 1000LL;
- if (av->consumption_since_last_update__ >= delta_avail)
- {
- av->consumption_since_last_update__ -= delta_avail;
- av->last_update__ = now;
- }
- else
- {
- left_bytes = delta_avail - av->consumption_since_last_update__;
- avail_per_ms = ((unsigned long long) av->available_bytes_per_s__) / 1000LL;
- if (avail_per_ms > 0)
- {
- left_time_ms = left_bytes / avail_per_ms;
- if (left_time_ms > ((unsigned long long) av->max_carry_s__) * 1000LL)
- {
- /* need to limit accumulation of unused bandwidth */
- left_time_ms = ((unsigned long long) av->max_carry_s__) * 1000LL;
- if (left_time_ms * avail_per_ms < GNUNET_SERVER_MAX_MESSAGE_SIZE)
- {
- /* need to still allow GNUNET_SERVER_MAX_MESSAGE_SIZE accumulation */
- if (left_bytes > GNUNET_SERVER_MAX_MESSAGE_SIZE)
- left_bytes = GNUNET_SERVER_MAX_MESSAGE_SIZE;
- left_time_ms = left_bytes / avail_per_ms;
- }
- }
- }
- else
- {
- left_time_ms = 0;
- }
- av->consumption_since_last_update__ = 0;
- av->last_update__.value = now.value - left_time_ms;
- }
+ delta_time = now.abs_value - av->last_update__.abs_value;
+ delta_avail =
+ (delta_time * ((unsigned long long) av->available_bytes_per_s__) +
+ 500LL) / 1000LL;
+ av->consumption_since_last_update__ -= delta_avail;
+ av->last_update__ = now;
+ if (av->consumption_since_last_update__ < 0)
+ {
+ left_bytes = -av->consumption_since_last_update__;
+ max_carry = av->available_bytes_per_s__ * av->max_carry_s__;
+ if (max_carry < GNUNET_SERVER_MAX_MESSAGE_SIZE)
+ max_carry = GNUNET_SERVER_MAX_MESSAGE_SIZE;
+ if (max_carry > left_bytes)
+ av->consumption_since_last_update__ = -left_bytes;
+ else
+ av->consumption_since_last_update__ = -max_carry;
+ }
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Tracker %p updated, have %u Bps, last update was %llu ms ago\n", av,
+ (unsigned int) av->available_bytes_per_s__,
+ (unsigned long long) delta_time);