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

Side by Side Diff: base/memory/shared_memory_win.cc

Issue 2847033003: Get rid of SharedMemory::GiveToProcess. (Closed)
Patch Set: Comments from avi. Created 3 years, 7 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "base/memory/shared_memory.h" 5 #include "base/memory/shared_memory.h"
6 6
7 #include <aclapi.h> 7 #include <aclapi.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 // static 178 // static
179 size_t SharedMemory::GetHandleLimit() { 179 size_t SharedMemory::GetHandleLimit() {
180 // Rounded down from value reported here: 180 // Rounded down from value reported here:
181 // http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx 181 // http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx
182 return static_cast<size_t>(1 << 23); 182 return static_cast<size_t>(1 << 23);
183 } 183 }
184 184
185 // static 185 // static
186 SharedMemoryHandle SharedMemory::DuplicateHandle( 186 SharedMemoryHandle SharedMemory::DuplicateHandle(
187 const SharedMemoryHandle& handle) { 187 const SharedMemoryHandle& handle) {
188 DCHECK(handle.BelongsToCurrentProcess()); 188 return handle.Duplicate();
189 HANDLE duped_handle;
190 ProcessHandle process = GetCurrentProcess();
191 BOOL success =
192 ::DuplicateHandle(process, handle.GetHandle(), process, &duped_handle, 0,
193 FALSE, DUPLICATE_SAME_ACCESS);
194 if (success) {
195 base::SharedMemoryHandle handle(duped_handle, GetCurrentProcId());
196 handle.SetOwnershipPassesToIPC(true);
197 return handle;
198 }
199 return SharedMemoryHandle();
200 } 189 }
201 190
202 bool SharedMemory::CreateAndMapAnonymous(size_t size) { 191 bool SharedMemory::CreateAndMapAnonymous(size_t size) {
203 return CreateAnonymous(size) && Map(size); 192 return CreateAnonymous(size) && Map(size);
204 } 193 }
205 194
206 bool SharedMemory::Create(const SharedMemoryCreateOptions& options) { 195 bool SharedMemory::Create(const SharedMemoryCreateOptions& options) {
207 // TODO(bsy,sehr): crbug.com/210609 NaCl forces us to round up 64k here, 196 // TODO(bsy,sehr): crbug.com/210609 NaCl forces us to round up 64k here,
208 // wasting 32k per mapping on average. 197 // wasting 32k per mapping on average.
209 static const size_t kSectionMask = 65536 - 1; 198 static const size_t kSectionMask = 65536 - 1;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 FILE_MAP_READ | SECTION_QUERY, FALSE, 0)) { 334 FILE_MAP_READ | SECTION_QUERY, FALSE, 0)) {
346 return SharedMemoryHandle(); 335 return SharedMemoryHandle();
347 } 336 }
348 SharedMemoryHandle handle = 337 SharedMemoryHandle handle =
349 SharedMemoryHandle(result, base::GetProcId(process)); 338 SharedMemoryHandle(result, base::GetProcId(process));
350 handle.SetOwnershipPassesToIPC(true); 339 handle.SetOwnershipPassesToIPC(true);
351 return handle; 340 return handle;
352 } 341 }
353 342
354 bool SharedMemory::ShareToProcessCommon(ProcessHandle process, 343 bool SharedMemory::ShareToProcessCommon(ProcessHandle process,
355 SharedMemoryHandle* new_handle, 344 SharedMemoryHandle* new_handle) {
356 bool close_self) {
357 *new_handle = SharedMemoryHandle(); 345 *new_handle = SharedMemoryHandle();
358 DWORD access = FILE_MAP_READ | SECTION_QUERY; 346 DWORD access = FILE_MAP_READ | SECTION_QUERY;
359 DWORD options = 0; 347 DWORD options = 0;
360 HANDLE mapped_file = mapped_file_.Get(); 348 HANDLE mapped_file = mapped_file_.Get();
361 HANDLE result; 349 HANDLE result;
362 if (!read_only_) 350 if (!read_only_)
363 access |= FILE_MAP_WRITE; 351 access |= FILE_MAP_WRITE;
364 if (close_self) {
365 // DUPLICATE_CLOSE_SOURCE causes DuplicateHandle to close mapped_file.
366 options = DUPLICATE_CLOSE_SOURCE;
367 HANDLE detached_handle = mapped_file_.Take();
368 DCHECK_EQ(detached_handle, mapped_file);
369 Unmap();
370 }
371
372 if (process == GetCurrentProcess() && close_self) {
373 *new_handle = SharedMemoryHandle(mapped_file, base::GetCurrentProcId());
374 return true;
375 }
376 352
377 if (!::DuplicateHandle(GetCurrentProcess(), mapped_file, process, &result, 353 if (!::DuplicateHandle(GetCurrentProcess(), mapped_file, process, &result,
378 access, FALSE, options)) { 354 access, FALSE, options)) {
379 return false; 355 return false;
380 } 356 }
381 *new_handle = SharedMemoryHandle(result, base::GetProcId(process)); 357 *new_handle = SharedMemoryHandle(result, base::GetProcId(process));
382 new_handle->SetOwnershipPassesToIPC(true); 358 new_handle->SetOwnershipPassesToIPC(true);
383 return true; 359 return true;
384 } 360 }
385 361
386 362
387 void SharedMemory::Close() { 363 void SharedMemory::Close() {
388 mapped_file_.Close(); 364 mapped_file_.Close();
389 } 365 }
390 366
391 SharedMemoryHandle SharedMemory::handle() const { 367 SharedMemoryHandle SharedMemory::handle() const {
392 return SharedMemoryHandle(mapped_file_.Get(), base::GetCurrentProcId()); 368 return SharedMemoryHandle(mapped_file_.Get(), base::GetCurrentProcId());
393 } 369 }
394 370
395 SharedMemoryHandle SharedMemory::TakeHandle() { 371 SharedMemoryHandle SharedMemory::TakeHandle() {
396 SharedMemoryHandle handle(mapped_file_.Take(), base::GetCurrentProcId()); 372 SharedMemoryHandle handle(mapped_file_.Take(), base::GetCurrentProcId());
397 handle.SetOwnershipPassesToIPC(true); 373 handle.SetOwnershipPassesToIPC(true);
398 memory_ = nullptr; 374 memory_ = nullptr;
399 mapped_size_ = 0; 375 mapped_size_ = 0;
400 return handle; 376 return handle;
401 } 377 }
402 378
403 } // namespace base 379 } // namespace base
OLDNEW
« no previous file with comments | « base/memory/shared_memory_posix.cc ('k') | content/browser/renderer_host/render_message_filter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698