change vm_limit to use mallinfo() (thanks to Andrei Nigmatulin)

This commit is contained in:
Antony Dovgal
2009-01-23 17:53:42 +00:00
parent 63b177814d
commit 7143072eda
3 changed files with 22 additions and 46 deletions

View File

@@ -3,6 +3,16 @@ dnl $Id$
PHP_ARG_ENABLE(memtrack, whether to enable memtrack support,
[ --enable-memtrack Enable memtrack support])
AC_MSG_CHECKING([whether struct mallinfo is present])
AC_TRY_COMPILE([#include <malloc.h>], [struct mallinfo info;],
[
AC_MSG_RESULT([yes])
AC_DEFINE(PHP_MEMTRACK_HAVE_MALLINFO, 1, [Whether struct mallinfo is present])
], [
AC_MSG_RESULT([no])
])
if test "$PHP_MEMTRACK" != "no"; then
PHP_NEW_EXTENSION(memtrack, memtrack.c, $ext_shared)
fi

View File

@@ -46,50 +46,16 @@ void memtrack_execute(zend_op_array *op_array TSRMLS_DC);
void (*memtrack_old_execute_internal)(zend_execute_data *current_execute_data, int return_value_used TSRMLS_DC);
void memtrack_execute_internal(zend_execute_data *current_execute_data, int return_value_used TSRMLS_DC);
/* Linux only func */
#if defined(__linux__)
#include <fcntl.h>
#define MEMTRACK_HAVE_VM_SIZE
#ifdef PHP_MEMTRACK_HAVE_MALLINFO
# ifdef HAVE_MALLOC_H
# include <malloc.h>
# endif
static int memtrack_get_vm_size(void) /* {{{ */
{
char ret[128] = {0};
char buf[4096 /* XXX */], *str, *end;
int fd, buf_len;
char fname[128] = {0};
pid_t pid = getpid();
sprintf(fname, "/proc/%d/status", pid);
struct mallinfo info;
fd = open(fname, O_RDONLY);
if (fd < 0) {
return -1;
}
buf_len = read(fd, buf, sizeof(buf));
if (buf_len <= 0) {
close(fd);
return -1;
}
str = strstr(buf, "VmSize:");
if (!str || (str + sizeof("VmSize:")) >= (buf + buf_len)) {
close(fd);
return -1;
}
str += sizeof("VmSize:");
end = strchr(str, '\n');
if (!end) {
close(fd);
return -1;
}
memcpy(ret, str, (end - str));
ret[end - str] = 0;
close(fd);
return atoi(ret);
info = mallinfo();
return info.arena + info.hblkhd;
}
/* }}} */
#endif
@@ -216,7 +182,7 @@ PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("memtrack.enabled", "0", PHP_INI_SYSTEM, OnUpdateBool, enabled, zend_memtrack_globals, memtrack_globals)
STD_PHP_INI_ENTRY("memtrack.soft_limit", "0", PHP_INI_ALL, OnUpdateLong, soft_limit, zend_memtrack_globals, memtrack_globals)
STD_PHP_INI_ENTRY("memtrack.hard_limit", "0", PHP_INI_ALL, OnUpdateLong, hard_limit, zend_memtrack_globals, memtrack_globals)
#ifdef MEMTRACK_HAVE_VM_SIZE
#ifdef PHP_MEMTRACK_HAVE_MALLINFO
STD_PHP_INI_ENTRY("memtrack.vm_limit", "0", PHP_INI_ALL, OnUpdateLong, vm_limit, zend_memtrack_globals, memtrack_globals)
#endif
STD_PHP_INI_ENTRY("memtrack.ignore_functions", "", PHP_INI_SYSTEM, OnUpdateString, ignore_functions, zend_memtrack_globals, memtrack_globals)
@@ -283,13 +249,12 @@ PHP_RSHUTDOWN_FUNCTION(memtrack)
zend_hash_destroy(&MEMTRACK_G(ignore_funcs_hash));
#ifdef MEMTRACK_HAVE_VM_SIZE
#ifdef PHP_MEMTRACK_HAVE_MALLINFO
if (MEMTRACK_G(vm_limit) > 0) {
int vmsize = memtrack_get_vm_size();
long lvmsize = vmsize * 1024;
if (lvmsize > 0 && lvmsize >= MEMTRACK_G(vm_limit)) {
zend_error(E_WARNING, "[memtrack] [pid %d] virtual memory usage on shutdown: %ld bytes", getpid(), lvmsize);
if (vmsize > 0 && vmsize >= MEMTRACK_G(vm_limit)) {
zend_error(E_WARNING, "[memtrack] [pid %d] virtual memory usage on shutdown: %d bytes", getpid(), vmsize);
}
}
#endif

View File

@@ -29,6 +29,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
</stability>
<license uri="http://www.php.net/license">PHP</license>
<notes>- added Win32 config file.
- changed vm_limit to use mallinfo() instead of reading /proc.
</notes>
<contents>
<dir name="/">