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); | |
Nico
2017/05/02 15:58:45
Oh, you just moved this around. Nits still apply,
| |
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 |