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

Side by Side Diff: base/metrics/persistent_memory_allocator.h

Issue 2362713002: Handle failures allocating mapped local memory. (Closed)
Patch Set: use 'enum' instead of 'units' Created 4 years, 2 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 | « no previous file | base/metrics/persistent_memory_allocator.cc » ('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) 2015 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2015 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 #ifndef BASE_METRICS_PERSISTENT_MEMORY_ALLOCATOR_H_ 5 #ifndef BASE_METRICS_PERSISTENT_MEMORY_ALLOCATOR_H_
6 #define BASE_METRICS_PERSISTENT_MEMORY_ALLOCATOR_H_ 6 #define BASE_METRICS_PERSISTENT_MEMORY_ALLOCATOR_H_
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <atomic> 10 #include <atomic>
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 280
281 // Flag set if an allocation has failed because the memory segment was full. 281 // Flag set if an allocation has failed because the memory segment was full.
282 bool IsFull() const; 282 bool IsFull() const;
283 283
284 // Update those "tracking" histograms which do not get updates during regular 284 // Update those "tracking" histograms which do not get updates during regular
285 // operation, such as how much memory is currently used. This should be 285 // operation, such as how much memory is currently used. This should be
286 // called before such information is to be displayed or uploaded. 286 // called before such information is to be displayed or uploaded.
287 void UpdateTrackingHistograms(); 287 void UpdateTrackingHistograms();
288 288
289 protected: 289 protected:
290 enum MemoryType {
291 MEM_EXTERNAL,
292 MEM_MALLOC,
293 MEM_VIRTUAL,
294 MEM_SHARED,
295 MEM_FILE,
296 };
297
298 struct Memory {
299 Memory(void* b, MemoryType t) : base(b), type(t) {}
300
301 void* base;
302 MemoryType type;
303 };
304
305 // Constructs the allocator. Everything is the same as the public allocator
306 // except |memory| which is a structure with additional information besides
307 // the base address.
308 PersistentMemoryAllocator(Memory memory, size_t size, size_t page_size,
309 uint64_t id, base::StringPiece name,
310 bool readonly);
311
290 volatile char* const mem_base_; // Memory base. (char so sizeof guaranteed 1) 312 volatile char* const mem_base_; // Memory base. (char so sizeof guaranteed 1)
313 const MemoryType mem_type_; // Type of memory allocation.
291 const uint32_t mem_size_; // Size of entire memory segment. 314 const uint32_t mem_size_; // Size of entire memory segment.
292 const uint32_t mem_page_; // Page size allocations shouldn't cross. 315 const uint32_t mem_page_; // Page size allocations shouldn't cross.
293 316
294 private: 317 private:
295 struct SharedMetadata; 318 struct SharedMetadata;
296 struct BlockHeader; 319 struct BlockHeader;
297 static const uint32_t kAllocAlignment; 320 static const uint32_t kAllocAlignment;
298 static const Reference kReferenceQueue; 321 static const Reference kReferenceQueue;
299 322
300 // The shared metadata is always located at the top of the memory segment. 323 // The shared metadata is always located at the top of the memory segment.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 : public PersistentMemoryAllocator { 375 : public PersistentMemoryAllocator {
353 public: 376 public:
354 LocalPersistentMemoryAllocator(size_t size, uint64_t id, 377 LocalPersistentMemoryAllocator(size_t size, uint64_t id,
355 base::StringPiece name); 378 base::StringPiece name);
356 ~LocalPersistentMemoryAllocator() override; 379 ~LocalPersistentMemoryAllocator() override;
357 380
358 private: 381 private:
359 // Allocates a block of local memory of the specified |size|, ensuring that 382 // Allocates a block of local memory of the specified |size|, ensuring that
360 // the memory will not be physically allocated until accessed and will read 383 // the memory will not be physically allocated until accessed and will read
361 // as zero when that happens. 384 // as zero when that happens.
362 static void* AllocateLocalMemory(size_t size); 385 static Memory AllocateLocalMemory(size_t size);
363 386
364 // Deallocates a block of local |memory| of the specified |size|. 387 // Deallocates a block of local |memory| of the specified |size|.
365 static void DeallocateLocalMemory(void* memory, size_t size); 388 static void DeallocateLocalMemory(void* memory, size_t size, MemoryType type);
366 389
367 DISALLOW_COPY_AND_ASSIGN(LocalPersistentMemoryAllocator); 390 DISALLOW_COPY_AND_ASSIGN(LocalPersistentMemoryAllocator);
368 }; 391 };
369 392
370 393
371 // This allocator takes a shared-memory object and performs allocation from 394 // This allocator takes a shared-memory object and performs allocation from
372 // it. The memory must be previously mapped via Map() or MapAt(). The allocator 395 // it. The memory must be previously mapped via Map() or MapAt(). The allocator
373 // takes ownership of the memory object. 396 // takes ownership of the memory object.
374 class BASE_EXPORT SharedPersistentMemoryAllocator 397 class BASE_EXPORT SharedPersistentMemoryAllocator
375 : public PersistentMemoryAllocator { 398 : public PersistentMemoryAllocator {
376 public: 399 public:
377 SharedPersistentMemoryAllocator(std::unique_ptr<SharedMemory> memory, 400 SharedPersistentMemoryAllocator(std::unique_ptr<SharedMemory> memory,
378 uint64_t id, 401 uint64_t id,
379 base::StringPiece name, 402 base::StringPiece name,
380 bool read_only); 403 bool read_only);
381 ~SharedPersistentMemoryAllocator() override; 404 ~SharedPersistentMemoryAllocator() override;
382 405
383 SharedMemory* shared_memory() { return shared_memory_.get(); } 406 SharedMemory* shared_memory() { return shared_memory_.get(); }
384 407
385 // Ensure that the memory isn't so invalid that it won't crash when passing it 408 // Ensure that the memory isn't so invalid that it would crash when passing it
386 // to the allocator. This doesn't guarantee the data is valid, just that it 409 // to the allocator. This doesn't guarantee the data is valid, just that it
387 // won't cause the program to abort. The existing IsCorrupt() call will handle 410 // won't cause the program to abort. The existing IsCorrupt() call will handle
388 // the rest. 411 // the rest.
389 static bool IsSharedMemoryAcceptable(const SharedMemory& memory); 412 static bool IsSharedMemoryAcceptable(const SharedMemory& memory);
390 413
391 private: 414 private:
392 std::unique_ptr<SharedMemory> shared_memory_; 415 std::unique_ptr<SharedMemory> shared_memory_;
393 416
394 DISALLOW_COPY_AND_ASSIGN(SharedPersistentMemoryAllocator); 417 DISALLOW_COPY_AND_ASSIGN(SharedPersistentMemoryAllocator);
395 }; 418 };
396 419
397 420
398 #if !defined(OS_NACL) // NACL doesn't support any kind of file access in build. 421 #if !defined(OS_NACL) // NACL doesn't support any kind of file access in build.
399 // This allocator takes a memory-mapped file object and performs allocation 422 // This allocator takes a memory-mapped file object and performs allocation
400 // from it. The allocator takes ownership of the file object. 423 // from it. The allocator takes ownership of the file object.
401 class BASE_EXPORT FilePersistentMemoryAllocator 424 class BASE_EXPORT FilePersistentMemoryAllocator
402 : public PersistentMemoryAllocator { 425 : public PersistentMemoryAllocator {
403 public: 426 public:
404 // A |max_size| of zero will use the length of the file as the maximum 427 // A |max_size| of zero will use the length of the file as the maximum
405 // size. The |file| object must have been already created with sufficient 428 // size. The |file| object must have been already created with sufficient
406 // permissions (read, read/write, or read/write/extend). 429 // permissions (read, read/write, or read/write/extend).
407 FilePersistentMemoryAllocator(std::unique_ptr<MemoryMappedFile> file, 430 FilePersistentMemoryAllocator(std::unique_ptr<MemoryMappedFile> file,
408 size_t max_size, 431 size_t max_size,
409 uint64_t id, 432 uint64_t id,
410 base::StringPiece name, 433 base::StringPiece name,
411 bool read_only); 434 bool read_only);
412 ~FilePersistentMemoryAllocator() override; 435 ~FilePersistentMemoryAllocator() override;
413 436
414 // Ensure that the file isn't so invalid that it won't crash when passing it 437 // Ensure that the file isn't so invalid that it would crash when passing it
415 // to the allocator. This doesn't guarantee the file is valid, just that it 438 // to the allocator. This doesn't guarantee the file is valid, just that it
416 // won't cause the program to abort. The existing IsCorrupt() call will handle 439 // won't cause the program to abort. The existing IsCorrupt() call will handle
417 // the rest. 440 // the rest.
418 static bool IsFileAcceptable(const MemoryMappedFile& file, bool read_only); 441 static bool IsFileAcceptable(const MemoryMappedFile& file, bool read_only);
419 442
420 private: 443 private:
421 std::unique_ptr<MemoryMappedFile> mapped_file_; 444 std::unique_ptr<MemoryMappedFile> mapped_file_;
422 445
423 DISALLOW_COPY_AND_ASSIGN(FilePersistentMemoryAllocator); 446 DISALLOW_COPY_AND_ASSIGN(FilePersistentMemoryAllocator);
424 }; 447 };
425 #endif // !defined(OS_NACL) 448 #endif // !defined(OS_NACL)
426 449
427 } // namespace base 450 } // namespace base
428 451
429 #endif // BASE_METRICS_PERSISTENT_MEMORY_ALLOCATOR_H_ 452 #endif // BASE_METRICS_PERSISTENT_MEMORY_ALLOCATOR_H_
OLDNEW
« no previous file with comments | « no previous file | base/metrics/persistent_memory_allocator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698