Skip to content

Commit

Permalink
improved Mojo::IOLoop::Client not to start timers before the event lo…
Browse files Browse the repository at this point in the history
…op is running
  • Loading branch information
kraih committed Jan 9, 2015
1 parent b5bd406 commit 2628b2a
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 34 deletions.
4 changes: 3 additions & 1 deletion Changes
@@ -1,6 +1,8 @@

5.72 2015-01-08
5.72 2015-01-09
- Improved Mojo::Reactor::EV performance slightly.
- Improved Mojo::IOLoop::Client not to start timers before the event loop
is running.

5.71 2015-01-01
- Updated Net::DNS::Native requirement to 0.15 for some important bug fixes.
Expand Down
62 changes: 33 additions & 29 deletions lib/Mojo/IOLoop/Client.pm
Expand Up @@ -32,36 +32,9 @@ has reactor => sub { Mojo::IOLoop->singleton->reactor };
sub DESTROY { shift->_cleanup }

sub connect {
my $self = shift;
my $args = ref $_[0] ? $_[0] : {@_};

# Timeout
my ($self, $args) = (shift, ref $_[0] ? $_[0] : {@_});
weaken $self;
my $reactor = $self->reactor;
$self->{timer} = $reactor->timer($args->{timeout} || 10,
sub { $self->emit(error => 'Connect timeout') });

# Blocking name resolution
$_ && s/[[\]]//g for @$args{qw(address socks_address)};
my $address = $args->{socks_address} || ($args->{address} ||= '127.0.0.1');
return $reactor->next_tick(sub { $self && $self->_connect($args) })
if !NDN || $args->{handle};

# Non-blocking name resolution
my $handle = $self->{dns} = $NDN->getaddrinfo($address, _port($args),
{protocol => IPPROTO_TCP, socktype => SOCK_STREAM});
$reactor->io(
$handle => sub {
my $reactor = shift;

$reactor->remove($self->{dns});
my ($err, @res) = $NDN->get_result(delete $self->{dns});
return $self->emit(error => "Can't resolve: $err") if $err;

$args->{addr_info} = \@res;
$self->_connect($args);
}
)->watch($handle, 1, 0);
$self->reactor->next_tick(sub { $self && $self->_resolve($args) });
}

sub _cleanup {
Expand Down Expand Up @@ -110,6 +83,37 @@ sub _ready {
$self->_try_socks($args);
}

sub _resolve {
my ($self, $args) = @_;

# Timeout
weaken $self;
my $reactor = $self->reactor;
$self->{timer} = $reactor->timer($args->{timeout} || 10,
sub { $self->emit(error => 'Connect timeout') });

# Blocking name resolution
$_ && s/[[\]]//g for @$args{qw(address socks_address)};
my $address = $args->{socks_address} || ($args->{address} ||= '127.0.0.1');
return $self->_connect($args) if !NDN || $args->{handle};

# Non-blocking name resolution
my $handle = $self->{dns} = $NDN->getaddrinfo($address, _port($args),
{protocol => IPPROTO_TCP, socktype => SOCK_STREAM});
$reactor->io(
$handle => sub {
my $reactor = shift;

$reactor->remove($self->{dns});
my ($err, @res) = $NDN->get_result(delete $self->{dns});
return $self->emit(error => "Can't resolve: $err") if $err;

$args->{addr_info} = \@res;
$self->_connect($args);
}
)->watch($handle, 1, 0);
}

sub _socks {
my ($self, $args) = @_;

Expand Down
3 changes: 1 addition & 2 deletions lib/Mojo/IOLoop/Server.pm
Expand Up @@ -39,8 +39,7 @@ sub generate_port {
sub handle { shift->{handle} }

sub listen {
my $self = shift;
my $args = ref $_[0] ? $_[0] : {@_};
my ($self, $args) = (shift, ref $_[0] ? $_[0] : {@_});

# Look for reusable file descriptor
my $address = $args->{address} || '0.0.0.0';
Expand Down
3 changes: 1 addition & 2 deletions lib/Mojolicious/Controller.pm
Expand Up @@ -211,8 +211,7 @@ sub req { shift->tx->req }
sub res { shift->tx->res }

sub respond_to {
my $self = shift;
my $args = ref $_[0] ? $_[0] : {@_};
my ($self, $args) = (shift, ref $_[0] ? $_[0] : {@_});

# Find target
my $target;
Expand Down

0 comments on commit 2628b2a

Please sign in to comment.