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

Side by Side Diff: chrome/browser/renderer_host/render_widget_helper.cc

Issue 39208: POSIX: Rewrite IPC's interaction with FileDescriptor (Closed)
Patch Set: Created 11 years, 9 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
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 "chrome/browser/renderer_host/render_widget_helper.h" 5 #include "chrome/browser/renderer_host/render_widget_helper.h"
6 6
7 #include "base/thread.h" 7 #include "base/thread.h"
8 #include "chrome/browser/browser_process.h" 8 #include "chrome/browser/browser_process.h"
9 #include "chrome/browser/renderer_host/render_process_host.h" 9 #include "chrome/browser/renderer_host/render_process_host.h"
10 #include "chrome/browser/renderer_host/resource_dispatcher_host.h" 10 #include "chrome/browser/renderer_host/resource_dispatcher_host.h"
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 const std::map<TransportDIB::Id, int>::iterator 256 const std::map<TransportDIB::Id, int>::iterator
257 i = allocated_dibs_.find(dib_id); 257 i = allocated_dibs_.find(dib_id);
258 if (i == allocated_dibs_.end()) 258 if (i == allocated_dibs_.end())
259 return NULL; 259 return NULL;
260 260
261 base::FileDescriptor fd(dup(i->second), true); 261 base::FileDescriptor fd(dup(i->second), true);
262 return TransportDIB::Map(fd); 262 return TransportDIB::Map(fd);
263 } 263 }
264 264
265 void RenderWidgetHelper::AllocTransportDIB( 265 void RenderWidgetHelper::AllocTransportDIB(
266 size_t size, IPC::Maybe<TransportDIB::Handle>* result) { 266 size_t size, TransportDIB::Handle* result) {
267 base::SharedMemory* shared_memory = new base::SharedMemory(); 267 base::SharedMemory* shared_memory = new base::SharedMemory();
268 if (!shared_memory->Create(L"", false /* read write */, 268 if (!shared_memory->Create(L"", false /* read write */,
269 false /* do not open existing */, size)) { 269 false /* do not open existing */, size)) {
270 result->valid = false; 270 result->fd = -1;
271 result->auto_close = false;
271 delete shared_memory; 272 delete shared_memory;
272 return; 273 return;
273 } 274 }
274 275
275 result->valid = true; 276 shared_memory->GiveToProcess(0 /* pid, not needed */, result);
276 shared_memory->GiveToProcess(0 /* pid, not needed */, &result->value);
277 277
278 // Keep a copy of the file descriptor around 278 // Keep a copy of the file descriptor around
279 AutoLock locked(allocated_dibs_lock_); 279 AutoLock locked(allocated_dibs_lock_);
280 allocated_dibs_[shared_memory->id()] = dup(result->value.fd); 280 allocated_dibs_[shared_memory->id()] = dup(result->fd);
281 } 281 }
282 282
283 void RenderWidgetHelper::FreeTransportDIB(TransportDIB::Id dib_id) { 283 void RenderWidgetHelper::FreeTransportDIB(TransportDIB::Id dib_id) {
284 AutoLock locked(allocated_dibs_lock_); 284 AutoLock locked(allocated_dibs_lock_);
285 285
286 const std::map<TransportDIB::Id, int>::iterator 286 const std::map<TransportDIB::Id, int>::iterator
287 i = allocated_dibs_.find(dib_id); 287 i = allocated_dibs_.find(dib_id);
288 288
289 if (i != allocated_dibs_.end()) { 289 if (i != allocated_dibs_.end()) {
290 close(i->second); 290 close(i->second);
291 allocated_dibs_.erase(i); 291 allocated_dibs_.erase(i);
292 } else { 292 } else {
293 DLOG(WARNING) << "Renderer asked us to free unknown transport DIB"; 293 DLOG(WARNING) << "Renderer asked us to free unknown transport DIB";
294 } 294 }
295 } 295 }
296 296
297 void RenderWidgetHelper::ClearAllocatedDIBs() { 297 void RenderWidgetHelper::ClearAllocatedDIBs() {
298 for (std::map<TransportDIB::Id, int>::iterator 298 for (std::map<TransportDIB::Id, int>::iterator
299 i = allocated_dibs_.begin(); i != allocated_dibs_.end(); ++i) { 299 i = allocated_dibs_.begin(); i != allocated_dibs_.end(); ++i) {
300 close(i->second); 300 close(i->second);
301 } 301 }
302 302
303 allocated_dibs_.clear(); 303 allocated_dibs_.clear();
304 } 304 }
305 #endif 305 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698