diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-17 21:53:03 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-17 21:53:03 +0000 |
commit | 955ee6d6f9ef04b29a1fde4ea20091e424c4911e (patch) | |
tree | 8678896354125788c32ef07ad63022f70bdd46b2 /chrome/renderer/render_process.cc | |
parent | 437bf947b1784f4d5dadaa94dc522a7a4447e11e (diff) | |
download | chromium_src-955ee6d6f9ef04b29a1fde4ea20091e424c4911e.zip chromium_src-955ee6d6f9ef04b29a1fde4ea20091e424c4911e.tar.gz chromium_src-955ee6d6f9ef04b29a1fde4ea20091e424c4911e.tar.bz2 |
Linux: Limit the size of the shared memory segment a renderer will request.
TEST=everything behaves the same, and you don't sad tab when resizing a very large autocomplete popup
BUG=13805
Review URL: http://codereview.chromium.org/125274
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18660 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/render_process.cc')
-rw-r--r-- | chrome/renderer/render_process.cc | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/chrome/renderer/render_process.cc b/chrome/renderer/render_process.cc index 027b209..a9fae6b 100644 --- a/chrome/renderer/render_process.cc +++ b/chrome/renderer/render_process.cc @@ -15,6 +15,7 @@ #include "base/basictypes.h" #include "base/command_line.h" #include "base/compiler_specific.h" +#include "base/file_util.h" #include "base/message_loop.h" #include "base/histogram.h" #include "base/path_service.h" @@ -31,6 +32,18 @@ #include "media/base/media.h" #include "webkit/glue/webkit_glue.h" +static size_t GetMaxSharedMemorySize() { + static int size = 0; +#if defined(OS_LINUX) + if (size == 0) { + std::string contents; + file_util::ReadFileToString(FilePath("/proc/sys/kernel/shmmax"), &contents); + size = strtoul(contents.c_str(), NULL, 0); + } +#endif + return size; +} + //----------------------------------------------------------------------------- RenderProcess::RenderProcess() @@ -172,8 +185,18 @@ void RenderProcess::FreeTransportDIB(TransportDIB* dib) { skia::PlatformCanvas* RenderProcess::GetDrawingCanvas( TransportDIB** memory, const gfx::Rect& rect) { + int width = rect.width(); + int height = rect.height(); const size_t stride = skia::PlatformCanvas::StrideForWidth(rect.width()); - const size_t size = stride * rect.height(); + const size_t max_size = GetMaxSharedMemorySize(); + + // If the requested size is too big, reduce the height. Ideally we might like + // to reduce the width as well to make the size reduction more "balanced", but + // it rarely comes up in practice. + if ((max_size != 0) && (height * stride > max_size)) + height = max_size / stride; + + const size_t size = height * stride; if (!GetTransportDIBFromCache(memory, size)) { *memory = CreateTransportDIB(size); @@ -181,7 +204,7 @@ skia::PlatformCanvas* RenderProcess::GetDrawingCanvas( return false; } - return (*memory)->GetPlatformCanvas(rect.width(), rect.height()); + return (*memory)->GetPlatformCanvas(width, height); } void RenderProcess::ReleaseTransportDIB(TransportDIB* mem) { |