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

Unified Diff: third_party/tcmalloc/chromium/src/pagemap.h

Issue 9320005: [NOT TO COMMIT!] Replace third_party/tcmalloc/chromium with tcmalloc r136 (the latest). (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Created 8 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/tcmalloc/chromium/src/page_heap_allocator.h ('k') | third_party/tcmalloc/chromium/src/pprof » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/tcmalloc/chromium/src/pagemap.h
diff --git a/third_party/tcmalloc/chromium/src/pagemap.h b/third_party/tcmalloc/chromium/src/pagemap.h
index 0db01c4bc8bca5d2224446693e78515e4475ff00..27cb3da050f23c46f3a058fefe66079fab41071b 100644
--- a/third_party/tcmalloc/chromium/src/pagemap.h
+++ b/third_party/tcmalloc/chromium/src/pagemap.h
@@ -56,12 +56,6 @@
#else
#include <sys/types.h>
#endif
-#ifdef WIN32
-// TODO(jar): This is not needed when TCMalloc_PageMap1_LazyCommit has an API
-// supporting commit and reservation of memory.
-#include "common.h"
-#endif
-
#include "internal_logging.h" // for ASSERT
// Single-level array
@@ -120,201 +114,6 @@ class TCMalloc_PageMap1 {
}
};
-#ifdef WIN32
-// Lazy commit, single-level array.
-// Very similar to PageMap1, except the page map is only committed as needed.
-// Since we don't return memory to the OS, the committed portion of the map will
-// only grow, and we'll only be called to Ensure when we really grow the heap.
-// We maintain a bit map to help us deduce if we've already committed a range
-// in our map.
-template <int BITS>
-class TCMalloc_PageMap1_LazyCommit {
- private:
- // Dimension of our page map array_.
- static const int LENGTH = 1 << BITS;
-
- // The page map array that sits in reserved virtual space. Pages of this
- // array are committed as they are needed. For each page of virtual memory,
- // we potentially have a pointer to a span instance.
- void** array_;
-
- // A bit vector that allows us to deduce what pages in array_ are committed.
- // Note that 2^3 = 8 bits per char, and hence the use of the magical "3" in
- // the array range gives us the effective "divide by 8".
- char committed_[sizeof(void*) << (BITS - kPageShift - 3)];
-
- // Given an |index| into |array_|, find the page number in |array_| that holds
- // that element.
- size_t ContainingPage(size_t index) const {
- return (index * sizeof(*array_)) >> kPageShift;
- }
-
- // Find out if the given page_num index in array_ is in committed memory.
- bool IsCommitted(size_t page_num) const {
- return committed_[page_num >> 3] & (1 << (page_num & 0x7));
- }
-
- // Remember that the given page_num index in array_ is in committed memory.
- void SetCommitted(size_t page_num) {
- committed_[page_num >> 3] |= (1 << (page_num & 0x7));
- }
-
- public:
- typedef uintptr_t Number;
-
- explicit TCMalloc_PageMap1_LazyCommit(void* (*allocator)(size_t)) {
- // TODO(jar): We need a reservation function, but current API to this class
- // only provides an allocator.
- // Get decommitted memory. We will commit as necessary.
- array_ = reinterpret_cast<void**>(VirtualAlloc(
- NULL, sizeof(*array_) << BITS, MEM_RESERVE, PAGE_READWRITE));
-
- // Make sure we divided LENGTH evenly.
- ASSERT(sizeof(committed_) * 8 == (LENGTH * sizeof(*array_)) >> kPageShift);
- // Indicate that none of the pages of array_ have been committed yet.
- memset(committed_, 0, sizeof(committed_));
- }
-
- // Ensure that the map contains initialized and committed entries in array_ to
- // describe pages "x .. x+n-1".
- // Returns true if successful, false if we could not ensure this.
- // If we have to commit more memory in array_ (which also clears said memory),
- // then we'll set some of the bits in committed_ to remember this fact.
- // Only the bits of committed_ near end-points for calls to Ensure() are ever
- // set, as the calls to Ensure() will never have overlapping ranges other than
- // at their end-points.
- //
- // Example: Suppose the OS allocates memory in pages including 40...50, and
- // later the OS allocates memory in pages 51...83. When the first allocation
- // of 40...50 is observed, then Ensure of (39,51) will be called. The range
- // shown in the arguments is extended so that tcmalloc can look to see if
- // adjacent pages are part of a span that can be coaleced. Later, when pages
- // 51...83 are allocated, Ensure() will be called with arguments (50,84),
- // broadened again for the same reason.
- //
- // After the above, we would NEVER get a call such as Ensure(45,60), as that
- // overlaps with the interior of prior ensured regions. We ONLY get an Ensure
- // call when the OS has allocated memory, and since we NEVER give memory back
- // to the OS, the OS can't possible allocate the same region to us twice, and
- // can't induce an Ensure() on an interior of previous Ensure call.
- //
- // Also note that OS allocations are NOT guaranteed to be consecutive (there
- // may be "holes" where code etc. uses the virtual addresses), or to appear in
- // any order, such as lowest to highest, or vice versa (as other independent
- // allocation systems in the process may be performing VirtualAllocations and
- // VirtualFrees asynchronously.)
- bool Ensure(Number x, size_t n) {
- if (n > LENGTH - x)
- return false; // We won't Ensure mapping for last pages in memory.
- ASSERT(n > 0);
-
- // For a given page number in memory, calculate what page in array_ needs to
- // be memory resident. Note that we really only need a few bytes in array_
- // for each page of virtual space we have to map, but we can only commit
- // whole pages of array_. For instance, a 4K page of array_ has about 1k
- // entries, and hence can map about 1K pages, or a total of about 4MB
- // typically. As a result, it is possible that the first entry in array_,
- // and the n'th entry in array_, will sit in the same page of array_.
- size_t first_page = ContainingPage(x);
- size_t last_page = ContainingPage(x + n - 1);
-
- // Check at each boundary, to see if we need to commit at that end. Some
- // other neighbor may have already forced us to commit at either or both
- // boundaries.
- if (IsCommitted(first_page)) {
- if (first_page == last_page) return true;
- ++first_page;
- if (IsCommitted(first_page)) {
- if (first_page == last_page) return true;
- ++first_page;
- }
- }
-
- if (IsCommitted(last_page)) {
- if (first_page == last_page) return true;
- --last_page;
- if (IsCommitted(last_page)) {
- if (first_page == last_page) return true;
- --last_page;
- }
- }
-
- ASSERT(!IsCommitted(last_page));
- ASSERT(!IsCommitted(first_page));
-
- void* start = reinterpret_cast<char*>(array_) + (first_page << kPageShift);
- size_t length = (last_page - first_page + 1) << kPageShift;
-
-#ifndef NDEBUG
- // Validate we are committing new sections, and hence we're not clearing any
- // existing data.
- MEMORY_BASIC_INFORMATION info = {0};
- size_t result = VirtualQuery(start, &info, sizeof(info));
- ASSERT(result);
- ASSERT(0 == (info.State & MEM_COMMIT)); // It starts with uncommitted.
- ASSERT(info.RegionSize >= length); // Entire length is uncommitted.
-#endif
-
- // TODO(jar): We need a commit that automatically tallies metadata_bytes.
- TCMalloc_SystemCommit(start, length);
- tcmalloc::increment_metadata_system_bytes(length);
-
-#ifndef NDEBUG
- result = VirtualQuery(start, &info, sizeof(info));
- ASSERT(result);
- ASSERT(0 != (info.State & MEM_COMMIT)); // Now it is committed.
- ASSERT(info.RegionSize >= length); // Entire length is committed.
-#endif
-
- // As noted in the large comment/example describing this method, we will
- // never be called with a range of pages very much inside this |first_page|
- // to |last_page| range.
- // As a result, we only need to set bits for each end of that range, and one
- // page inside each end.
- SetCommitted(first_page);
- if (first_page < last_page) {
- SetCommitted(last_page);
- SetCommitted(first_page + 1); // These may be duplicates now.
- SetCommitted(last_page - 1);
- }
-
- return true;
- }
-
- // This is a premature call to get all the meta-memory allocated, so as to
- // avoid virtual space fragmentation. Since we pre-reserved all memory, we
- // don't need to do anything here (we won't fragment virtual space).
- void PreallocateMoreMemory() {}
-
- // Return the current value for KEY. Returns NULL if not yet set,
- // or if k is out of range.
- void* get(Number k) const {
- if ((k >> BITS) > 0) {
- return NULL;
- }
- return array_[k];
- }
-
- // REQUIRES "k" is in range "[0,2^BITS-1]".
- // REQUIRES "k" has been ensured before.
- //
- // Sets the value for KEY.
- void set(Number k, void* v) {
- array_[k] = v;
- }
- // Return the first non-NULL pointer found in this map for
- // a page number >= k. Returns NULL if no such number is found.
- void* Next(Number k) const {
- while (k < (1 << BITS)) {
- if (array_[k] != NULL) return array_[k];
- k++;
- }
- return NULL;
- }
-};
-#endif // WIN32
-
-
// Two-level radix tree
template <int BITS>
class TCMalloc_PageMap2 {
« no previous file with comments | « third_party/tcmalloc/chromium/src/page_heap_allocator.h ('k') | third_party/tcmalloc/chromium/src/pprof » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698