summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/render_process.cc
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-17 21:53:03 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-17 21:53:03 +0000
commit955ee6d6f9ef04b29a1fde4ea20091e424c4911e (patch)
tree8678896354125788c32ef07ad63022f70bdd46b2 /chrome/renderer/render_process.cc
parent437bf947b1784f4d5dadaa94dc522a7a4447e11e (diff)
downloadchromium_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.cc27
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) {