stas 2003/05/29 22:24:52
Modified: lib/Apache SizeLimit.pm . Changes Log: Add Win32 support to Apache::SizeLimit Submitted by: Perrin Harkins <[EMAIL PROTECTED]> Revision Changes Path 1.11 +71 -3 modperl/lib/Apache/SizeLimit.pm Index: SizeLimit.pm =================================================================== RCS file: /home/cvs/modperl/lib/Apache/SizeLimit.pm,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- SizeLimit.pm 30 May 2003 05:23:34 -0000 1.10 +++ SizeLimit.pm 30 May 2003 05:24:51 -0000 1.11 @@ -125,6 +125,11 @@ Uses BSD::Resource::getrusage() to determine process size. Not sure if the shared memory calculations will work or not. AIX users? +=item Win32 + +Uses Win32::API to access process memory information. Win32::API can be +installed under ActiveState perl using the supplied ppm utility. + =back If your platform is not supported, and if you can tell me how to check for @@ -146,7 +151,7 @@ use strict; use vars qw($VERSION $HOW_BIG_IS_IT $MAX_PROCESS_SIZE $REQUEST_COUNT $CHECK_EVERY_N_REQUESTS - $MIN_SHARE_SIZE $MAX_UNSHARED_SIZE $START_TIME); + $MIN_SHARE_SIZE $MAX_UNSHARED_SIZE $START_TIME $WIN32); $VERSION = '0.03'; $CHECK_EVERY_N_REQUESTS = 1; @@ -154,6 +159,7 @@ $MAX_PROCESS_SIZE = 0; $MIN_SHARE_SIZE = 0; $MAX_UNSHARED_SIZE = 0; +$WIN32 = 0; BEGIN { @@ -170,6 +176,13 @@ } else { die "you must install BSD::Resource for Apache::SizeLimit to work on your platform."; } + } elsif ($Config{'osname'} eq 'MSWin32') { + $WIN32 = 1; + if (eval("require Win32::API")) { + $HOW_BIG_IS_IT = \&win32_size_check; + } else { + die "you must install Win32::API for Apache::SizeLimit to work on your platform."; + } } else { die "Apache::SizeLimit not implemented on your platform."; } @@ -200,6 +213,53 @@ return (&BSD::Resource::getrusage())[2,3]; } +sub win32_size_check { + # get handle on current process + my $GetCurrentProcess = new Win32::API('kernel32', + 'GetCurrentProcess', + [], + 'I'); + my $hProcess = $GetCurrentProcess->Call(); + + + # memory usage is bundled up in ProcessMemoryCounters structure + # populated by GetProcessMemoryInfo() win32 call + my $DWORD = 'B32'; # 32 bits + my $SIZE_T = 'I'; # unsigned integer + + # build a buffer structure to populate + my $pmem_struct = "$DWORD" x 2 . "$SIZE_T" x 8; + my $pProcessMemoryCounters = pack($pmem_struct, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + + # GetProcessMemoryInfo is in "psapi.dll" + my $GetProcessMemoryInfo = new Win32::API('psapi', + 'GetProcessMemoryInfo', + ['I', 'P', 'I'], + 'I'); + + my $bool = $GetProcessMemoryInfo->Call($hProcess, + $pProcessMemoryCounters, + length($pProcessMemoryCounters)); + + # unpack ProcessMemoryCounters structure + my ($cb, + $PageFaultCount, + $PeakWorkingSetSize, + $WorkingSetSize, + $QuotaPeakPagedPoolUsage, + $QuotaPagedPoolUsage, + $QuotaPeakNonPagedPoolUsage, + $QuotaNonPagedPoolUsage, + $PagefileUsage, + $PeakPagefileUsage) = unpack($pmem_struct, $pProcessMemoryCounters); + + # only care about peak working set size + my $size = int($PeakWorkingSetSize / 1024); + + return ($size, 0); +} + + sub exit_if_too_big { my $r = shift; return DECLINED if ($CHECK_EVERY_N_REQUESTS && @@ -216,13 +276,18 @@ ($MAX_UNSHARED_SIZE && ($size - $share) > $MAX_UNSHARED_SIZE)) { # wake up! time to die. - if (getppid > 1) { # this is a child httpd + if ($WIN32 || (getppid > 1)) { # this is a child httpd my $e = time - $START_TIME; my $msg = "httpd process too big, exiting at SIZE=$size KB "; $msg .= " SHARE=$share KB " if ($share); $msg .= " REQUESTS=$REQUEST_COUNT LIFETIME=$e seconds"; error_log($msg); - $r->child_terminate; + + if ($WIN32) { + CORE::exit(-2); # child_terminate() is disabled in win32 Apache + } else { + $r->child_terminate(); + } } else { # this is the main httpd, whose parent is init? my $msg = "main process too big, SIZE=$size KB "; @@ -277,5 +342,8 @@ Doug Steinwand and Perrin Harkins <[EMAIL PROTECTED]>: added support for shared memory and additional diagnostic info + +Matt Phillips <[EMAIL PROTECTED]> and Mohamed Hendawi +<[EMAIL PROTECTED]>: Win32 support =cut 1.669 +3 -0 modperl/Changes Index: Changes =================================================================== RCS file: /home/cvs/modperl/Changes,v retrieving revision 1.668 retrieving revision 1.669 diff -u -r1.668 -r1.669 --- Changes 30 May 2003 05:23:34 -0000 1.668 +++ Changes 30 May 2003 05:24:51 -0000 1.669 @@ -10,6 +10,9 @@ =item 1.27_01-dev +Add Win32 support to Apache::SizeLimit [Matt Phillips +<[EMAIL PROTECTED]> and Mohamed Hendawi <[EMAIL PROTECTED]>] + Change Apache::SizeLimit to not push a cleanup handler if already in the cleanup handler phase, and adjust docs to show that cleanup handler is the preferred phase to use [Perrin Harkins