Skip to content

Commit

Permalink
improved Mojo::EventEmitter performance slightly
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Nov 25, 2011
1 parent 78359ea commit 41f6261
Show file tree
Hide file tree
Showing 20 changed files with 65 additions and 127 deletions.
2 changes: 1 addition & 1 deletion Changes
@@ -1,7 +1,7 @@
This file documents the revision history for Perl extension Mojolicious.

2.33 2011-11-25 00:00:00
- Improved Mojo::EventEmitter debug output.
- Improved Mojo::EventEmitter performance slightly.

2.32 2011-11-24 00:00:00
- Added EXPERIMENTAL error event to Mojo::IOWatcher.
Expand Down
4 changes: 1 addition & 3 deletions lib/Mojo/Base.pm
Expand Up @@ -56,9 +56,7 @@ sub new {
# so we optimize them by compiling our own code, don't be scared, we have
# tests for every single case
sub attr {
my $class = shift;
my $attrs = shift;
my $default = shift;
my ($class, $attrs, $default) = (shift, shift, shift);

# Check arguments
Carp::croak('Attribute generator called with too many arguments') if @_;
Expand Down
11 changes: 3 additions & 8 deletions lib/Mojo/Command.pm
Expand Up @@ -157,23 +157,18 @@ sub rel_file {

sub render_data {
my $self = shift;
my $data = shift;
$self->renderer->render($self->get_data($data), @_);
$self->renderer->render($self->get_data(shift), @_);
}

sub render_to_file {
my $self = shift;
my $data = shift;
my $path = shift;
my ($self, $data, $path) = (shift, shift, shift);
$self->write_file($path, $self->render_data($data, @_));
return $self;
}

sub render_to_rel_file {
my $self = shift;
my $data = shift;
my $path = shift;
$self->render_to_file($data, $self->rel_dir($path), @_);
$self->render_to_file(shift, $self->rel_dir(shift), @_);
}

# "The only thing I asked you to do for this party was put on clothes,
Expand Down
48 changes: 23 additions & 25 deletions lib/Mojo/EventEmitter.pm
Expand Up @@ -12,8 +12,29 @@ use constant DEBUG => $ENV{MOJO_EVENTEMITTER_DEBUG} || 0;
# Are we there yet?
# No
# ...Where are we going?"
sub emit { shift->_emit(0, @_) }
sub emit_safe { shift->_emit(1, @_) }
sub emit {
my ($self, $name) = (shift, shift);
warn 'EMIT ' . blessed($self) . " $name\n" if DEBUG;
return $self unless my $subscribers = $self->{events}->{$name};
for my $cb (@$subscribers) { $self->$cb(@_) }
return $self;
}

sub emit_safe {
my ($self, $name) = (shift, shift);

warn 'SAFE ' . blessed($self) . " $name\n" if DEBUG;
return $self unless my $subscribers = $self->{events}->{$name};
for my $cb (@$subscribers) {
if (!eval { $self->$cb(@_); 1 } && $name ne 'error') {
$self->once(error => sub { warn $_[1] })
unless $self->has_subscribers('error');
$self->emit_safe('error', qq/Event "$name" failed: $@/);
}
}

return $self;
}

sub has_subscribers { scalar @{shift->subscribers(shift)} }

Expand Down Expand Up @@ -58,29 +79,6 @@ sub unsubscribe {
return $self;
}

sub _emit {
my $self = shift;
my $safe = shift;
return $self unless my $s = $self->{events}->{my $name = shift};

# Emit event sequentially to all subscribers
warn 'EMIT ' . blessed($self) . " $name (" . scalar(@$s) . ")\n" if DEBUG;
for my $cb (@$s) {

# Unsafe
if (!$safe) { $self->$cb(@_) }

# Safe
elsif (!eval { $self->$cb(@_); 1 } && $name ne 'error') {
$self->once(error => sub { warn $_[1] })
unless $self->has_subscribers('error');
$self->emit_safe('error', qq/Event "$name" failed: $@/);
}
}

return $self;
}

1;
__END__
Expand Down
9 changes: 3 additions & 6 deletions lib/Mojo/Headers.pm
Expand Up @@ -87,8 +87,7 @@ sub accept_ranges { scalar shift->header('Accept-Ranges' => @_) }
sub authorization { scalar shift->header(Authorization => @_) }

sub add {
my $self = shift;
my $name = shift;
my ($self, $name) = (shift, shift);

# Make sure we have a normal case entry for name
my $lcname = lc $name;
Expand Down Expand Up @@ -130,8 +129,7 @@ sub expect { scalar shift->header(Expect => @_) }
sub expires { scalar shift->header(Expires => @_) }

sub from_hash {
my $self = shift;
my $hash = shift;
my ($self, $hash) = (shift, shift);

# Empty hash deletes all headers
if (keys %{$hash} == 0) {
Expand All @@ -149,8 +147,7 @@ sub from_hash {

# "Will you be my mommy? You smell like dead bunnies..."
sub header {
my $self = shift;
my $name = shift;
my ($self, $name) = (shift, shift);

# Replace
return $self->remove($name)->add($name, @_) if @_;
Expand Down
8 changes: 3 additions & 5 deletions lib/Mojo/IOWatcher.pm
Expand Up @@ -76,9 +76,8 @@ sub watch {
}

sub _timer {
my $self = shift;
my $cb = shift;
my $t = {cb => $cb, @_};
my ($self, $cb) = (shift, shift);
my $t = {cb => $cb, @_};
my $id;
do { $id = md5_sum('t' . time . rand 999) } while $self->{timers}->{$id};
$self->{timers}->{$id} = $t;
Expand Down Expand Up @@ -123,8 +122,7 @@ sub _one_tick {
sub _poll { shift->{poll} ||= IO::Poll->new }

sub _sandbox {
my $self = shift;
my $desc = shift;
my ($self, $desc) = (shift, shift);
return unless my $cb = shift;
$self->emit_safe(error => "$desc failed: $@")
unless eval { $self->$cb(@_); 1 };
Expand Down
6 changes: 2 additions & 4 deletions lib/Mojo/IOWatcher/EV.pm
Expand Up @@ -53,10 +53,8 @@ sub _io {

# "It's great! We can do *anything* now that Science has invented Magic."
sub _timer {
my $self = shift;
my $after = shift || '0.0001';
my $recurring = shift;
my $cb = shift;
my ($self, $after, $recurring, $cb) = @_;
$after ||= '0.0001';

my $id = $self->SUPER::_timer($cb);
weaken $self;
Expand Down
3 changes: 1 addition & 2 deletions lib/Mojo/Parameters.pm
Expand Up @@ -58,8 +58,7 @@ sub merge {
}

sub param {
my $self = shift;
my $name = shift;
my ($self, $name) = (shift, shift);

# List names
return sort keys %{$self->to_hash} unless $name;
Expand Down
22 changes: 4 additions & 18 deletions lib/Mojo/Template.pm
Expand Up @@ -336,10 +336,9 @@ sub parse {

sub render {
my $self = shift;
my $tmpl = shift;

# Parse
$self->parse($tmpl);
$self->parse(shift);

# Build
$self->build;
Expand All @@ -353,8 +352,7 @@ sub render {
}

sub render_file {
my $self = shift;
my $path = shift;
my ($self, $path) = (shift, shift);

# Slurp file
$self->name($path) unless defined $self->{name};
Expand All @@ -371,28 +369,16 @@ sub render_file {
}

sub render_file_to_file {
my $self = shift;
my $spath = shift;
my $tpath = shift;

# Render
my ($self, $spath, $tpath) = (shift, shift, shift);
my $output = $self->render_file($spath, @_);
return $output if ref $output;

# Write to file
return $self->_write_file($tpath, $output);
}

sub render_to_file {
my $self = shift;
my $tmpl = shift;
my $path = shift;

# Render
my ($self, $tmpl, $path) = (shift, shift, shift);
my $output = $self->render($tmpl, @_);
return $output if ref $output;

# Write to file
return $self->_write_file($path, $output);
}

Expand Down
3 changes: 1 addition & 2 deletions lib/Mojo/UserAgent/Transactor.pm
Expand Up @@ -12,8 +12,7 @@ use Mojo::URL;
use Mojo::Util qw/encode url_escape/;

sub form {
my $self = shift;
my $url = shift;
my ($self, $url) = (shift, shift);

# Callback
my $cb = pop @_ if ref $_[-1] && ref $_[-1] eq 'CODE';
Expand Down
5 changes: 2 additions & 3 deletions lib/Mojolicious.pm
Expand Up @@ -203,9 +203,8 @@ sub handler {
# "This snow is beautiful. I'm glad global warming never happened.
# Actually, it did. But thank God nuclear winter canceled it out."
sub helper {
my $self = shift;
my $name = shift;
my $r = $self->renderer;
my ($self, $name) = (shift, shift);
my $r = $self->renderer;
$self->log->debug(qq/Helper "$name" already exists, replacing./)
if exists $r->helpers->{$name};
$r->add_helper($name, @_);
Expand Down
6 changes: 2 additions & 4 deletions lib/Mojolicious/Controller.pm
Expand Up @@ -161,8 +161,7 @@ EOF
# "Just make a simple cake. And this time, if someone's going to jump out of
# it make sure to put them in *after* you cook it."
sub param {
my $self = shift;
my $name = shift;
my ($self, $name) = (shift, shift);

# List
my $p = $self->stash->{'mojo.captures'} || {};
Expand Down Expand Up @@ -314,8 +313,7 @@ sub render_exception {
# "If you hate intolerance and being punched in the face by me,
# please support Proposition Infinity."
sub render_json {
my $self = shift;
my $json = shift;
my ($self, $json) = (shift, shift);
my $args = ref $_[0] ? $_[0] : {@_};
$args->{json} = $json;
return $self->render($args);
Expand Down
3 changes: 1 addition & 2 deletions lib/Mojolicious/Plugin/DefaultHelpers.pm
Expand Up @@ -32,8 +32,7 @@ sub register {
# Add "content_for" helper
$app->helper(
content_for => sub {
my $self = shift;
my $name = shift;
my ($self, $name) = (shift, shift);
$self->render_content($name, $self->render_content($name), @_);
}
);
Expand Down
3 changes: 1 addition & 2 deletions lib/Mojolicious/Plugin/I18N.pm
Expand Up @@ -69,8 +69,7 @@ sub languages {
}

sub localize {
my $self = shift;
my $key = shift;
my ($self, $key) = (shift, shift);
return $key unless my $handle = $self->{handle};
return $handle->maketext($key, @_);
}
Expand Down
35 changes: 11 additions & 24 deletions lib/Mojolicious/Plugin/TagHelpers.pm
Expand Up @@ -27,13 +27,8 @@ sub register {
);

# Add "file_field" helper
$app->helper(
file_field => sub {
my $c = shift;
my $name = shift;
$self->_tag('input', name => $name, type => 'file', @_);
}
);
$app->helper(file_field =>
sub { shift; $self->_tag('input', name => shift, type => 'file', @_) });

# Add "form_for" helper
$app->helper(
Expand Down Expand Up @@ -96,9 +91,8 @@ sub register {
# Add "link_to" helper
$app->helper(
link_to => sub {
my $c = shift;
my $content = shift;
my @url = ($content);
my ($c, $content) = (shift, shift);
my @url = ($content);

# Content
unless (defined $_[-1] && ref $_[-1] eq 'CODE') {
Expand All @@ -116,9 +110,8 @@ sub register {
# Add "password_field" helper
$app->helper(
password_field => sub {
my $c = shift;
my $name = shift;
$self->_tag('input', name => $name, type => 'password', @_);
shift;
$self->_tag('input', name => shift, type => 'password', @_);
}
);

Expand All @@ -132,10 +125,8 @@ sub register {
# Add "select_field" helper
$app->helper(
select_field => sub {
my $c = shift;
my $name = shift;
my $options = shift;
my %attrs = @_;
my ($c, $name, $options) = (shift, shift, shift);
my %attrs = @_;

# Values
my %v = map { $_, 1 } $c->param($name);
Expand Down Expand Up @@ -240,8 +231,7 @@ sub register {
# Add "text_area" helper
$app->helper(
text_area => sub {
my $c = shift;
my $name = shift;
my ($c, $name) = (shift, shift);

# Value
my $cb = ref $_[-1] && ref $_[-1] eq 'CODE' ? pop : sub {''};
Expand All @@ -258,9 +248,7 @@ sub register {
}

sub _input {
my $self = shift;
my $c = shift;
my $name = shift;
my ($self, $c, $name) = (shift, shift, shift);

# Odd
my %attrs;
Expand Down Expand Up @@ -299,8 +287,7 @@ sub _input {

# "We’ve lost power of the forward Gameboy! Mario not responding!"
sub _tag {
my $self = shift;
my $name = shift;
my ($self, $name) = (shift, shift);

# Callback
my $cb = defined $_[-1] && ref($_[-1]) eq 'CODE' ? pop @_ : undef;
Expand Down
5 changes: 1 addition & 4 deletions lib/Mojolicious/Plugins.pm
Expand Up @@ -62,10 +62,7 @@ sub load_plugin {
}

sub register_plugin {
my $self = shift;
my $name = shift;
my $app = shift;
$self->load_plugin($name)->register($app, ref $_[0] ? $_[0] : {@_});
shift->load_plugin(shift)->register(shift, ref $_[0] ? $_[0] : {@_});
}

# DEPRECATED in Leaf Fluttering In Wind!
Expand Down

0 comments on commit 41f6261

Please sign in to comment.