OLD | NEW |
---|---|
1 // Copyright (c) 2005, Google Inc. | 1 // Copyright (c) 2005, Google Inc. |
2 // All rights reserved. | 2 // All rights reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
159 committed_[page_num >> 3] |= (1 << (page_num & 0x7)); | 159 committed_[page_num >> 3] |= (1 << (page_num & 0x7)); |
160 } | 160 } |
161 | 161 |
162 public: | 162 public: |
163 typedef uintptr_t Number; | 163 typedef uintptr_t Number; |
164 | 164 |
165 explicit TCMalloc_PageMap1_LazyCommit(void* (*allocator)(size_t)) { | 165 explicit TCMalloc_PageMap1_LazyCommit(void* (*allocator)(size_t)) { |
166 // TODO(jar): We need a reservation function, but current API to this class | 166 // TODO(jar): We need a reservation function, but current API to this class |
167 // only provides an allocator. | 167 // only provides an allocator. |
168 // Get decommitted memory. We will commit as necessary. | 168 // Get decommitted memory. We will commit as necessary. |
169 size_t size = sizeof(*array_) << BITS; | |
169 array_ = reinterpret_cast<void**>(VirtualAlloc( | 170 array_ = reinterpret_cast<void**>(VirtualAlloc( |
170 NULL, sizeof(*array_) << BITS, MEM_RESERVE, PAGE_READWRITE)); | 171 NULL, size, MEM_RESERVE, PAGE_READWRITE)); |
172 tcmalloc::update_metadata_system_bytes(size); | |
173 tcmalloc::update_metadata_unmapped_bytes(size); | |
171 | 174 |
172 // Make sure we divided LENGTH evenly. | 175 // Make sure we divided LENGTH evenly. |
173 ASSERT(sizeof(committed_) * 8 == (LENGTH * sizeof(*array_)) >> kPageShift); | 176 ASSERT(sizeof(committed_) * 8 == (LENGTH * sizeof(*array_)) >> kPageShift); |
174 // Indicate that none of the pages of array_ have been committed yet. | 177 // Indicate that none of the pages of array_ have been committed yet. |
175 memset(committed_, 0, sizeof(committed_)); | 178 memset(committed_, 0, sizeof(committed_)); |
176 } | 179 } |
177 | 180 |
178 // Ensure that the map contains initialized and committed entries in array_ to | 181 // Ensure that the map contains initialized and committed entries in array_ to |
179 // describe pages "x .. x+n-1". | 182 // describe pages "x .. x+n-1". |
180 // Returns true if successful, false if we could not ensure this. | 183 // Returns true if successful, false if we could not ensure this. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
248 #ifndef NDEBUG | 251 #ifndef NDEBUG |
249 // Validate we are committing new sections, and hence we're not clearing any | 252 // Validate we are committing new sections, and hence we're not clearing any |
250 // existing data. | 253 // existing data. |
251 MEMORY_BASIC_INFORMATION info = {0}; | 254 MEMORY_BASIC_INFORMATION info = {0}; |
252 size_t result = VirtualQuery(start, &info, sizeof(info)); | 255 size_t result = VirtualQuery(start, &info, sizeof(info)); |
253 ASSERT(result); | 256 ASSERT(result); |
254 ASSERT(0 == (info.State & MEM_COMMIT)); // It starts with uncommitted. | 257 ASSERT(0 == (info.State & MEM_COMMIT)); // It starts with uncommitted. |
255 ASSERT(info.RegionSize >= length); // Entire length is uncommitted. | 258 ASSERT(info.RegionSize >= length); // Entire length is uncommitted. |
256 #endif | 259 #endif |
257 | 260 |
258 // TODO(jar): We need a commit that automatically tallies metadata_bytes. | 261 // TODO(jar): We need a commit that automatically tallies metadata_bytes. |
jar (doing other things)
2012/06/04 04:31:28
Should we remove this TODO now?
kaiwang
2012/06/04 18:30:52
Done.
It's not exactly what I did. But I also feel
| |
259 TCMalloc_SystemCommit(start, length); | 262 TCMalloc_SystemCommit(start, length); |
260 tcmalloc::increment_metadata_system_bytes(length); | 263 tcmalloc::update_metadata_unmapped_bytes(-length); |
261 | 264 |
262 #ifndef NDEBUG | 265 #ifndef NDEBUG |
263 result = VirtualQuery(start, &info, sizeof(info)); | 266 result = VirtualQuery(start, &info, sizeof(info)); |
264 ASSERT(result); | 267 ASSERT(result); |
265 ASSERT(0 != (info.State & MEM_COMMIT)); // Now it is committed. | 268 ASSERT(0 != (info.State & MEM_COMMIT)); // Now it is committed. |
266 ASSERT(info.RegionSize >= length); // Entire length is committed. | 269 ASSERT(info.RegionSize >= length); // Entire length is committed. |
267 #endif | 270 #endif |
268 | 271 |
269 // As noted in the large comment/example describing this method, we will | 272 // As noted in the large comment/example describing this method, we will |
270 // never be called with a range of pages very much inside this |first_page| | 273 // never be called with a range of pages very much inside this |first_page| |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
515 } | 518 } |
516 // Advance to next interior entry | 519 // Advance to next interior entry |
517 k = ((k >> LEAF_BITS) + 1) << LEAF_BITS; | 520 k = ((k >> LEAF_BITS) + 1) << LEAF_BITS; |
518 } | 521 } |
519 } | 522 } |
520 return NULL; | 523 return NULL; |
521 } | 524 } |
522 }; | 525 }; |
523 | 526 |
524 #endif // TCMALLOC_PAGEMAP_H_ | 527 #endif // TCMALLOC_PAGEMAP_H_ |
OLD | NEW |