… | |
… | |
13 | my $self = bless { |
13 | my $self = bless { |
14 | slots => $_[0], |
14 | slots => $_[0], |
15 | lastspb => 0, |
15 | lastspb => 0, |
16 | avgspb => 0, |
16 | avgspb => 0, |
17 | }, $class; |
17 | }, $class; |
18 | $self->{reschedule} = Event->timer( |
18 | $self->{reschedule} = EV::timer 10, 3, sub { $self->wake_next }; |
19 | after => 10, |
|
|
20 | interval => 3, |
|
|
21 | cb => sub { $self->wake_next }, |
|
|
22 | ); |
|
|
23 | $self; |
19 | $self; |
24 | } |
20 | } |
25 | |
21 | |
26 | sub start_transfer { |
22 | sub start_transfer { |
27 | my $self = shift; |
23 | my $self = shift; |
… | |
… | |
65 | $min += $_->[1]; |
61 | $min += $_->[1]; |
66 | } |
62 | } |
67 | last unless $self->{slots} > $min; |
63 | last unless $self->{slots} > $min; |
68 | my $transfer = shift @{$self->{wait}}; |
64 | my $transfer = shift @{$self->{wait}}; |
69 | $self->{lastspb} = $transfer->{spb}; |
65 | $self->{lastspb} = $transfer->{spb}; |
70 | $self->{avgspb} = $self->{avgspb} * 0.99 + $transfer->{spb} * 0.01; |
66 | $self->{avgspb} = $self->{avgspb} * 0.999 + $transfer->{spb} * 0.001; |
71 | $self->{started}++; |
67 | $self->{started}++; |
72 | $transfer->wake; |
68 | $transfer->wake; |
73 | last; |
69 | last; |
74 | } |
70 | } |
75 | } |
71 | } |
… | |
… | |
83 | } |
79 | } |
84 | |
80 | |
85 | sub waiters { |
81 | sub waiters { |
86 | $_[0]->sort; |
82 | $_[0]->sort; |
87 | @{$_[0]{wait}}; |
83 | @{$_[0]{wait}}; |
88 | } |
|
|
89 | |
|
|
90 | sub DESTROY { |
|
|
91 | my $self = shift; |
|
|
92 | |
|
|
93 | $self->{reschedule}->cancel; |
|
|
94 | } |
84 | } |
95 | |
85 | |
96 | package transfer; |
86 | package transfer; |
97 | |
87 | |
98 | use Coro::Timer (); |
88 | use Coro::Timer (); |