| OLD | NEW |
| 1 // Copyright (c) 2008, Google Inc. | 1 // Copyright (c) 2008, 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 inline Span* GetDescriptor(PageID p) const { | 114 inline Span* GetDescriptor(PageID p) const { |
| 115 return reinterpret_cast<Span*>(pagemap_.get(p)); | 115 return reinterpret_cast<Span*>(pagemap_.get(p)); |
| 116 } | 116 } |
| 117 | 117 |
| 118 // Dump state to stderr | 118 // Dump state to stderr |
| 119 void Dump(TCMalloc_Printer* out); | 119 void Dump(TCMalloc_Printer* out); |
| 120 | 120 |
| 121 // Return number of bytes allocated from system | 121 // Return number of bytes allocated from system |
| 122 inline uint64_t SystemBytes() const { return system_bytes_; } | 122 inline uint64_t SystemBytes() const { return system_bytes_; } |
| 123 | 123 |
| 124 inline uint64_t CommittedBytes() const { return committed_bytes_; } |
| 125 |
| 124 // Return number of free bytes in heap | 126 // Return number of free bytes in heap |
| 125 uint64_t FreeBytes() const { | 127 uint64_t FreeBytes() const { |
| 126 return (static_cast<uint64_t>(free_pages_) << kPageShift); | 128 return (static_cast<uint64_t>(free_pages_) << kPageShift); |
| 127 } | 129 } |
| 128 | 130 |
| 129 bool Check(); | 131 bool Check(); |
| 130 // Like Check() but does some more comprehensive checking. | 132 // Like Check() but does some more comprehensive checking. |
| 131 bool CheckExpensive(); | 133 bool CheckExpensive(); |
| 132 bool CheckList(Span* list, Length min_pages, Length max_pages, | 134 bool CheckList(Span* list, Length min_pages, Length max_pages, |
| 133 int freelist); // ON_NORMAL_FREELIST or ON_RETURNED_FREELIST | 135 int freelist); // ON_NORMAL_FREELIST or ON_RETURNED_FREELIST |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 | 183 |
| 182 // Array mapping from span length to a doubly linked list of free spans | 184 // Array mapping from span length to a doubly linked list of free spans |
| 183 SpanList free_[kMaxPages]; | 185 SpanList free_[kMaxPages]; |
| 184 | 186 |
| 185 // Number of pages kept in free lists | 187 // Number of pages kept in free lists |
| 186 uintptr_t free_pages_; | 188 uintptr_t free_pages_; |
| 187 | 189 |
| 188 // Bytes allocated from system | 190 // Bytes allocated from system |
| 189 uint64_t system_bytes_; | 191 uint64_t system_bytes_; |
| 190 | 192 |
| 193 // Bytes committed, always <= system_bytes_. |
| 194 uint64_t committed_bytes_; |
| 195 |
| 191 bool GrowHeap(Length n); | 196 bool GrowHeap(Length n); |
| 192 | 197 |
| 193 // REQUIRES: span->length >= n | 198 // REQUIRES: span->length >= n |
| 194 // REQUIRES: span->location != IN_USE | 199 // REQUIRES: span->location != IN_USE |
| 195 // Remove span from its free list, and move any leftover part of | 200 // Remove span from its free list, and move any leftover part of |
| 196 // span into appropriate free lists. Also update "span" to have | 201 // span into appropriate free lists. Also update "span" to have |
| 197 // length exactly "n" and mark it as non-free so it can be returned | 202 // length exactly "n" and mark it as non-free so it can be returned |
| 198 // to the client. After all that, decrease free_pages_ by n and | 203 // to the client. After all that, decrease free_pages_ by n and |
| 199 // return span. | 204 // return span. |
| 200 Span* Carve(Span* span, Length n); | 205 Span* Carve(Span* span, Length n); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 213 // Commit the span. | 218 // Commit the span. |
| 214 void CommitSpan(Span* span); | 219 void CommitSpan(Span* span); |
| 215 | 220 |
| 216 // Decommit the span. | 221 // Decommit the span. |
| 217 void DecommitSpan(Span* span); | 222 void DecommitSpan(Span* span); |
| 218 | 223 |
| 219 // Incrementally release some memory to the system. | 224 // Incrementally release some memory to the system. |
| 220 // IncrementalScavenge(n) is called whenever n pages are freed. | 225 // IncrementalScavenge(n) is called whenever n pages are freed. |
| 221 void IncrementalScavenge(Length n); | 226 void IncrementalScavenge(Length n); |
| 222 | 227 |
| 228 // Releases all memory held in the given list's 'normal' freelist and adds |
| 229 // it to the 'released' freelist. |
| 230 void ReleaseFreeList(Span* list, Span* returned); |
| 231 |
| 223 // Number of pages to deallocate before doing more scavenging | 232 // Number of pages to deallocate before doing more scavenging |
| 224 int64_t scavenge_counter_; | 233 int64_t scavenge_counter_; |
| 225 | 234 |
| 226 // Index of last free list we scavenged | 235 // Index of last free list we scavenged |
| 227 int scavenge_index_; | 236 int scavenge_index_; |
| 228 }; | 237 }; |
| 229 | 238 |
| 230 } // namespace tcmalloc | 239 } // namespace tcmalloc |
| 231 | 240 |
| 232 #endif // TCMALLOC_PAGE_HEAP_H_ | 241 #endif // TCMALLOC_PAGE_HEAP_H_ |
| OLD | NEW |