/** How many bytes at most can we read onto this connection? */
static int
-connection_bucket_read_limit(connection_t *conn)
+connection_bucket_read_limit(connection_t *conn, time_t now)
{
int base = connection_speaks_cells(conn) ?
CELL_NETWORK_SIZE : RELAY_PAYLOAD_SIZE;
return conn_bucket>=0 ? conn_bucket : 1<<14;
}
- if (connection_counts_as_relayed_traffic(conn, time(NULL)) &&
+ if (connection_counts_as_relayed_traffic(conn, now) &&
global_relayed_read_bucket <= global_read_bucket)
global_bucket = global_relayed_read_bucket;
/** How many bytes at most can we write onto this connection? */
int
-connection_bucket_write_limit(connection_t *conn)
+connection_bucket_write_limit(connection_t *conn, time_t now)
{
int base = connection_speaks_cells(conn) ?
CELL_NETWORK_SIZE : RELAY_PAYLOAD_SIZE;
return conn->outbuf_flushlen;
}
- if (connection_counts_as_relayed_traffic(conn, time(NULL)) &&
+ if (connection_counts_as_relayed_traffic(conn, now) &&
global_relayed_write_bucket <= global_write_bucket)
global_bucket = global_relayed_write_bucket;
/** A second has rolled over; increment buckets appropriately. */
void
-connection_bucket_refill(int seconds_elapsed)
+connection_bucket_refill(int seconds_elapsed, time_t now)
{
or_options_t *options = get_options();
smartlist_t *conns = get_connection_array();
int relayrate, relayburst;
- time_t now = time(NULL);
if (options->RelayBandwidthRate) {
relayrate = (int)options->RelayBandwidthRate;
if (at_most == -1) { /* we need to initialize it */
/* how many bytes are we allowed to read? */
- at_most = connection_bucket_read_limit(conn);
+ /* XXXX020 too many calls to time(). Do they hurt? */
+ at_most = connection_bucket_read_limit(conn, time(NULL));
}
bytes_in_buf = buf_capacity(conn->inbuf) - buf_datalen(conn->inbuf);
}
max_to_write = force ? (int)conn->outbuf_flushlen
- : connection_bucket_write_limit(conn);
+ : connection_bucket_write_limit(conn, now);
if (connection_speaks_cells(conn) &&
conn->state > OR_CONN_STATE_PROXY_READING) {
{
connection_t *conn;
int retval;
+ time_t now;
conn = smartlist_get(connection_array, i);
if (!conn->marked_for_close)
return 0; /* nothing to see here, move along */
- assert_connection_ok(conn, time(NULL));
+ now = time(NULL);
+ assert_connection_ok(conn, now);
assert_all_pending_dns_resolves_ok();
log_debug(LD_NET,"Cleaning up connection (fd %d).",conn->s);
if ((conn->s >= 0 || conn->linked_conn) && connection_wants_to_flush(conn)) {
/* s == -1 means it's an incomplete edge connection, or that the socket
* has already been closed as unflushable. */
- int sz = connection_bucket_write_limit(conn);
+ int sz = connection_bucket_write_limit(conn, now);
if (!conn->hold_open_until_flushed)
log_info(LD_NET,
"Conn (addr %s, fd %d, type %s, state %d) marked, but wants "
control_event_stream_bandwidth_used();
if (seconds_elapsed > 0)
- connection_bucket_refill(seconds_elapsed);
+ connection_bucket_refill(seconds_elapsed, now.tv_sec);
stats_prev_global_read_bucket = global_read_bucket;
stats_prev_global_write_bucket = global_write_bucket;
int retry_all_listeners(smartlist_t *replaced_conns,
smartlist_t *new_conns);
-int connection_bucket_write_limit(connection_t *conn);
+int connection_bucket_write_limit(connection_t *conn, time_t now);
int global_write_bucket_low(connection_t *conn, size_t attempt, int priority);
void connection_bucket_init(void);
-void connection_bucket_refill(int seconds_elapsed);
+void connection_bucket_refill(int seconds_elapsed, time_t now);
int connection_handle_read(connection_t *conn);