Author: msergeant
Date: Fri Feb  8 13:26:25 2008
New Revision: 845

Modified:
   trunk/lib/Qpsmtpd.pm
   trunk/lib/Qpsmtpd/Plugin.pm
   trunk/lib/Qpsmtpd/PollServer.pm

Log:
More crazy performance stuff


Modified: trunk/lib/Qpsmtpd.pm
==============================================================================
--- trunk/lib/Qpsmtpd.pm        (original)
+++ trunk/lib/Qpsmtpd.pm        Fri Feb  8 13:26:25 2008
@@ -15,7 +15,6 @@
                  timeout => 1200,
                  );
 my $_config_cache = {};
-clear_config_cache();
 
 #DashProfiler->add_profile("qpsmtpd");
 #my $SAMPLER = DashProfiler->prepare("qpsmtpd");
@@ -57,6 +56,14 @@
     $self->log(LOGINFO, "Loaded $logger");
   }
 
+  $configdir = $self->config_dir("loglevel");
+  $configfile = "$configdir/loglevel";
+  $TraceLevel = $self->_config_from_file($configfile,'loglevel');
+
+  unless (defined($TraceLevel) and $TraceLevel =~ /^\d+$/) {
+    $TraceLevel = LOGWARN; # Default if no loglevel file found.
+  }
+
   $LOGGING_LOADED = 1;
 
   return @loggers;
@@ -64,16 +71,6 @@
   
 sub trace_level {
   my $self = shift;
-  return $TraceLevel if $TraceLevel;
-
-  my $configdir = $self->config_dir("loglevel");
-  my $configfile = "$configdir/loglevel";
-  $TraceLevel = $self->_config_from_file($configfile,'loglevel');
-
-  unless (defined($TraceLevel) and $TraceLevel =~ /^\d+$/) {
-    $TraceLevel = LOGWARN; # Default if no loglevel file found.
-  }
-
   return $TraceLevel;
 }
 
@@ -106,18 +103,15 @@
   unless ( $rc and $rc == DECLINED or $rc == OK ) {
     # no logging plugins registered so fall back to STDERR
     warn join(" ", $$ .
-      (defined $plugin ? " $plugin plugin:" : 
+      (defined $plugin ? " $plugin plugin ($hook):" : 
        defined $hook   ? " running plugin ($hook):"  : ""),
       @log), "\n"
-    if $trace <= $self->trace_level();
+    if $trace <= $TraceLevel;
   }
 }
 
 sub clear_config_cache {
     $_config_cache = {};
-    for (keys %defaults) {
-        $_config_cache->{$_} = [$defaults{$_}];
-    }
 }
 
 #
@@ -133,6 +127,8 @@
       return wantarray ? @{$_config_cache->{$c}} : $_config_cache->{$c}->[0];
   }
   
+  $_config_cache->{$c} = [$defaults{$c}] if exists($defaults{$c});
+  
   #warn "SELF->config($c) ", ref $self;
 
   my ($rc, @config) = $self->run_hooks_no_respond("config", $c);

Modified: trunk/lib/Qpsmtpd/Plugin.pm
==============================================================================
--- trunk/lib/Qpsmtpd/Plugin.pm (original)
+++ trunk/lib/Qpsmtpd/Plugin.pm Fri Feb  8 13:26:25 2008
@@ -60,8 +60,8 @@
 
 sub log {
   my $self = shift;
-  $self->qp->varlog(shift, $self->hook_name, $self->plugin_name, @_)
-    unless defined $self->hook_name and $self->hook_name eq 'logging';
+  $self->{_qp}->varlog(shift, $self->{_hook}, $self->plugin_name, @_)
+    unless defined $self->{_hook} and $self->{_hook} eq 'logging';
 }
 
 sub transaction {

Modified: trunk/lib/Qpsmtpd/PollServer.pm
==============================================================================
--- trunk/lib/Qpsmtpd/PollServer.pm     (original)
+++ trunk/lib/Qpsmtpd/PollServer.pm     Fri Feb  8 13:26:25 2008
@@ -103,59 +103,43 @@
     return;
 }
 
+my %cmd_cache;
+
 sub process_line {
     my Qpsmtpd::PollServer $self = shift;
     my $line = shift || return;
     if ($::DEBUG > 1) { print "$$:".($self+0)."C($self->{mode}): $line"; }
-    eval { $self->_process_line($line) };
-    if ($@) {
-        print STDERR "Error: [EMAIL PROTECTED]";
-        return $self->fault("command failed unexpectedly") if $self->{mode} eq 
'cmd';
-        return $self->fault("unknown error");
+    if ($self->{mode} eq 'cmd') {
+        $line =~ s/\r?\n//;
+        my ($cmd, @params) = split(/ +/, $line, 2);
+        my $meth = lc($cmd);
+        if (my $lookup = $cmd_cache{$meth} || $self->{_commands}->{$meth} && 
$self->can($meth)) {
+            $cmd_cache{$meth} = $lookup;
+            eval {
+                $lookup->($self, @params);
+            };
+            if ($@) {
+                my $error = $@;
+                chomp($error);
+                $self->log(LOGERROR, "Command Error: $error");
+                $self->fault("command '$cmd' failed unexpectedly");
+            }
+        }
+        else {
+            # No such method - i.e. unrecognized command
+            my ($rc, $msg) = $self->run_hooks("unrecognized_command", $meth, 
@params);
+        }
     }
-    return;
-}
-
-sub _process_line {
-    my Qpsmtpd::PollServer $self = shift;
-    my $line = shift;
-    
-    if ($self->{mode} eq 'connect') {
+    elsif ($self->{mode} eq 'connect') {
         $self->{mode} = 'cmd';
-        my $rc = $self->start_conversation;
-        return;
-    }
-    elsif ($self->{mode} eq 'cmd') {
-        $line =~ s/\r?\n//;
-        return $self->process_cmd($line);
+        # I've removed an eval{} from around this. It shouldn't ever die()
+        # but if it does we're a bit screwed... Ah well :-)
+        $self->start_conversation;
     }
     else {
         die "Unknown mode";
     }
-}
-
-sub process_cmd {
-    my Qpsmtpd::PollServer $self = shift;
-    my $line = shift;
-    my ($cmd, @params) = split(/ +/, $line, 2);
-    my $meth = lc($cmd);
-    if (my $lookup = $self->{_commands}->{$meth} && $self->can($meth)) {
-        my $resp = eval {
-            $lookup->($self, @params);
-        };
-        if ($@) {
-            my $error = $@;
-            chomp($error);
-            $self->log(LOGERROR, "Command Error: $error");
-            return $self->fault("command '$cmd' failed unexpectedly");
-        }
-        return $resp;
-    }
-    else {
-        # No such method - i.e. unrecognized command
-        my ($rc, $msg) = $self->run_hooks("unrecognized_command", $meth, 
@params);
-        return 1;
-    }
+    return;
 }
 
 sub disconnect {

Reply via email to