Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: chrome/renderer/render_process.cc

Issue 18622: POSIX: Porting renderer/render_process.cc, low hanging fruit (Closed)
Patch Set: Created 11 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/renderer/render_process.h ('k') | chrome/renderer/render_thread.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "build/build_config.h"
6
7 #if defined(OS_WIN)
5 #include <windows.h> 8 #include <windows.h>
6 #include <objidl.h> 9 #include <objidl.h>
7 #include <mlang.h> 10 #include <mlang.h>
11 #endif
8 12
9 #include "chrome/renderer/render_process.h" 13 #include "chrome/renderer/render_process.h"
10 14
11 #include "base/basictypes.h" 15 #include "base/basictypes.h"
12 #include "base/command_line.h" 16 #include "base/command_line.h"
17 #include "base/compiler_specific.h"
13 #include "base/message_loop.h" 18 #include "base/message_loop.h"
14 #include "base/histogram.h" 19 #include "base/histogram.h"
15 #include "base/path_service.h" 20 #include "base/path_service.h"
21 #include "base/sys_info.h"
16 #include "chrome/browser/net/dns_global.h" // TODO(jar): DNS calls should be re nderer specific, not including browser. 22 #include "chrome/browser/net/dns_global.h" // TODO(jar): DNS calls should be re nderer specific, not including browser.
17 #include "chrome/common/chrome_switches.h" 23 #include "chrome/common/chrome_switches.h"
18 #include "chrome/common/chrome_paths.h" 24 #include "chrome/common/chrome_paths.h"
19 #include "chrome/common/ipc_channel.h" 25 #include "chrome/common/ipc_channel.h"
20 #include "chrome/common/ipc_message_utils.h" 26 #include "chrome/common/ipc_message_utils.h"
21 #include "chrome/common/render_messages.h" 27 #include "chrome/common/render_messages.h"
22 #include "chrome/renderer/render_view.h" 28 #include "chrome/renderer/render_view.h"
23 #include "webkit/glue/webkit_glue.h" 29 #include "webkit/glue/webkit_glue.h"
24 30
25 //----------------------------------------------------------------------------- 31 //-----------------------------------------------------------------------------
26 32
27 bool RenderProcess::load_plugins_in_process_ = false; 33 bool RenderProcess::load_plugins_in_process_ = false;
28 34
29 //----------------------------------------------------------------------------- 35 //-----------------------------------------------------------------------------
30 36
31 RenderProcess::RenderProcess(const std::wstring& channel_name) 37 RenderProcess::RenderProcess(const std::wstring& channel_name)
32 : render_thread_(channel_name), 38 : render_thread_(channel_name),
33 #pragma warning(suppress: 4355) // Okay to pass "this" here. 39 ALLOW_THIS_IN_INITIALIZER_LIST(clearer_factory_(this)) {
34 clearer_factory_(this) { 40 for (size_t i = 0; i < arraysize(shared_mem_cache_); ++i)
35 for (int i = 0; i < arraysize(shared_mem_cache_); ++i)
36 shared_mem_cache_[i] = NULL; 41 shared_mem_cache_[i] = NULL;
37 } 42 }
38 43
39 RenderProcess::~RenderProcess() { 44 RenderProcess::~RenderProcess() {
40 // We need to stop the RenderThread as the clearer_factory_ 45 // We need to stop the RenderThread as the clearer_factory_
41 // member could be in use while the object itself is destroyed, 46 // member could be in use while the object itself is destroyed,
42 // as a result of the containing RenderProcess object being destroyed. 47 // as a result of the containing RenderProcess object being destroyed.
43 // This race condition causes a crash when the renderer process is shutting 48 // This race condition causes a crash when the renderer process is shutting
44 // down. 49 // down.
45 render_thread_.Stop(); 50 render_thread_.Stop();
46 ClearSharedMemCache(); 51 ClearSharedMemCache();
47 } 52 }
48 53
49 // static 54 // static
50 bool RenderProcess::GlobalInit(const std::wstring &channel_name) { 55 bool RenderProcess::GlobalInit(const std::wstring &channel_name) {
56 #if defined(OS_WIN)
51 // HACK: See http://b/issue?id=1024307 for rationale. 57 // HACK: See http://b/issue?id=1024307 for rationale.
52 if (GetModuleHandle(L"LPK.DLL") == NULL) { 58 if (GetModuleHandle(L"LPK.DLL") == NULL) {
53 // Makes sure lpk.dll is loaded by gdi32 to make sure ExtTextOut() works 59 // Makes sure lpk.dll is loaded by gdi32 to make sure ExtTextOut() works
54 // when buffering into a EMF buffer for printing. 60 // when buffering into a EMF buffer for printing.
55 typedef BOOL (__stdcall *GdiInitializeLanguagePack)(int LoadedShapingDLLs); 61 typedef BOOL (__stdcall *GdiInitializeLanguagePack)(int LoadedShapingDLLs);
56 GdiInitializeLanguagePack gdi_init_lpk = 62 GdiInitializeLanguagePack gdi_init_lpk =
57 reinterpret_cast<GdiInitializeLanguagePack>(GetProcAddress( 63 reinterpret_cast<GdiInitializeLanguagePack>(GetProcAddress(
58 GetModuleHandle(L"GDI32.DLL"), 64 GetModuleHandle(L"GDI32.DLL"),
59 "GdiInitializeLanguagePack")); 65 "GdiInitializeLanguagePack"));
60 DCHECK(gdi_init_lpk); 66 DCHECK(gdi_init_lpk);
61 if (gdi_init_lpk) { 67 if (gdi_init_lpk) {
62 gdi_init_lpk(0); 68 gdi_init_lpk(0);
63 } 69 }
64 } 70 }
71 #endif
65 72
66 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 73 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
67 if (command_line.HasSwitch(switches::kJavaScriptFlags)) { 74 if (command_line.HasSwitch(switches::kJavaScriptFlags)) {
68 webkit_glue::SetJavaScriptFlags( 75 webkit_glue::SetJavaScriptFlags(
69 command_line.GetSwitchValue(switches::kJavaScriptFlags)); 76 command_line.GetSwitchValue(switches::kJavaScriptFlags));
70 } 77 }
71 if (command_line.HasSwitch(switches::kPlaybackMode) || 78 if (command_line.HasSwitch(switches::kPlaybackMode) ||
72 command_line.HasSwitch(switches::kRecordMode)) { 79 command_line.HasSwitch(switches::kRecordMode)) {
73 webkit_glue::SetRecordPlaybackMode(true); 80 webkit_glue::SetRecordPlaybackMode(true);
74 } 81 }
75 82
76 if (command_line.HasSwitch(switches::kInProcessPlugins) || 83 if (command_line.HasSwitch(switches::kInProcessPlugins) ||
77 command_line.HasSwitch(switches::kSingleProcess)) 84 command_line.HasSwitch(switches::kSingleProcess))
78 load_plugins_in_process_ = true; 85 load_plugins_in_process_ = true;
79 86
80 if (command_line.HasSwitch(switches::kEnableWatchdog)) { 87 if (command_line.HasSwitch(switches::kEnableWatchdog)) {
81 // TODO(JAR): Need to implement renderer IO msgloop watchdog. 88 // TODO(JAR): Need to implement renderer IO msgloop watchdog.
82 } 89 }
83 90
84 if (command_line.HasSwitch(switches::kDumpHistogramsOnExit)) { 91 if (command_line.HasSwitch(switches::kDumpHistogramsOnExit)) {
85 StatisticsRecorder::set_dump_on_exit(true); 92 StatisticsRecorder::set_dump_on_exit(true);
86 } 93 }
87 94
88 if (command_line.HasSwitch(switches::kGearsInRenderer)) { 95 if (command_line.HasSwitch(switches::kGearsInRenderer)) {
96 #if defined(OS_WIN)
89 // Load gears.dll on startup so we can access it before the sandbox 97 // Load gears.dll on startup so we can access it before the sandbox
90 // blocks us. 98 // blocks us.
91 std::wstring path; 99 std::wstring path;
92 if (PathService::Get(chrome::FILE_GEARS_PLUGIN, &path)) 100 if (PathService::Get(chrome::FILE_GEARS_PLUGIN, &path))
93 LoadLibrary(path.c_str()); 101 LoadLibrary(path.c_str());
102 #else
103 // TODO(port) Need to handle loading gears on non-Windows platforms
104 NOTIMPLEMENTED();
105 #endif
94 } 106 }
95 107
96 ChildProcessFactory<RenderProcess> factory; 108 ChildProcessFactory<RenderProcess> factory;
97 return ChildProcess::GlobalInit(channel_name, &factory); 109 return ChildProcess::GlobalInit(channel_name, &factory);
98 } 110 }
99 111
100 // static 112 // static
101 void RenderProcess::GlobalCleanup() { 113 void RenderProcess::GlobalCleanup() {
102 ChildProcess::GlobalCleanup(); 114 ChildProcess::GlobalCleanup();
103 } 115 }
104 116
105 // static 117 // static
106 bool RenderProcess::ShouldLoadPluginsInProcess() { 118 bool RenderProcess::ShouldLoadPluginsInProcess() {
107 return load_plugins_in_process_; 119 return load_plugins_in_process_;
108 } 120 }
109 121
110 // static 122 // static
111 base::SharedMemory* RenderProcess::AllocSharedMemory(size_t size) { 123 base::SharedMemory* RenderProcess::AllocSharedMemory(size_t size) {
112 self()->clearer_factory_.RevokeAll(); 124 self()->clearer_factory_.RevokeAll();
113 125
114 base::SharedMemory* mem = self()->GetSharedMemFromCache(size); 126 base::SharedMemory* mem = self()->GetSharedMemFromCache(size);
115 if (mem) 127 if (mem)
116 return mem; 128 return mem;
117 129
118 // Round-up size to allocation granularity 130 // Round-up size to allocation granularity
119 SYSTEM_INFO info; 131 size_t allocation_granularity = base::SysInfo::VMAllocationGranularity();
120 GetSystemInfo(&info); 132 size = size / allocation_granularity + 1;
121 133 size = size * allocation_granularity;
122 size = size / info.dwAllocationGranularity + 1;
123 size = size * info.dwAllocationGranularity;
124 134
125 mem = new base::SharedMemory(); 135 mem = new base::SharedMemory();
126 if (!mem) 136 if (!mem)
127 return NULL; 137 return NULL;
128 if (!mem->Create(L"", false, true, size)) { 138 if (!mem->Create(L"", false, true, size)) {
129 delete mem; 139 delete mem;
130 return NULL; 140 return NULL;
131 } 141 }
132 142
133 return mem; 143 return mem;
134 } 144 }
135 145
136 // static 146 // static
137 void RenderProcess::FreeSharedMemory(base::SharedMemory* mem) { 147 void RenderProcess::FreeSharedMemory(base::SharedMemory* mem) {
138 if (self()->PutSharedMemInCache(mem)) { 148 if (self()->PutSharedMemInCache(mem)) {
139 self()->ScheduleCacheClearer(); 149 self()->ScheduleCacheClearer();
140 return; 150 return;
141 } 151 }
142 DeleteSharedMem(mem); 152 DeleteSharedMem(mem);
143 } 153 }
144 154
145 // static 155 // static
146 void RenderProcess::DeleteSharedMem(base::SharedMemory* mem) { 156 void RenderProcess::DeleteSharedMem(base::SharedMemory* mem) {
147 delete mem; 157 delete mem;
148 } 158 }
149 159
150 base::SharedMemory* RenderProcess::GetSharedMemFromCache(size_t size) { 160 base::SharedMemory* RenderProcess::GetSharedMemFromCache(size_t size) {
151 // look for a cached object that is suitable for the requested size. 161 // look for a cached object that is suitable for the requested size.
152 for (int i = 0; i < arraysize(shared_mem_cache_); ++i) { 162 for (size_t i = 0; i < arraysize(shared_mem_cache_); ++i) {
153 base::SharedMemory* mem = shared_mem_cache_[i]; 163 base::SharedMemory* mem = shared_mem_cache_[i];
154 if (mem && mem->max_size() >= size) { 164 if (mem && mem->max_size() >= size) {
155 shared_mem_cache_[i] = NULL; 165 shared_mem_cache_[i] = NULL;
156 return mem; 166 return mem;
157 } 167 }
158 } 168 }
159 return NULL; 169 return NULL;
160 } 170 }
161 171
162 bool RenderProcess::PutSharedMemInCache(base::SharedMemory* mem) { 172 bool RenderProcess::PutSharedMemInCache(base::SharedMemory* mem) {
163 // simple algorithm: 173 // simple algorithm:
164 // - look for an empty slot to store mem, or 174 // - look for an empty slot to store mem, or
165 // - if full, then replace any existing cache entry that is smaller than the 175 // - if full, then replace any existing cache entry that is smaller than the
166 // given shared memory object. 176 // given shared memory object.
167 for (int i = 0; i < arraysize(shared_mem_cache_); ++i) { 177 for (size_t i = 0; i < arraysize(shared_mem_cache_); ++i) {
168 if (!shared_mem_cache_[i]) { 178 if (!shared_mem_cache_[i]) {
169 shared_mem_cache_[i] = mem; 179 shared_mem_cache_[i] = mem;
170 return true; 180 return true;
171 } 181 }
172 } 182 }
173 for (int i = 0; i < arraysize(shared_mem_cache_); ++i) { 183 for (size_t i = 0; i < arraysize(shared_mem_cache_); ++i) {
174 base::SharedMemory* cached_mem = shared_mem_cache_[i]; 184 base::SharedMemory* cached_mem = shared_mem_cache_[i];
175 if (cached_mem->max_size() < mem->max_size()) { 185 if (cached_mem->max_size() < mem->max_size()) {
176 shared_mem_cache_[i] = mem; 186 shared_mem_cache_[i] = mem;
177 DeleteSharedMem(cached_mem); 187 DeleteSharedMem(cached_mem);
178 return true; 188 return true;
179 } 189 }
180 } 190 }
181 return false; 191 return false;
182 } 192 }
183 193
184 void RenderProcess::ClearSharedMemCache() { 194 void RenderProcess::ClearSharedMemCache() {
185 for (int i = 0; i < arraysize(shared_mem_cache_); ++i) { 195 for (size_t i = 0; i < arraysize(shared_mem_cache_); ++i) {
186 if (shared_mem_cache_[i]) { 196 if (shared_mem_cache_[i]) {
187 DeleteSharedMem(shared_mem_cache_[i]); 197 DeleteSharedMem(shared_mem_cache_[i]);
188 shared_mem_cache_[i] = NULL; 198 shared_mem_cache_[i] = NULL;
189 } 199 }
190 } 200 }
191 } 201 }
192 202
193 void RenderProcess::ScheduleCacheClearer() { 203 void RenderProcess::ScheduleCacheClearer() {
194 // If we already have a deferred clearer, then revoke it so we effectively 204 // If we already have a deferred clearer, then revoke it so we effectively
195 // delay cache clearing until idle for our desired interval. 205 // delay cache clearing until idle for our desired interval.
196 clearer_factory_.RevokeAll(); 206 clearer_factory_.RevokeAll();
197 207
198 MessageLoop::current()->PostDelayedTask(FROM_HERE, 208 MessageLoop::current()->PostDelayedTask(FROM_HERE,
199 clearer_factory_.NewRunnableMethod(&RenderProcess::ClearSharedMemCache), 209 clearer_factory_.NewRunnableMethod(&RenderProcess::ClearSharedMemCache),
200 5000 /* 5 seconds */); 210 5000 /* 5 seconds */);
201 } 211 }
202 212
203 void RenderProcess::Cleanup() { 213 void RenderProcess::Cleanup() {
204 #ifndef NDEBUG 214 #ifndef NDEBUG
205 // log important leaked objects 215 // log important leaked objects
206 webkit_glue::CheckForLeaks(); 216 webkit_glue::CheckForLeaks();
207 #endif 217 #endif
208 } 218 }
209
OLDNEW
« no previous file with comments | « chrome/renderer/render_process.h ('k') | chrome/renderer/render_thread.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698