tor/src/common/token_bucket.h

76 lines
1.9 KiB
C
Raw Normal View History

/* Copyright (c) 2018, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
* \file token_bucket.h
* \brief Headers for token_bucket.c
**/
#ifndef TOR_TOKEN_BUCKET_H
#define TOR_TOKEN_BUCKET_H
#include "torint.h"
typedef struct token_bucket_t {
uint32_t rate;
int32_t burst;
int32_t read_bucket;
int32_t write_bucket;
uint32_t last_refilled_at_ts;
} token_bucket_t;
#define TOKEN_BUCKET_MAX_BURST INT32_MAX
void token_bucket_init(token_bucket_t *bucket,
uint32_t rate,
uint32_t burst,
uint32_t now_ts);
void token_bucket_adjust(token_bucket_t *bucket,
uint32_t rate, uint32_t burst);
void token_bucket_reset(token_bucket_t *bucket,
uint32_t now_ts);
#define TB_READ 1
#define TB_WRITE 2
int token_bucket_refill(token_bucket_t *bucket,
uint32_t now_ts);
int token_bucket_dec_read(token_bucket_t *bucket,
ssize_t n);
int token_bucket_dec_write(token_bucket_t *bucket,
ssize_t n);
void token_bucket_dec(token_bucket_t *bucket,
ssize_t n_read, ssize_t n_written);
static inline size_t token_bucket_get_read(const token_bucket_t *bucket);
static inline size_t
token_bucket_get_read(const token_bucket_t *bucket)
{
const ssize_t b = bucket->read_bucket;
return b >= 0 ? b : 0;
}
static inline size_t token_bucket_get_write(const token_bucket_t *bucket);
static inline size_t
token_bucket_get_write(const token_bucket_t *bucket)
{
const ssize_t b = bucket->write_bucket;
return b >= 0 ? b : 0;
}
#ifdef TOKEN_BUCKET_PRIVATE
/* To avoid making the rates too small, we consider units of "steps",
* where a "step" is defined as this many timestamp ticks. Keep this
* a power of two if you can. */
#define TICKS_PER_STEP 16
#endif
#endif /* TOR_TOKEN_BUCKET_H */