ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/myhttpd/tbf.pl
Revision: 1.8
Committed: Mon Jan 4 04:45:42 2010 UTC (14 years, 7 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.7: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 package tbf;
2    
3     # kind of token-bucket-filter
4    
5 root 1.8 our $max_per_client = $::TBF_MAX_PER_CLIENT || 118000;
6 root 1.1
7     sub new {
8     my $class = shift;
9     my %arg = @_;
10     my $self = bless \%arg, $class;
11    
12 root 1.7 $self->{maxbucket} ||= $self->{rate} * 60; # max bucket
13 root 1.1 $self->{minbucket} ||= $self->{rate}; # minimum bucket to share
14     $self->{interval} ||= $::BUFSIZE / $max_per_client; # good default interval
15    
16     if ($self->{rate}) {
17 root 1.6 $self->{w} = EV::periodic 0, $self->{interval}, undef, sub {
18     $self->inject ($self->{rate} * $self->{interval});
19     };
20 root 1.1 } else {
21     die "chaining not yet implemented\n";
22     }
23    
24     $self;
25     }
26    
27     sub inject {
28     my ($self, $bytes) = @_;
29    
30     $self->{bucket} += $bytes;
31    
32     while ($self->{bucket} >= $self->{minbucket}) {
33     if ($self->{waitw}) {
34     my $rate = $self->{bucket} / $self->{waitw};
35    
36     for my $v (values %{$self->{waitq}}) {
37     $self->{bucket} -= $rate * $v->[0];
38     $v->[1] += $rate * $v->[0];
39    
40     if ($v->[1] >= $v->[2]) {
41     $self->{bucket} += $v->[1] - $v->[2];
42     $v->[3]->();
43     }
44     }
45    
46     }
47 root 1.3 last;
48     }
49 root 1.1
50 root 1.3 if ($self->{maxbucket} < $self->{bucket}) {
51     ::unused_bandwidth ($self->{bucket} - $self->{maxbucket});
52     $self->{bucket} = $self->{maxbucket};
53 root 1.1 }
54     }
55    
56     my $_tbf_id;
57    
58     sub request {
59     my ($self, $bytes, $weight) = @_;
60    
61     $weight ||= 1;
62    
63 root 1.7 my $id = $_tbf_id++;
64     my $cb = Coro::rouse_cb;
65 root 1.2
66     $self->{waitw} += $weight;
67     $self->{waitq}{$id} = [$weight, 0, $bytes, sub {
68     delete $self->{waitq}{$id};
69     $self->{waitw} -= $weight;
70 root 1.7 &$cb;
71 root 1.2 }];
72    
73 root 1.7 Coro::rouse_wait;
74 root 1.1 }
75    
76     1;