You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by pg...@apache.org on 2005/09/07 04:04:58 UTC

svn commit: r279210 - in /perl/modperl/trunk: Changes lib/Apache2/SizeLimit.pm

Author: pgollucci
Date: Tue Sep  6 19:04:55 2005
New Revision: 279210

URL: http://svn.apache.org/viewcvs?rev=279210&view=rev
Log:
enable smaps support on linux systems that support it.

Submitted By: Torsten Foertsch <to...@gmx.net>
Message-ID: <20...@gmx.net>


Modified:
    perl/modperl/trunk/Changes
    perl/modperl/trunk/lib/Apache2/SizeLimit.pm

Modified: perl/modperl/trunk/Changes
URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/Changes?rev=279210&r1=279209&r2=279210&view=diff
==============================================================================
--- perl/modperl/trunk/Changes (original)
+++ perl/modperl/trunk/Changes Tue Sep  6 19:04:55 2005
@@ -12,6 +12,11 @@
 
 =item 2.0.2-dev
 
+Add support for the newer Smaps (/proc/self/statm) on Linux
+systems that support it (i.e. linux-2.6.13-rc4-mm1)
+to accurately count the amount of shared memory.
+[Torsten Foertsch <torsten.foertsch gmx.net>]
+
 On cygwin some dlls might happen to be with identical base addresses
 and if you try to load both of them you'll get an error and you'll
 have to use the rebase utility to fix them.  this fix should prevent

Modified: perl/modperl/trunk/lib/Apache2/SizeLimit.pm
URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/lib/Apache2/SizeLimit.pm?rev=279210&r1=279209&r2=279210&view=diff
==============================================================================
--- perl/modperl/trunk/lib/Apache2/SizeLimit.pm (original)
+++ perl/modperl/trunk/lib/Apache2/SizeLimit.pm Tue Sep  6 19:04:55 2005
@@ -34,13 +34,14 @@
 
 use Apache2::Const -compile => qw(OK DECLINED);
 
-our $VERSION = '0.04';
+our $VERSION = '0.05';
 
 our $CHECK_EVERY_N_REQUESTS = 1;
 our $REQUEST_COUNT          = 1;
 our $MAX_PROCESS_SIZE       = 0;
 our $MIN_SHARE_SIZE         = 0;
 our $MAX_UNSHARED_SIZE      = 0;
+our $USE_SMAPS              = 1;
 
 our ($HOW_BIG_IS_IT, $START_TIME);
 
@@ -55,9 +56,12 @@
         $HOW_BIG_IS_IT = \&solaris_2_6_size_check;
 
     } elsif (LINUX) {
-
-        $HOW_BIG_IS_IT = \&linux_size_check;
-
+        if ( eval { require Linux::Smaps } and Linux::Smaps->new($$) ) {
+            $HOW_BIG_IS_IT = \&linux_smaps_size_check_first_time;
+        } else {
+            $USE_SMAPS = 0;
+            $HOW_BIG_IS_IT = \&linux_size_check;
+        }
     } elsif (BSD_LIKE) {
 
         # will getrusage work on all BSDs?  I should hope so.
@@ -83,6 +87,23 @@
         die "Apache2::SizeLimit not implemented on $^O";
 
     }
+}
+
+sub linux_smaps_size_check_first_time {
+
+    if ($USE_SMAPS) {
+        $HOW_BIG_IS_IT = \&linux_smaps_size_check;
+    } else {
+        $HOW_BIG_IS_IT = \&linux_size_check;
+    }
+
+    goto &$HOW_BIG_IS_IT;
+}
+
+sub linux_smaps_size_check {
+
+    my $s = Linux::Smaps->new($$)->all;
+    return ($s->size, $s->shared_cleani + $s->shared_dirty);
 }
 
 # return process size (in KB)