Skip to content

Instantly share code, notes, and snippets.

@stash
Created October 29, 2009 23:35
Show Gist options
  • Save stash/221938 to your computer and use it in GitHub Desktop.
Save stash/221938 to your computer and use it in GitHub Desktop.
package Plack::Server::CoroAnyEvent;
use warnings;
use strict;
use base 'Plack::Server::AnyEvent';
use Coro;
use Coro::AnyEvent;
use AnyEvent ();
sub _response_handler {
my $self = shift;
my $hdlr = $self->SUPER::_response_handler(@_);
return sub {
my ($app,$env) = @_;
$env->{'psgi.multithread'} = Plack::Util::TRUE;
my $cv = $self->{_ae_cv};
$cv->begin;
async {
eval { $hdlr->($app,$env) };
$cv->end;
};
return;
};
}
sub run {
my $self = shift;
$self->register_service(@_);
my $cv = $self->{_ae_cv} = AE::cv;
$cv->begin;
my $graceful_shutdown = AE::signal 'HUP', unblock_sub {
$cv->end;
delete $self->{listen_guard}; # shut down the TCP server
Coro::AnyEvent::sleep 60; # implicit cede
$cv->croak("Timeout during graceful shutdown");
};
my $sig_term = AE::signal 'TERM', sub {
$cv->croak("Terminating");
};
my $sig_int = AE::signal 'INT', sub {
$cv->croak("Interrupted");
};
$cv->recv;
}
1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment