1 | package tbf; |
1 | package tbf; |
|
|
2 | |
|
|
3 | use List::Util (); |
2 | |
4 | |
3 | # kind of token-bucket-filter |
5 | # kind of token-bucket-filter |
4 | |
6 | |
5 | our $max_per_client = $::TBF_MAX_PER_CLIENT || 118000; |
7 | our $max_per_client = $::TBF_MAX_PER_CLIENT || 118000; |
6 | |
8 | |
… | |
… | |
9 | my %arg = @_; |
11 | my %arg = @_; |
10 | my $self = bless \%arg, $class; |
12 | my $self = bless \%arg, $class; |
11 | |
13 | |
12 | $self->{maxbucket} ||= $::TBF_MAX_BUCKET || $self->{rate} * 5; # max bucket |
14 | $self->{maxbucket} ||= $::TBF_MAX_BUCKET || $self->{rate} * 5; # max bucket |
13 | $self->{minbucket} ||= $self->{rate}; # minimum bucket to share |
15 | $self->{minbucket} ||= $self->{rate}; # minimum bucket to share |
14 | $self->{interval} ||= $::BUFSIZE / $max_per_client; # good default interval |
16 | $self->{interval} ||= List::Util::min 0.1, $::BUFSIZE / $max_per_client; # good default interval |
15 | |
17 | |
16 | if ($self->{rate}) { |
18 | if ($self->{rate}) { |
17 | $self->{w} = EV::periodic 0, $self->{interval}, undef, sub { |
19 | $self->{w} = EV::periodic 0, $self->{interval}, undef, sub { |
18 | $self->inject ($self->{rate} * $self->{interval}); |
20 | $self->inject ($self->{rate} * $self->{interval}); |
19 | }; |
21 | }; |