| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |