Skip to content

Commit

Permalink
small Mojo::IOLoop tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Nov 27, 2012
1 parent 24dfa65 commit 2ab4689
Showing 1 changed file with 15 additions and 14 deletions.
29 changes: 15 additions & 14 deletions lib/Mojo/IOLoop.pm
Expand Up @@ -33,19 +33,19 @@ $SIG{PIPE} = 'IGNORE';
__PACKAGE__->singleton->reactor;

sub acceptor {
my ($self, $server) = @_;
my ($self, $acceptor) = @_;
$self = $self->singleton unless ref $self;

# Find server for id
return $self->{servers}{$server} unless ref $server;
# Find acceptor for id
return $self->{acceptors}{$acceptor} unless ref $acceptor;

# Make sure connection manager is running
$self->_manager;

# New server
# New acceptor
my $id = $self->_id;
$self->{servers}{$id} = $server;
weaken $server->reactor($self->reactor)->{reactor};
$self->{acceptors}{$id} = $acceptor;
weaken $acceptor->reactor($self->reactor)->{reactor};
$self->{accepts} = $self->max_accepts if $self->max_accepts;

# Stop accepting
Expand Down Expand Up @@ -135,6 +135,7 @@ sub server {
my ($self, $cb) = (shift, pop);
$self = $self->singleton unless ref $self;

# New server
my $server = Mojo::IOLoop::Server->new;
weaken $self;
$server->on(
Expand Down Expand Up @@ -196,8 +197,8 @@ sub _accepting {

# Check connection limit
return if $self->{accepting};
my $servers = $self->{servers} ||= {};
return unless keys %$servers;
my $acceptors = $self->{acceptors} ||= {};
return unless keys %$acceptors;
my $i = keys %{$self->{connections}};
my $max = $self->max_connections;
return unless $i < $max;
Expand All @@ -207,15 +208,15 @@ sub _accepting {

# Check if multi-accept is desirable and start accepting
my $multi = $self->multi_accept;
$_->multi_accept($max < $multi ? 1 : $multi)->start for values %$servers;
$_->multi_accept($max < $multi ? 1 : $multi)->start for values %$acceptors;
$self->{accepting}++;
}

sub _id {
my $self = shift;
my $id;
do { $id = md5_sum('c' . time . rand 999) }
while $self->{connections}{$id} || $self->{servers}{$id};
while $self->{connections}{$id} || $self->{acceptors}{$id};
return $id;
}

Expand All @@ -234,7 +235,7 @@ sub _manage {

# Graceful stop
$self->_remove(delete $self->{manager})
unless keys %$connections || keys %{$self->{servers}};
unless keys %$connections || keys %{$self->{acceptors}};
$self->stop if $self->max_connections == 0 && keys %$connections == 0;
}

Expand All @@ -252,7 +253,7 @@ sub _not_accepting {
$self->$cb();

# Stop accepting
$_->stop for values %{$self->{servers} || {}};
$_->stop for values %{$self->{acceptors} || {}};
}

sub _remove {
Expand All @@ -262,8 +263,8 @@ sub _remove {
return unless my $reactor = $self->reactor;
return if $reactor->remove($id);

# Listen socket
if (delete $self->{servers}{$id}) { delete $self->{accepting} }
# Acceptor
if (delete $self->{acceptors}{$id}) { delete $self->{accepting} }

# Connection (stream needs to be deleted first)
else {
Expand Down

0 comments on commit 2ab4689

Please sign in to comment.