From ea2ae241002dba7c27c305538c38280690753ae1 Mon Sep 17 00:00:00 2001 From: Pasqualino Ferrentino Date: Wed, 26 Sep 2007 15:17:21 +0200 Subject: [PATCH] Now the listeners are able to make a round robin between the clients --- src/lib/Bcd/Clients/ClientsListeners.pm | 49 +++++++++++++++++---------------- src/lib/Bcd/Clients/Listener.pm | 29 ++++++++----------- 2 files changed, 38 insertions(+), 40 deletions(-) diff --git a/src/lib/Bcd/Clients/ClientsListeners.pm b/src/lib/Bcd/Clients/ClientsListeners.pm index 21d86e5..c075b6e 100644 --- a/src/lib/Bcd/Clients/ClientsListeners.pm +++ b/src/lib/Bcd/Clients/ClientsListeners.pm @@ -41,7 +41,7 @@ use constant EOL => "\015\012"; use constant{ # Some constants to initialize the number of threads in this program... INITAL_LISTENERS => 1, - MAX_LISTENERS => 3, + MAX_LISTENERS => 5, }; @@ -97,31 +97,34 @@ sub a_new_client_has_arrived{ my ($self, $client) = @_; #ok, let's try to get a free listener for this client - my $served = 0; - while (!$served){ - - foreach (@{$self->{listeners}}){ - if ($_->try_to_serve_this_client - ($client, $self->{files_to_delete}) == 0){ - #ok... I am able to go on - $served = 1; - last; - } - } - - if (!$served){ - if ( scalar(@{$self->{listeners}}) < MAX_LISTENERS){ - #I can add a listener - my $listener = Bcd::Clients::Listener->new - ($self->{script}, $self->{queue_of_files_to_delete}); - push (@{$self->{listeners}}, $listener); - } else { - print $client "BCD busy, please wait..." . EOL; - sleep(2); - } + foreach (@{$self->{listeners}}){ + if ($_->are_you_free()){ + #ok... this listener is free + $_->serve_this_client($client, $self->{files_to_delete}); + return; #all ok, you can return } } + + + #can I create another listener? + if ( scalar(@{$self->{listeners}}) < MAX_LISTENERS){ + #I can add a listener + my $listener = Bcd::Clients::Listener->new + ($self->{script}, $self->{queue_of_files_to_delete}); + push (@{$self->{listeners}}, $listener); + + #This listener is obviously free + $listener->serve_this_client($client, $self->{files_to_delete}); + return; + + } else { + #I cannot create another listener... + #pick one at random + my $index = int(rand(scalar(@{$self->{listeners}}))); + $self->{listeners}->[$index]->serve_this_client($client, $self->{files_to_delete}); + } + } 1; diff --git a/src/lib/Bcd/Clients/Listener.pm b/src/lib/Bcd/Clients/Listener.pm index 0ac8bae..e8f9899 100644 --- a/src/lib/Bcd/Clients/Listener.pm +++ b/src/lib/Bcd/Clients/Listener.pm @@ -130,6 +130,7 @@ sub _listener_thread{ my $socket_num = fileno $socket; my $line = <$socket>; + next if !defined($line); chomp $line; #the first line is the command's name @@ -180,7 +181,7 @@ sub _listener_thread{ my $current_command = Bcd::Data::Model->instance()->get_command($line); if (!$current_command){ - print $socket "Unknown command: $_. Type \\q to exit." . EOL; + print $socket "Unknown command: $line. Type \\q to exit." . EOL; next; } @@ -298,27 +299,21 @@ sub _listener_thread{ } -sub try_to_serve_this_client{ +sub serve_this_client{ my ($self, $client, $files_to_delete) = @_; - #let's lock the object - lock($self); - - #ok, I should try to see the free state - - my $num_of_serving_clients = $self->{num_of_serving_clients}; - - if ($num_of_serving_clients != 0){ - return 1; - - } else { + my $num = fileno $client; + $files_to_delete->{$num} = $client; + $self->{q_streams}->enqueue($num); + return 0; - $files_to_delete->{fileno $client} = $client; - $self->{"q_streams"}->enqueue(fileno $client); +} - return 0; - } +sub are_you_free{ + my $self = shift; + lock($self); + return $self->{num_of_serving_clients} == 0 ? 1 : 0; } 1; -- 2.11.4.GIT