Skip to content

Commit

Permalink
Consolidate Prefork subclass into HTTP::Server::PSGI
Browse files Browse the repository at this point in the history
  • Loading branch information
miyagawa committed Jan 13, 2010
1 parent f3d1144 commit a3ac5f3
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 92 deletions.
47 changes: 44 additions & 3 deletions lib/HTTP/Server/PSGI.pm
Expand Up @@ -33,23 +33,46 @@ our $HasSendFile = !$ENV{PLACK_NO_SENDFILE} && try { require Sys::Sendfile; 1 };

sub new {
my($class, %args) = @_;

my $self = bless {
host => $args{host} || 0,
port => $args{port} || 8080,
timeout => $args{timeout} || 300,
max_keepalive_reqs => $args{max_keepalive_reqs} || 1,
keepalive_timeout => $args{keepalive_timeout} || 2,
server_software => $args{server_software} || "$class/$Plack::VERSION",
max_keepalive_reqs => $args{max_keepalive_reqs},
server_software => $args{server_software} || $class,
server_ready => $args{server_ready} || sub {},
max_workers => $args{max_workers} || 1,
max_reqs_per_child => $args{max_reqs_per_child} || 100,
}, $class;

if ($self->{max_workers} > 1) {
try {
require Parallel::Prefork;
$self->{prefork} = 1;
$self->{max_keepalive_reqs} ||= 100;
$self->{server_software} .= " (prefork)";
} catch {
die "You need to install Parallel::Prefork to run multi workers (max_workers=$self->{max_workers}): $_";
};
}

unless ($self->{prefork}) {
$self->{max_keepalive_reqs} ||= 1;
}

$self;
}

sub run {
my($self, $app) = @_;
$self->setup_listener();
$self->accept_loop($app);

if ($self->{prefork}) {
$self->run_prefork($app);
} else {
$self->accept_loop($app);
}
}

sub setup_listener {
Expand All @@ -65,6 +88,24 @@ sub setup_listener {
$self->{server_ready}->($self);
}

sub run_prefork {
my($self, $app) = @_;

my $pm = Parallel::Prefork->new({
max_workers => $self->{max_workers},
trap_signals => {
TERM => 'TERM',
HUP => 'TERM',
},
});
while ($pm->signal_received ne 'TERM') {
$pm->start and next;
$self->accept_loop($app, $self->{max_reqs_per_child});
$pm->finish;
}
$pm->wait_all_children;
}

sub accept_loop {
# TODO handle $max_reqs_per_child
my($self, $app, $max_reqs_per_child) = @_;
Expand Down
77 changes: 0 additions & 77 deletions lib/HTTP/Server/PSGI/Prefork.pm

This file was deleted.

5 changes: 3 additions & 2 deletions lib/Plack/Runner.pm
Expand Up @@ -104,8 +104,9 @@ sub run {
}

push @options, server_ready => sub {
my($server) = @_;
print STDERR ref($server), ": Accepting connections at http://$server->{host}:$server->{port}/\n";
my($args) = @_;
my $name = $args->{server_software} || ref($args); # $args is $server
print STDERR "$name: Accepting connections at http://$args->{host}:$args->{port}/\n";
};
}

Expand Down
8 changes: 1 addition & 7 deletions lib/Plack/Server/Standalone.pm
Expand Up @@ -7,13 +7,7 @@ use parent qw( HTTP::Server::PSGI );

sub new {
my($class, %args) = @_;

if ($args{max_workers}) {
require HTTP::Server::PSGI::Prefork;
return HTTP::Server::PSGI::Prefork->new(%args);
} else {
return HTTP::Server::PSGI->new(%args);
}
HTTP::Server::PSGI->new(%args);
}

1;
Expand Down
4 changes: 2 additions & 2 deletions lib/Plack/Test/Suite.pm
Expand Up @@ -514,13 +514,13 @@ sub runtests {
}

sub run_server_tests {
my($class, $server, $server_port, $http_port) = @_;
my($class, $server, $server_port, $http_port, %args) = @_;

if (ref $server ne 'CODE') {
my $server_class = $server;
$server = sub {
my($port, $app) = @_;
my $server = Plack::Loader->load($server_class, port => $port, host => "127.0.0.1");
my $server = Plack::Loader->load($server_class, port => $port, host => "127.0.0.1", %args);
$app = Plack::Middleware::Lint->wrap($app);
$server->run($app);
}
Expand Down
2 changes: 1 addition & 1 deletion t/Plack-Server/standalone-prefork.t
Expand Up @@ -10,6 +10,6 @@ use FindBin;
use Plack;
use Plack::Test::Suite;

Plack::Test::Suite->run_server_tests('Standalone::Prefork');
Plack::Test::Suite->run_server_tests('Standalone', undef, undef, max_workers => 10);
done_testing();

0 comments on commit a3ac5f3

Please sign in to comment.